在 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的主要内容,如果未能解决你的问题,请参考以下文章

生成 JWT 表单头和有效负载

VBA:如何根据 VBA 中的私钥生成带有 RS256 的签名?

如何在scrapy中发送带有标头和有效负载的Post请求

带有自定义标头和声明的 jsonwebtoken

无法使用 google kms 生成有效的 jwt 签名

在 JavaScript 中创建压缩的 JWT 有效负载