Closed4

java-jwt

misakamisaka

Springで使う

  • フィルターのsetAuthenticationSuccessHandlerでログイン成功時などにトークンを発行するような流れ
  • staticメソッドなのでJWT.create()などでメソッドの利用が可能
misakamisaka

使い方

// ログイン成功時は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);
});

misakamisaka

検証失敗例

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]
misakamisaka

getClaimにてStringを取得する際の注意

asStringを使います

String username = decodedJWT.getClaim("username").asString();
// "username"

これはうまくいかない(余計なダブルクォーテーションがつきます)

String username = decodedJWT.getClaim("username").toString();
// ""username""
このスクラップは2022/09/26にクローズされました