Closed4
java-jwt
Springで使う
- フィルターのsetAuthenticationSuccessHandlerでログイン成功時などにトークンを発行するような流れ
- staticメソッドなのでJWT.create()などでメソッドの利用が可能
使い方
// ログイン成功時はtokenを発行してレスポンスにセットする
this.setAuthenticationSuccessHandler((req,res,ex) -> {
// トークンの作成
String token = JWT.create()
.withIssuer("com.volkruss.toaru") //発行者
.withClaim("username", ex.getName()) //keyに対してvalueの設定。汎用的な様々な値を保持できる
.sign(Algorithm.HMAC256("secret")); // 利用アルゴリズムを指定してJWTを新規作成
res.setHeader("X-AUTH-TOKEN", token); // jwtはX-AUTH-TOKENにセットする
// アルゴリズムを指定して検証用(Tokenが適切なJWTフォーマットか、著名が一致するかなど)オブジェクトを作成する
JWTVerifier verifier = JWT.require(Algorithm.HMAC256("secret")).build();
// Tokenを検証してデコードされたJWTを取得する
// もしも著名が無効だったりアルゴリズムが等しくないなどの場合は例外が発生します
DecodedJWT decodedJWT = verifier.verify(token);
// Claimはkeyを指定して取得できる
Claim claimUsername = decodedJWT.getClaim("username");
String username = claimUsername.toString();
System.out.println(username);
String issuer = decodedJWT.getIssuer().toString();
System.out.println(issuer);
});
検証失敗例
DecodedJWT decodedJWT = verifier.verify("aaaaaaaa");
com.auth0.jwt.exceptions.JWTDecodeException: The token was expected to have 3 parts, but got 1.
at com.auth0.jwt.TokenUtils.splitToken(TokenUtils.java:21) ~[java-jwt-3.19.1.jar:3.19.1]
at com.auth0.jwt.JWTDecoder.<init>(JWTDecoder.java:36) ~[java-jwt-3.19.1.jar:3.19.1]
at com.auth0.jwt.JWTVerifier.verify(JWTVerifier.java:282) ~[java-jwt-3.19.1.jar:3.19.1]
at com.volkruss.toaru.config.JsonAuthenticationFilter.lambda$new$0(JsonAuthenticationFilter.java:61) ~[main/:na]
getClaimにてStringを取得する際の注意
asStringを使います
String username = decodedJWT.getClaim("username").asString();
// "username"
これはうまくいかない(余計なダブルクォーテーションがつきます)
String username = decodedJWT.getClaim("username").toString();
// ""username""
このスクラップは2022/09/26にクローズされました