使用在线 JWT 调试器对 JWT token 进行编码和解码,我创建了这个简单的 token
对 token 进行编码的 secret 是
qwertypassword
header 为{ "alg": "HS256"}
有效负载为{ "sub": "admin", "aud": "Solr"}
当您使用非 Base64 编码的 key 进行编码时,它会生成 JWT
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6IlNvbHIifQ.5T7L_L1MPfQ_5FjKGa1fTPqrzwK4bNSM812nW6oyjb8
当 secret 是 Base64 编码时,它会生成 JWT
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6IlNvbHIifQ.SWCJDd6B_m7xr_puQH-wgbxvXyJYXH9lTpldOU0eQKc
以下是当 secret 未经过 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 代码中我缺少什么来生成 JWT,并使用 secret 的 Base64 编码来生成 JWT 值
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6IlNvbHIifQ.SWCJDd6B_m7xr_puQH-wgbxvXyJYXH9lTpldOU0eQKc
最佳答案
jwt.io上 secret base64编码
的含义实际上,它会将您提供的 secret 视为 Base64 编码,因此在实际使用之前首先对其进行解码。重点不是创建任何不同的东西,而只是在加密 secret 时对其进行解码。
您使用的 secret 显然是未编码形式:
qwertypassword
当你对它进行base64编码时,例如。在https://www.base64encode.org/的帮助下,您将得到这个base64编码值:
cXdlcnR5cGFzc3dvcmQ=
关于jwt.io您可以使用这两种形式:
第一个未编码,具有
base64 编码的 secret
复选框未选中或
第二个,base64 编码,并且选中复选框。
在这两种情况下,您都会得到相同的结果。
对于您的 java 代码,在使用它进行签名之前,需要额外的步骤来解码编码的 secret :
import java.util.Base64;
String base64EncodedSecret = "cXdlcnR5cGFzc3dvcmQ=";
byte[] decodedSecret = Base64.getDecoder().decode(base64EncodedSecret);
然后,当您创建 JWT 时,您可以使用解码后的 secret :
.signWith(SignatureAlgorithm.HS256, decodedSecret)
但这只是必要的,如果您出于某种原因以编码形式获得了 secret 。
关于java - 如何使用 Java 中的 secret Base64 编码创建 JWT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58044813/