spring Jwt标记:创建标记时signWith方法出现DatatypeConverter.parseBase64二进制NullPointerException

fjaof16o  于 2023-02-15  发布在  Spring
关注(0)|答案(3)|浏览(65)

我使用以下方法在身份验证期间创建JWT令牌:

private String createToken(Map<String, Object> claims, 
                           String subject) {
    JwtBuilder builder =  Jwts.builder().setClaims(claims)
            .setSubject(subject)
            .setIssuedAt(
                  new Date(System.currentTimeMillis()));
    builder = builder
            .setExpiration(
                new Date(System.currentTimeMillis() +
                        1000 * 60 * 60 * 10));
    builder = builder
            .signWith(   
               SignatureAlgorithm.HS256, 
               SECRET_KEY);  //error on this line
    return builder.compact();
}

但是,我在builder.signWith()行上得到了一个NullPointerException
我不知道为什么,.setExpiration()行后面的builder不是空的,我检查了调试器(.signWith()行的断点),好像没问题:

claims不为空,包含主题和日期:

这是完整的错误:

org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [dispatcher] in context with path [/testproject_war_exploded] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
    java.lang.NullPointerException
        at javax.xml.bind.DatatypeConverter.parseBase64Binary(DatatypeConverter.java:296)
        at io.jsonwebtoken.impl.Base64Codec.decode(Base64Codec.java:26)
        at io.jsonwebtoken.impl.DefaultJwtBuilder.signWith(DefaultJwtBuilder.java:99)
        at testproject.security.JwtUtil.createToken(JwtUtil.java:52)
xjreopfe

xjreopfe1#

下面是使用HS256用私钥签署JWT令牌的方法:

public static void main(String[] args) {
    KeyPair keyPair = Keys.keyPairFor(HS256);
    PrivateKey privateKey = keyPair.getPrivate();
    Jwts.builder().signWith(privateKey);
}
fnx2tebb

fnx2tebb2#

我在使用jjwt 0.9.1和Java 11时遇到了同样的问题,通过从Java 11切换到Java 1.8解决了这个问题。
我的开发机器是MacOS Catalina 。

kupeojn6

kupeojn63#

我遇到了同样的问题,我将功能更改为

public String getTokenFromClaims(Map<String, Object> claims, String subject) {
        claims.forEach((k, v) -> System.out.println("Key is" + k + "value" + v));
        return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + expiresIn))
                .signWith(SignatureAlgorithm.HS512, Base64.getEncoder().encode(secret.getBytes())).compact();
    }

相关问题