在Java中创建JWT的头部、载荷和签名

3
我希望为给定的头部、负载和密钥生成一个JWT。
我的头部:
{ "typ": "JWT", "alg": "HS256" }
我的负载:
{ "iss": "46181382", "ist": "project", "iat": 1536225835, "exp": 1536226835, "jti": "abcdefghi" }
我的密钥:
105446462291847624638651561dfg156148df941819498
这是我的Java代码,它已经创建了一个JWT。但我认为密钥没有被包含在其中。因为一旦我将该JWT用作Tokbox API调用中的头部,我会收到以下响应。
 {
"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()方法是否正确。

请问有人能帮我吗?

谢谢。


检查密钥是否适用于您的项目。 - undefined
那看起来不像是一个 OpenTok 密钥,它们通常包含字母。 你只是想生成一个 OpenTok 令牌吗?如果是的话,有一个 Java SDK 可以帮助你 https://tokbox.com/developer/guides/create-token/java/ 另外,请不要在 StackOverflow 上发布任何秘密密钥,否则可能会被他人利用。 - undefined
@benjaminc 是的,这是一个有效的密钥。我想知道这段代码是否正确? - undefined
@maikthomas 我想要生成JWT。我已经生成了会话ID和令牌。这也不是我的真实密钥,只是添加了一些数字。 - undefined
大家好..我找到了答案。非常感谢你们对我的问题的关注。 - undefined
显示剩余3条评论
1个回答

0
我找到了答案。在上面的代码中,密钥应该以Base64URL编码的形式给出。这意味着第一行应该改为以下内容。
byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary("MTA1NDQ2NDYyMjkxODQ3NjI0NjM4NjUxNTYxZGZnMTU2MTQ4ZGY5NDE4MTk0OTg=");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接