在 java 中创建带有标头、有效负载和签名的 JWT
Posted
技术标签:
【中文标题】在 java 中创建带有标头、有效负载和签名的 JWT【英文标题】:creating JWT with header, payload and signature in java 【发布时间】:2019-02-11 15:52:10 【问题描述】:我想为给定的标头、有效负载和密钥生成 jwt。
我的标题;
“类型”:“智威汤逊”, “alg”:“HS256”
我的有效载荷;
"iss": "46181382", "ist": "项目", "iat": 1536225835, “exp”:1536226835, “jti”:“abcdefghi”
我的密钥; 105446462291847624638651561dfg156148df941819498
这是我的 java 代码,它已经创建了一个 jwt。但我认为密钥没有包含在其中。因为一旦我在 tokbox api 调用中将该 jwt 用作我的标头,我就会得到以下响应。
"code": -1,
"message": "Invalid signature",
"description": "Invalid signature"
这里是代码;
byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary("105446462291847624638651561dfg156148df941819498");
Key signingKey = new SecretKeySpec(apiKeySecretBytes, SignatureAlgorithm.HS256.getJcaName());
Map map = new HashMap<String,Object>();
map.put("alg","HS256");
map.put("typ","JWT");
String jwt = Jwts.builder()
.setHeader(map)
.claim("iss", "46181382")
.claim("ist", "project")
.claim("iat", currentTimeSeconds())
.claim("exp", expireTimeSeconds())
.claim("jti", "abcdefghi")
.signWith(SignatureAlgorithm.HS256,signingKey)
.compact();
currentTimeSeconds() 和 expireTimeSeconds() 是我自己写的方法。我相信他们没有问题。 我不确定这个 .signWith() 方法。
谁能帮帮我。
谢谢。
【问题讨论】:
检查密钥是否对您的项目有效 这看起来不像是 opentok 机密,它们通常包含字母。您只是想生成一个 opentok 令牌吗?如果是这样的话,有一个 Java SDK 可以提供帮助 tokbox.com/developer/guides/create-token/java 也不要在 *** 上发布任何密钥,有人可以使用它们。 您的过期时间似乎是发布时间之后的 7 分钟。根据 OpenTok 文档,过期时间不能超过发布时间后的 5 分钟。那可能是你的问题。 tokbox.com/blog/… @benjaminc 是的,它是一个有效的密钥。我想知道这段代码是否正确? @maikthomas 我想生成 jwt。我已经生成了会话 ID 和令牌。这也不是我真正的密钥。我刚刚添加了一些数字。 【参考方案1】:我找到了答案。在上面的代码中,密钥应该作为 Base64URL 编码值给出。这意味着第一行应该改变如下。
byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary("MTA1NDQ2NDYyMjkxODQ3NjI0NjM4NjUxNTYxZGZnMTU2MTQ4ZGY5NDE4MTk0OTg=");
【讨论】:
以上是关于在 java 中创建带有标头、有效负载和签名的 JWT的主要内容,如果未能解决你的问题,请参考以下文章