JWT認証ユーザ情報機能

15244 ワード

3.7.1、紹介
JSON Web tokenはJWTと略称し、アプリケーション上のユーザを認証するためのタグである.すなわち、JWTSを使用するアプリケーションは、そのユーザに関するクッキーまたは他のセッションデータを保存する必要がなくなります.この機能は、アプリケーションのセキュリティを保証しながら、伸縮性に優れています.
認証プロセス中、ユーザーが認証情報を使用して正常にログインすると、JSON Web tokenに戻り、ローカルで保存する必要があります(通常はローカルストレージ).
保護されたルーティングまたはリソース(エンドポイント)にアクセスするたびに、ユーザエージェント(user agent)は、通常、認証ヘッダでBearer schemaを使用する要求とともにJWTを送信する必要があります.バックエンドサーバがJWTの要求を受信した場合、まずtokenの検証を行います.
3.7.2、形式
  • JWTは1つの文字列で、暗号化処理と検証処理を経た文字列で、形式は:A.B.C
  • Aは、JWTヘッダ情報ヘッダがbase 64によって暗号化されて得られる
  • #      
    {
             
      "alg": "HS256",
      "typ": "JWT"
    }
    
    #    :https://jwt.io/
    #base64        :eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
    

  • Bはpayloadであり、有効な情報を格納する場所であり、これらの情報は3つの部分を含む.
  • 規格に登録されている声明(推奨されているが強制されていない)
  • iss:jwt発行者
  • sub:jwt向けユーザ
  • aud:jwt受信側
  • exp:jwtの有効期限は、署名時間
  • より大きくなければなりません.
  • nbf:いつまでにjwtが使用できないかを定義します.
  • iat:jwtの発行日時
  • jti:jwtの一意のアイデンティティ識別は、主に使い捨てtokenとして使用され、再生攻撃を回避する.

  • 公共の声明
  • 共通の声明は任意の情報を追加することができ、一般的にはユーザーの関連情報やその他の業務に必要な必要な情報を追加することができるが、この部分はクライアントで復号できるため、機密情報を追加することは推奨されない.
  • プライベートな声明
  • プライベート宣言は、base 64が対称的に復号化されているため、提供者と消費者が共同で定義した宣言であり、一般的には機密情報の格納は推奨されない.これは、一部の情報が明文情報に分類されることを意味する.

  • #     :
    {
             
      "sub": "1234567890",
      "name": "John Doe",
      "iat": 1516239022
    }
    
    #base64      :
    eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
    

  • CはAとBから暗号化アルゴリズムによって得られ、tokenを検証するために使用され、有効かどうかを確認する.
  • この部分はbase 64暗号化されたヘッダとbase 64暗号化されたpayloadが.で構成された文字列を接続し、ヘッダに宣言された暗号化方式で塩secretを組み合わせて暗号化し、jwtの第3部分を構成する必要がある.
  • #secret :itcast
    #         :DwMTjJktoFFdClHqjJMRgYzICo6FJOUc3Jmev9EScBc
    
    #   token :eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.DwMTjJktoFFdClHqjJMRgYzICo6FJOUc3Jmev9EScBc
    


  • 3.7.3、プロセス
    3.7.4、例
    依存のインポート:
    <dependency>
        <groupId>io.jsonwebtokengroupId>
        <artifactId>jjwtartifactId>
        <version>0.9.1version>
    dependency>
    

    テストケースの作成:
    package com.tanhua.sso.service;
    
    import io.jsonwebtoken.ExpiredJwtException;
    import io.jsonwebtoken.JwsHeader;
    import io.jsonwebtoken.Jwts;
    import io.jsonwebtoken.SignatureAlgorithm;
    import org.junit.Test;
    
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Map;
    
    public class TestJWT {
         
    
        String secret = "itcast";
    
        @Test
        public void testCreateToken(){
         
    
            Map<String, Object> header = new HashMap<String, Object>();
            header.put(JwsHeader.TYPE, JwsHeader.JWT_TYPE);
            header.put(JwsHeader.ALGORITHM, "HS256");
    
            Map<String, Object> claims = new HashMap<String, Object>();
            claims.put("mobile", "1333333333");
            claims.put("id", "2");
    
            //   token
            String jwt = Jwts.builder()
                    .setHeader(header)  //header,   
                    .setClaims(claims) //payload,       ,        , :   
                    .signWith(SignatureAlgorithm.HS256, secret) //          
                    .setExpiration(new Date(System.currentTimeMillis() + 3000)) //      ,3    
                    .compact();
    
            System.out.println(jwt);
    
        }
    
        @Test
        public void testDecodeToken(){
         
            String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJtb2JpbGUiOiIxMzMzMzMzMzMzIiwiaWQiOiIyIiwiZXhwIjoxNjA1NTEzMDA2fQ.1eG3LpudD4XBycUG39UQDaKVBQHgaup-E1OLWo_m8m8";
            try {
         
                //   token    
                Map<String, Object> body = Jwts.parser()
                        .setSigningKey(secret)
                        .parseClaimsJws(token)
                        .getBody();
                System.out.println(body); //{mobile=1333333333, id=2, exp=1605513392}
            } catch (ExpiredJwtException e) {
         
                System.out.println("token    !");
            } catch (Exception e) {
         
                System.out.println("token   !");
            }
        }
    
    }