如何使用秘密的base64编码在Java中创建JWT

时间:2019-09-21 23:14:58

标签: jwt jwt-auth

使用在线JWT调试器对JWT令牌进行编码和解码,我创建了这个简单的令牌

https://jwt.io/#debugger-io?token=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6IlNvbHIifQ.5T7L_L1MPfQ_5FjKGa1fTPqrzwK4bNSM812nW6oyjb8

编码令牌的秘诀是
qwertypassword

标题为{ "alg": "HS256"}

有效载荷为{ "sub": "admin", "aud": "Solr"}

当您使用未经base64编码的秘密进行编码时,它将生成JWT eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6IlNvbHIifQ.5T7L_L1MPfQ_5FjKGa1fTPqrzwK4bNSM812nW6oyjb8

当秘密通过base64编码后,它将生成JWT eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6IlNvbHIifQ.SWCJDd6B_m7xr_puQH-wgbxvXyJYXH9lTpldOU0eQKc

这是在机密未经过base64编码时生成JWT的Java代码。

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
public class JWTEncodeTest {
    public static void main(String[] args) {
        try {
            String secretkey="qwertypassword";

            //The JWT signature algorithm we will be using to sign the token
            String jwtToken = Jwts.builder()
                .setSubject("admin")
                .setAudience("Solr")
                .signWith(SignatureAlgorithm.HS256,secretkey.getBytes()).compact();

            System.out.println("jwtToken=");
            System.out.println(jwtToken);
        } catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
    }
}

我在此Java代码中缺少什么,以使用秘密的base64编码生成JWT值的JWT生成JWT

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6IlNvbHIifQ.SWCJDd6B_m7xr_puQH-wgbxvXyJYXH9lTpldOU0eQKc

2 个答案:

答案 0 :(得分:0)

jwt.iosecret base64 encoded的含义实际上是,它将您提供的机密视为经过base64编码,因此在实际使用之前先对其进行解码。关键不是创建任何不同的东西,而只是在对秘密进行编码时对其进行解码。

您使用的秘密很明显是未编码形式:

  

qwerty密码

当您对base64进行编码时,例如借助https://www.base64encode.org/,您可以将其作为 base64编码值:

  

cXdlcnR5cGFzc3dvcmQ =

jwt.io上,您可以使用两种形式:

  • 第一个,未编码base64 encoded secret 未选中复选框

  • 第二个 base64编码,其中一个已选中复选框

在两种情况下,您将获得相同的结果。

对于您的Java代码,在使用它进行签名之前,将需要一个额外的步骤来对编码的机密进行解码:

import java.util.Base64;

String base64EncodedSecret = "cXdlcnR5cGFzc3dvcmQ=";
byte[] decodedSecret = Base64.getDecoder().decode(base64EncodedSecret);

然后,当您创建JWT时,将使用解码后的密码:

.signWith(SignatureAlgorithm.HS256, decodedSecret)

但这只是必要的,如果您出于某种原因以编码形式获得了机密。

答案 1 :(得分:0)

这是基于JPS反馈的适用于我的解决方案的代码

import io.jsonwebtoken.SignatureAlgorithm;    
import io.jsonwebtoken.Jwts;
import java.util.Base64;


public class JWT {

    public static void main(String[] args) {
        try {
            String secretkey="qwertypassword";
            byte[] decodedSecret = Base64.getDecoder().decode(secretkey);

            //The JWT signature algorithm we will be using to sign the token
            String jwtToken = Jwts.builder()
                .setSubject("admin")
                .setAudience("Solr")
                .signWith(SignatureAlgorithm.HS256,decodedSecret).compact();

            System.out.println("jwtToken=");
            System.out.println(jwtToken);
        } catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
    }
}

JWT密钥的值是预期值

  

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6IlNvbHIifQ.SWCJDd6B_m7xr_puQH-wgbxvXyJYXH9lTpldOU0eQKc

该网站 https://jwt.io/#debugger-io?token=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6IlNvbHIifQ.5T7L_L1MPfQ_5FjKGa1fTPqrzwK4bNSM812nW6oyjb8

产生。