使用在线 JWT 调试器对 JWT 令牌进行编码和解码我创建了这个简单的令牌
编码令牌的秘密是
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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在这段 Java 代码中缺少什么来生成 JWT,并使用秘密的 Base64 编码来生成 JWT 值
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6IlNvbHIifQ.SWCJDd6B_m7xr_puQH-wgbxvXyJYXH9lTpldOU0eQKc
jwt.iosecret base64 encoded上的含义实际上是,它将您提供的秘密视为已编码的,因此在实际使用之前首先对其进行解码。重点不是创建任何不同的东西,而只是在秘密被编码时对其进行解码。base64
很明显,您使用的秘密不是编码形式:
键盘密码
当你对它进行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);
Run Code Online (Sandbox Code Playgroud)
然后,当您创建 JWT 时,您可以使用解码后的机密:
.signWith(SignatureAlgorithm.HS256, decodedSecret)
Run Code Online (Sandbox Code Playgroud)
但这只是必要的,如果您出于某种原因以编码形式获得了秘密。