나는 자바 시리즈를 사랑 --- JWT [토큰]

JWT 토큰의 장점 :

1, JWT를 기반으로 JSON, 매우 쉽게 해결할 수 있습니다. 
2, 당신은, 토큰 풍부한 콘텐츠에 확장하기 쉬운 사용자 정의 할 수 있습니다.
도 3은 비대칭 암호 알고리즘 및 디지털 서명 기술은 JWT는 변조 안전성을 방지한다.
4, 자원 서비스는 JWT가 인증을 완료하는 인증 서비스를 의존하지 사용합니다.

단점 :

    1, JWT 토큰 더 이상 스토리지는 더 큰 공간을 차지했다.  

토큰 구조 :

(.) JWT 토큰과 같은 세 부분, 중간의 사용에 의해 분리 된 각각의 부분 구성을 Xxxxx.yyyyy.zzzzz

머리글

헤드 토큰 유형 (즉 JWT) 사용 된 해시 알고리즘을 포함한다 (예를 들면, HMAC의 SHA256 또는 RSA)

예는 다음과 같습니다

다음은 헤더의 내용의 일부입니다

{ 
"ALG": "HS256",
"일반": "JWT"
}

상기 제 1 부분을 제공하기 위해, 인코딩 Base64Url를 사용하여 콘텐츠의 가기 문자열 토큰 JWT이다.

유효 탑재량

(누구나) ISS (발행자), EXP (만료 타임 스탬프), 하위 : 두 번째 부분은 콘텐츠도의 JSON 같은 준비 필드 JWT의 서비스를, 저장 될 수있는 정보를 저장하는 유효 장소 목적은,로드 인 등, 또한 사용자 정의 필드가 될 수 있습니다.

이 부분은 원본 콘텐츠를 복원 디코딩 할 수 있기 때문에이 부분은 민감한 정보를 저장하지 않는 것이 좋습니다.

마지막으로, 스트링의 제 2 부분을 제공하기 위해 사용되는 하중 Base64Url 부호화의 제 2 부분은 JWT 토큰이다.

예 :

{ 
"하위": "1234567890",
"이름": "456",
"관리자" 사실
}

서명

세 번째 부분은 서명, 변조 될 수있는 컨텐츠를 보호하기 위해,이 섹션 JWT이다.

이 섹션은 먼저 두 부분 문자열을 형성 할 부호화 도트 (.)를 사용하여 인코딩 base64url 헤더 서명 알고리즘은 서명에 사용 된 마지막 선언.

예 :

HMACSHA256 ( 
base64UrlEncode (헤더) + "."+
base64UrlEncode (페이로드),
비밀)

base64UrlEncode (헤더) : 제 1 부분 JWT 토큰.

base64UrlEncode (페이로드) 토큰 JWT 2 부분.

비밀 : 서명에 사용되는 키입니다.

프로세스를 사용 :

1. 키를 생성 (컴퓨터가 여기에 공개 키와 개인 키를 포함하여 일반 자바 환경을 실행할 수 있도록하기 위해)

 

 

 

키 도구 -genkeypair -alias changgou -keyalg RSA -keypass changgou -keystore changgou.jks -storepass changgou 

쿼리 인증서 정보 :

키 도구 -list -keystore changgou.jks

 

 

 키 2. 수출 공개 키

OpenSSL을 암호화 및 암호 해독을 사용하려면 openssl은 공개 키 정보를 내보낼 수있는 키트입니다.

설치하려면 openssl (다음 기본값으로 모든 방법), 다운로드 : http://slproweb.com/products/Win32OpenSSL.html

데이터 디렉토리에 설치 Win64OpenSSL-1_1_1b.exe

경로 환경 변수의 openssl 구성

 

 

 

파일 changgou.jks 다음 명령을 실행 디렉토리에 cmd를 : 흰색 부분은 공개 키

키 도구 -list -rfc --keystore changgou.jks | OpenSSL을 X509 -inform PEM -pubkey

 

 

 텍스트 파일 public.key 공개 키의 상단 복사, 그것은 인증 및 권한 부여에 따라 넣을 수 있으며, 수동으로 하나 개의 라인으로 병합 기억 프로젝트 어디에 둘 필요가 프로젝트 리소스 파일 디렉토리를 구현해야한다.

3. 비밀 키 생성 토큰 JWT를 바탕으로

코드 바이두 클라우드 다운로드 링크 :

링크 : https://pan.baidu.com/s/1gZZT0hglb3XPIKIgJrYTPg
추출 코드 : zrv6
오이 공개 바이두 네트워크 디스크 전화 앱, 더 편리한 작업의 내용을 복사

3.1 가져 오기 인증 서비스

1) 교육용 changgou_user_auth아래와 같이 공학 프로젝트 도입 :

 

 

 2) 시작 유레카 후 인증 서비스를 시작

테스트 클래스 3.2 인증 서비스 만들기

공공  클래스 CreateJwtTest는 { 

    / ** * 
     * 토큰 테스트를 만들기 
     * / 
    @Test 
    공공  무효 testCreateToken () {
         // 인증서 파일 경로 
        문자열 key_location = "changgou.jks" ;
         // 비밀 키 저장소 암호 
        문자열 Key_password = "changgou을" ;
         // 키 암호 
        문자열 keypwd = "changgou" ;
         // 키 별칭 
        문자열 별칭 = "changgou" ; 

        // 액세스 인증 경로 
        ClassPathResource가 자원 = 새로운 새로운 ClassPathResource가 (key_location); 

        //이 비밀 키 팩토리를 작성
        KeyStoreKeyFactory keyStoreKeyFactory = 새로운 KeyStoreKeyFactory (자원 key_password.toCharArray ()); 

        // 读取秘钥对(公钥,私钥) 
        된 KeyPair 키 쌍 = keyStoreKeyFactory.getKeyPair (별명 keypwd.toCharArray ()); 

        // 获取私钥 
        RSAPrivateKey rsaPrivate = (RSAPrivateKey) keyPair.getPrivate (); 

        // 定义페이로드 
        지도 <문자열, 개체> tokenMap = 새로운 HashMap의 <> (); 
        tokenMap.put ( "ID", "1" ); 
        tokenMap.put ( "이름", "itheima" ); 
        tokenMap.put ( "역할", "ROLE_VIP, ROLE_USER" );

        
        JWT의 JWT = JwtHelper.encode (JSON.toJSONString (tokenMap) 새로운 RsaSigner (rsaPrivate)); 

        // 取出令牌 
        = 인코딩 문자열 jwt.getEncoded (); 
        에서 System.out.println (부호화); 
    } 
}

공개 키 토큰 구문 분석 JWT에 따라 4

위의 토큰을 생성 한 후, 우리는 구문 분석 공개 키를 사용하는 데 필요한 토큰 JWT를 분석 할 수있다, 우리는 이전에 저장하여 공개 키 토큰 문자열 변수를 생성 한 다음 공개 키 암호를 해독 public.key 복사 할 수 있습니다.

다음과 같이 구문 분석 토큰 검증 데이터를 달성 com.changgou.token.ParseJwtTest 테스트 클래스 changgou 사용자-OAuth를 만들기 :

공공  클래스 ParseJwtTest { 

    / ** * 
     * 확인 토큰 
     * / 
    @Test 
    공공  무효 testParseToken () {
         // 토큰 
        문자열 토큰 = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlcyI6IlJPTEVfVklQLFJPTEVfVVNFUiIsIm5hbWUiOiJpdGhlaW1hIiwiaWQiOiIxIn0.IR9Qu9ZqYZ2gU2qgAziyT38UhEeL4Oi69ko-dzC_P9- Vjz40hwZDqxl8wZ-W2WAw1eWGIHV1EYDjg0-eilogJZ5UikyWw1bewXCpvlM-ZRtYQQqHFTlfDiVcFetyTayaskwa-x_BVS4pTWAskiaIKbKR4KcME2E5o1rEek-3YPkqAiZ6WP1UOmpaCJDaaFSdninqG0gzSCuGvLuG40x0Ngpfk7mPOecsIi5cbJElpdYUsCr9oXc53ROyfvYpHjzV7c2D5eIZu3leUPXRvvVAPJFEcSBiisxUSEeiGpmuQhaFZd1g -yJ1WQrixFvehMeLX2XU6W1nlL5ARTpQf_Jjiw " ; 

        // 공개
        문자열 공개 키 = "----- BEGIN PUBLIC KEY ----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvFsEiaLvij9C1Mz + oyAmt47whAaRkRu / 8kePM + X8760UGU0RMwGti6Z9y3LQ0RvK6I0brXmbGB / RsN38PVnhcP8ZfxGUH26kX0RK + tlrxcrG + HkPYOH4XPAL8Q1lu1n9x3tLcIPxq8ZZtuIyKYEmoLKyMsvTviG5flTpDprT25unWgE4md1kthRWXOnfWHATVY7Y / r4obiOL1mS5bEa / iNKotQNnvIAKtjBM4RlIDWMa6dmz + lHtLtqDD2LF1qwoiSIHI75LQZ / CNYaHCfZSxtOydpNKq8eb1 / PGiLNolD4La2zf0 / 1dlcr5mkesV570NxRmU1tFm8Zd3MZlZmyv9QIDAQAB ----- END PUBLIC KEY ----- " ; 

        // 校验JWT 
        JWT JWT = JwtHelper.decodeAndVerify (토큰 새로운 RsaVerifier (공개 키)); 

        // 获取JWT原始内容 
        문자열 = 청구 ) (jwt.getClaims 단계; 
        에서 System.out.println (항); 
        // JWT令牌
        문자열 인코딩 = jwt.getEncoded (); 
        에서 System.out.println (부호화); 
    } 
}

 

 

 

 

 

추천

출처www.cnblogs.com/hujunwei/p/11432115.html