微服务安全:JWT与MicroProfileJWT的应用
立即解锁
发布时间: 2025-08-11 17:07:26 阅读量: 2 订阅数: 4 


Go微服务安全:JWT与OAuth2的整合方案.pdf
# 微服务安全:JWT 与 MicroProfile JWT 的应用
## 1. JWT 签名验证
JWT(Json Web Tokens)是一种用于在各方之间安全传输信息的开放标准(RFC 7519)。每个 JWT 都使用头部 `alg` 声明中定义的算法进行签名,以确保其未被篡改。验证 JWT 签名的一种简单方法是将原始令牌声明的内容粘贴到 [https://jwt.io/#encoded-jwt](https://jwt.io/#encoded-jwt) 提供的表单中。具体步骤如下:
1. 将 JWT 粘贴到编码表单中,JWT 头部和有效负载部分将显示声明值。
2. JWT 头部:头部声明(尽管不一定是其值)将与特定声明匹配。
3. JWT 有效负载:声明(尽管不一定是其值)将与特定声明匹配。
4. 由于未提供公钥,签名未经验证。
要获取公钥,可运行以下命令:
```bash
scripts/createpem.sh
```
### 1.1 JWT 有效负载声明
以下是 JWT 有效负载中一些重要的声明:
| 声明 | 描述 |
| --- | --- |
| `typ` | 声明令牌的媒体类型。 |
| `iss*` | MicroProfile JWT 的颁发者。 |
| `sub*` | 标识作为 JWT 主题的主体。 |
| `exp*` | JWT 过期时间,自 1970 年 1 月 1 日起的秒数,过期后 JWT 无效。 |
| `iat*` | JWT 颁发时间,自 1970 年 1 月 1 日起的秒数。 |
| `jti*` | JWT 唯一标识符,可用于防止 JWT 被重放。 |
| `upn*` | 一个人类可读的 MicroProfile JWT 自定义声明,用于在所有访问该令牌的服务中唯一标识令牌的主题或用户主体。如果此声明缺失,MicroProfile JWT 将回退到 `preferred_username` 声明;如果 `preferred_username` 也缺失,则使用 `sub` 声明。 |
| `groups*` | MicroProfile JWT 自定义声明,列出主体所属的组。 |
### 1.2 获取公钥
运行上述命令后,将输出公钥,格式如下:
```
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjJ/GYpCkgfYT1HYpa96AP8djbKiv25Yh
VlZcHcIt2QX4VZPJM/qntF2m7ubPSz3zHHNQUOWYl+3xIo4EFfCcTPTBgL0aSlCsuT5+0RuajsFj
ejLGa19p3eKuBjtB0buqI4SbxpitvZj4L4beBdFj+r2NZZNxeFFMrd9lORW3b4cUmk8tS6ZrgbTK
Ij3adjlVMYHOkGQNNGBf1KJkdbi8UQtXaATuyFHiQCCYY/ENWGGomu+dXqvqnRRsdWBndsUcCNe+
NPwT1z3lbfYoXkldWFVvXjBnNme/f8mCMWuKBz4fGZUkt7Sdc5FPnFpsbT+0inarxIov3puDxHbB
gNJ9xwIDAQAB
-----END PUBLIC KEY-----
```
将此公钥粘贴到 jwt.io 表单的公钥字段中,即可验证签名。
### 1.3 注意事项
上述公钥仅适用于特定的令牌,不同安装的令牌和公钥会有所不同。尝试使用上述公钥验证其他安装的令牌将失败。
## 2. 使用 MicroProfile JWT 保护交易服务
在了解了 JWT 和 MicroProfile JWT API 后,下一步是使用 MicroProfile JWT 保护交易服务。具体步骤如下:
### 2.1 添加扩展
在编写代码之前,添加 `quarkus-smallrye-jwt` 扩展:
```bash
cd transaction_service
mvn quarkus:add-extension -Dextensions="io.quarkus:quarkus-smallrye-jwt"
# 如果交易服务未运行,启动它
mvn clean quarkus:dev -Ddebug=5006
```
### 2.2 配置公钥
更新 `application.properties` 文件,添加公钥和令牌颁发者信息:
```properties
# Configure MicroProfile JWT
mp.jwt.verify.publickey=<INSERT PUBLIC KEY HERE>
mp.jwt.verify.issuer=http://keycloak.local/auth/realms/bank
```
注意,公钥应去除 `BEGIN PUBLIC KEY` 和 `END PUBLIC KEY` 行,仅保留 Base64 编码的字符串。
### 2.3 添加安全方法
在 `TransactionResource.java` 中添加一个安全的 REST 方法端点,用于测试 JWT 是否允许方法访问:
```java
@GET
@RolesAllowed("customer")
@Path("/jwt-secure/{acctnumber}/balance")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response jwtGetBalance(
@PathParam("acctnumber") Long accountNumber) {
return getBalance(accountNumber);
}
```
此方法仅允许 `customer` 角色的用户访问。
### 2.4 测试端点访问
最后,访问端点以验证访问权限:
```bash
# 在新终端窗口中启动账户服务(如果未运行)
cd account-service
mvn quarkus:dev
# 在新窗口中重启交易服务
cd transaction-service
mvn clean quarkus:dev -Ddebug=5006
# 在新窗口中获取令牌
TOKEN=`scripts/gettoken.sh`
TRANSACTION_URL=http://localhost:8088
curl -i \
-H "Accept: application/js
```
0
0
复制全文
相关推荐









