java - 如何使用 JJWT 从有效负载中获取自定义字段

标签 java jwt claims jjwt

好的,我在生成 JWT 时向有效负载添加了几个自定义声明,并且我可以在我的前端 (javascript) 中很好地提取它们。然后,我让我的 javascript 向微服务发送一个 ajax 调用,并将 JWT 与其一起传递。我想从微服务中的 JWT 中获取我的自定义声明。我正在执行以下操作:

Claims claims = Jwts.parser().setSigningKey(Vars.SECRET_KEY).parseClaimsJws(token).getBody();
 User user = claims.get("customuser", User.class);

并抛出异常。

io.jsonwebtoken.RequiredTypeException: Expected value to be of type: class net.netdatacorp.netdauth.model.User, but was class java.util.LinkedHashMap
    at io.jsonwebtoken.impl.DefaultClaims.get(DefaultClaims.java:128)

以下是我的自定义声明在前端的 JWT 检查器中的数据显示方式。

{
  jti: "83bffbad-7d36-4370-9332-21a84f2a3dce",
  iat: 1498241526,
  sub: "test",
  iss: "www.test.net",
  customuser: {
    userId: 1,
    userCd: "TMM",
    firstNm: "Testy",
    lastNm: "McTesty",
    userNm: "test",
    emailAddress: "jacob@test.net",
    active: true,
    createdDt: 1491355712000,
    createdByUserId: 0,
    lastUpdateDt: 1498199278000,
    lastUpdateByUserId: 0,
    lastLoginDt: 1484928016000
  }
}

我缺少什么才能取消我的自定义声明?

最佳答案

我们可以使用 Jackson 的对象映射器将 Claims(这是一个 Map<String, Object>)转换为我们的自定义声明 java 对象。

final ObjectMapper mapper = new ObjectMapper();

Claims jwsMap = Jwts.parser()
       .setSigningKey("SECRET")
       .parseClaimsJws("jwt")
       .getBody();
return mapper.convertValue(jwsMap, MyCustomClaim.class);

同时添加该代码以 try catch 以确保我们处理丢失/篡改签名的情况。

关于java - 如何使用 JJWT 从有效负载中获取自定义字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44728138/

相关文章:

java - Spring Batch 从外部类停止作业执行

javascript - 如何将 Vue.js 前端与 java 后端连接起来?

c# - ASP.NET Core 2.0 中缺少声明转换支持

permissions - 创建自定义声明类型的最佳实践

java - 我无法使用 BlueJ 打印简单的 JAVA 代码,在 CMD 中工作

Java "File"有效,但 "InputStream"无效

rest - 具有预身份验证的Grails中的JWT token 生成

node.js - NodeJS 访问 token 与刷新 token

python - 如何将 JSON Web token (JWT) 传递给获取请求

azure - 是否可以让 Azure AD B2C 在对自定义声明 REST API 的调用中包含 aud?