JSON Web Token (JWT)은 네트워크 애플리케이션 환경간에 선언을 전달하기 위해 개방형 JSON 기반 표준 (RFC 7519)을 구현했습니다. 토큰은 작고 안전하도록 설계되었으며 특히 분산 사이트의 SSO (Single Sign-on) 시나리오에 적합합니다.
JWT 문은 일반적으로 자원 서버에서 리소스를 획득 할 수 있도록 Identity Provider와 Service 제공자간에 인증 된 사용자 ID 정보를 전달하는 데 사용됩니다. 다른 비즈니스 로직에 필요한 일부 추가 선언 정보도 추가 할 수 있습니다. 토큰은 인증 또는 암호화에도 사용될 수 있습니다.

HMAC-SHA256(SecretKey, Base64UrlEncode(JWT-Header)+'.'+Base64UrlEncode(JWT-Payload))base64(header).base64(payload).signature JWT 토큰으로 클라이언트로 돌아갑니다.composer require tinywan/jwt use Tinywan Jwt JwtToken ;
$ user = [
' id ' => 2022 ,
' name ' => ' Tinywan ' ,
' email ' => ' [email protected] '
];
$ token = JwtToken:: generateToken ( $ user );
var_dump ( json_encode ( $ token ));출력 (JSON 형식)
{
"token_type" : " Bearer " ,
"expires_in" : 36000 ,
"access_token" : " eyJ0eXAiOiJAUR-Gqtnk9LUPO8IDrLK7tjCwQZ7CI... " ,
"refresh_token" : " eyJ0eXAiOiJIEGkKprvcccccQvsTJaOyNy8yweZc... "
}응답 매개 변수
| 매개 변수 | 유형 | 설명하다 | 예제 값 |
|---|---|---|---|
| token_type | 끈 | 토큰 유형 | 교군꾼 |
| expires_in | int | 바우처의 유효 시간, 단위 : 초 | 36000 |
| access_token | 끈 | 액세스 자격 증명 | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx입니다 |
| refresh_token | 끈 | 새로 고침 자격 증명 (액세스 자격 증명 사용 만료) | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx입니다 |
1. 현재 id 얻으십시오
$ id = Tinywan Jwt JwtToken:: getCurrentId ();2. 모든 필드를 얻으십시오
$ email = Tinywan Jwt JwtToken:: getExtend ();3. 사용자 정의 필드를 얻으십시오
$ email = Tinywan Jwt JwtToken:: getExtendVal ( ' email ' );4. 새로 고침 토큰 (새로 고침 토큰으로 접근 할 수있는 토큰)
$ refreshToken = Tinywan Jwt JwtToken:: refreshToken ();5. 토큰 유효 기간의 나머지 시간
$ exp = Tinywan Jwt JwtToken:: getTokenExp (); 6. 단일 장치 로그인. 기본값이 꺼져 있습니다. 구성 파일 config/plugin/tinywan/jwt 수정하십시오
' is_single_device ' => true,단일 디바이스 로그인은
client필드 정의 및 클라이언트 사용자 정의 (기본값은WEB, 즉 웹 페이지)와 같은MOBILE,APP,WEB,ADMIN,API,OTHER등을 지원합니다.
$ user = [
' id ' => 2022 ,
' name ' => ' Tinywan ' ,
' client ' => ' MOBILE ' ,
];
$ token = Tinywan Jwt JwtToken:: generateToken ( $ user );
var_dump ( json_encode ( $ token ));7. 현재 사용자 정보 얻기 (모델)
$ user = Tinywan Jwt JwtToken:: getUser (); 구성 프로젝트 'user_model' 은 익명 함수로 기본적으로 빈 배열을 반환합니다. 프로젝트 ORM에 따라 자신의 반환 모델을 사용자 정의 할 수 있습니다.
Thinkorm 구성
' user_model ' => function ( $ uid ) {
// 返回一个数组
return think facade Db:: table ( ' resty_user ' )
-> field ( ' id,username,create_time ' )
-> where ( ' id ' , $ uid )
-> find ();
}laravelorm 구성
' user_model ' => function ( $ uid ) {
// 返回一个对象
return support Db:: table ( ' resty_user ' )
-> where ( ' id ' , $ uid )
-> select ( ' id ' , ' email ' , ' mobile ' , ' create_time ' )
-> first ();
}8. 토큰 청소
$ res = Tinywan Jwt JwtToken:: clear ();구성 항목
is_single_device가true인 경우에만 적용됩니다. 선택적 매개 변수 :MOBILE,APP,WEB,ADMIN,API,OTHER등
9. 사용자 정의 터미널 client
// 生成WEB令牌
$ user = [
' id ' => 2022 ,
' name ' => ' Tinywan ' ,
' client ' => JwtToken:: TOKEN_CLIENT_WEB
];
$ token = JwtToken:: generateToken ( $ user );
// 生成移动端令牌
$ user = [
' id ' => 2022 ,
' name ' => ' Tinywan ' ,
' client ' => JwtToken:: TOKEN_CLIENT_MOBILE
];
$ token = JwtToken:: generateToken ( $ user ); 기본값은 WEB 입니다
10. 액세스 토큰의 만료 시간을 사용자 정의하고 새로 고침 토큰
$ extend = [
' id ' => 2024 ,
' access_exp ' => 7200 , // 2 小时
];
$ token = Tinywan Jwt JwtToken:: generateToken ( $ extend );11. 토큰 만료 오류 코드
401011401012401013401014401015401021401022401023401024401025 JWT의 가장 일반적인 서명 알고리즘 (JWA) : HS256(HMAC-SHA256) , RS256(RSA-SHA256) 및 ES256(ECDSA-SHA256)
+--------------+-------------------------------+--------------------+
| " alg " Param | Digital Signature or MAC | Implementation |
| Value | Algorithm | Requirements |
+--------------+-------------------------------+--------------------+
| HS256 | HMAC using SHA - 256 | Required |
| HS384 | HMAC using SHA - 384 | Optional |
| HS512 | HMAC using SHA - 512 | Optional |
| RS256 | RSASSA - PKCS1 -v1_5 using | Recommended |
| | SHA - 256 | |
| RS384 | RSASSA - PKCS1 -v1_5 using | Optional |
| | SHA - 384 | |
| RS512 | RSASSA - PKCS1 -v1_5 using | Optional |
| | SHA - 512 | |
| ES256 | ECDSA using P- 256 and SHA - 256 | Recommended+ |
| ES384 | ECDSA using P- 384 and SHA - 384 | Optional |
| ES512 | ECDSA using P- 521 and SHA - 512 | Optional |
| PS256 | RSASSA - PSS using SHA - 256 and | Optional |
| | MGF1 with SHA - 256 | |
| PS384 | RSASSA - PSS using SHA - 384 and | Optional |
| | MGF1 with SHA - 384 | |
| PS512 | RSASSA - PSS using SHA - 512 and | Optional |
| | MGF1 with SHA - 512 | |
| none | No digital signature or MAC | Optional |
| | performed | |
+--------------+-------------------------------+--------------------+
The use of " + " in the Implementation Requirements column indicates
that the requirement strength is likely to be increased in a future
version of the specification.RS256과 ES256 만 권장되는 것을 알 수 있습니다.
플러그인 설치는 기본적으로
HS256대칭 암호화 알고리즘을 사용합니다.
HS256은 서명 및 검증을 위해 동일한 「secret_key」 사용합니다. 일단 secret_key 누출되면 전혀 보안이 없습니다. 따라서 HS256은 중앙 집중식 인증에만 적합하며 신뢰할 수있는 당사자가 서명과 검증을 모두 수행해야합니다.
RS256 시리즈는 RSA 개인 키를 사용하여 서명하고 RSA 공개 키를 사용하여 확인되었습니다.
공개 키가 유출 되더라도 효과가 없습니다. 개인 키가 안전한지 확인하십시오. RS256은 검증을 다른 응용 프로그램에 위임 할 수 있으며 공개 키를 제공 할 수 있습니다.
다음은 참조 용 RS 시리즈 알고리즘 생성 명령입니다.
ssh-keygen -t rsa -b 4096 -E SHA512 -m PEM -P "" -f RS512 .key
openssl rsa -in RS512 .key -pubout -outform PEM -out RS512 .key.pubssh-keygen -t rsa -b 4096 -E SHA354 -m PEM -P "" -f RS384 .key
openssl rsa -in RS384 .key -pubout -outform PEM -out RS384 .key.pubssh-keygen -t rsa -b 4096 -E SHA256 -m PEM -P "" -f RS256 .key
openssl rsa -in RS256 .key -pubout -outform PEM -out RS256 .key.pub이해하지 못하는 학생들은 비디오에 대해 배울 수 있으며 자세한 지침이 있습니다.
https://www.w3cschool.cn/fastapi/fastapi-cmia3lcw.html
보안, 신원 인증 및 승인과 같은 문제를 다루는 방법에는 여러 가지가 있습니다. 그리고 이것은 종종 복잡하고 "어려운"주제입니다. 많은 프레임 워크와 시스템에서 보안 및 신원 인증을 다루는 데 많은 노력과 코드 만 필요합니다 (많은 경우 작성된 모든 코드의 50% 이상을 차지할 수 있음).
JWT는 모든 안전 사양을 연구하고 학습하지 않고 표준 방식으로 보안을 쉽고 빠르게 처리 할 수 있도록 도와줍니다.
도메인에 백엔드 API가 있다고 가정합니다. 다른 도메인 또는 동일한 도메인의 다른 경로 (또는 모바일 애플리케이션)의 프론트 엔드가 있습니다. 또한 사용자 이름과 비밀번호를 사용하여 프론트 엔드를 백엔드로 인증 할 수있는 방법이 필요합니다. OAUTH2를 사용하여 JWT를 통해 구축 할 수 있습니다.
username 과 password 입력하고 클릭하면 입력됩니다.username 과 password 보냅니다 ( tokenUrl="token" ).Bearer 와 토큰이있는 헤더를 Authorization 합니다. 토큰에 foobar 포함 된 경우, Authorization 헤더의 내용은 Bearer foobar 같습니다.注意:中间是有个空格.