thinkphp 프레임 워 크 는 JWTtoken 을 사용 하 는 방법 에 대한 상세 한 설명 입 니 다.
간단 한 소개
1.JWT 소개:전 칭 JSON Web Token 은 JSON 의 개방 기준(RFC 7519)을 바탕 으로 전통 적 인 Cookie-Session 모델 을 token 방식 으로 대체 하여 각 서버,클 라 이언 트 가 정보 서명 검증 을 전달 하 는 데 사용 된다.
2.JWT 의 장점:
1:서버 에서 전통 적 인 세 션 정 보 를 저장 할 필요 가 없고 크로스 전송 문제 가 없 으 며 서버 비용 을 줄 일 수 있 습 니 다.
2:jwt 구성 이 간단 하고 적은 바이트 를 차지 하여 전송 하기에 편리 합 니 다.
3:json 형식 이 통용 되 고 서로 다른 언어 간 에 사용 할 수 있 습 니 다.
3.JWT 구성
1:jwt 는 세 부분 으로 구성 된다.
머리(헤더)
부하(payload)는 정의 정보 와 사용자 정의 정 보 를 포함 합 니 다.
비자(서명)
2:구체 적 인 구성:
header:
{
"typ": "JWT", // jwt
"alg": "HS256" // SHA256
}
부하(payload)
{
"iss": "http://www.helloweba.net",
"aud": "http://www.helloweba.net",
"iat": 1525317601,
"nbf": 1525318201,
"exp": 1525318201,
"data": {
"userid": 1,
"username": " "
}
}
하중 은 표준 성명 과 기타 성명 두 부분 을 포함한다.표준 성명:JWT 표준 에 규정된 성명 이지 만 반드시 작성 해 야 하 는 것 은 아니다.
표준 선언 필드:
이 JWT 를 접수 한 쪽
iss:jwt 발급 자
sub:jwt 대상 사용자
aud:jwt 를 받 는 쪽
exp:jwt 의 만 료 시간,만 료 시간 은 발급 시간 보다 커 야 합 니 다.
nbf:언제 까지,어느 시점 이후 에 만 접근 할 수 있 는 지 정의 합 니 다.
iat:jwt 의 발급 시간
jti:jwt 의 유일한 신분 표 지 는 주로 일회용 token 으로 사용 된다.
다운로드 하 다.
composer require firebase/php-jwt
extend 에서 token 클래스 만 들 기
namespace Token;
use think\Controller;
use think\facade\Request;
use Firebase\JWT\JWT;
/**token
* Class Token
* @package app\api\Controller
*/
class Token
{
/**
* token
* @param array $data
* @param integer $exp_time token : :7200=2
* @param string $scopes token , token
* @return string
*/
private $TokenKey = "123456";
public function createToken($data="",$exp_time=0,$scopes=""){
//JWT , ;
//iss: jwt
//sub: jwt
//aud: jwt
//exp: jwt ,
//nbf: ,
//iat: jwt
//jti: jwt , token。
//
try {
$key=$this->TokenKey;
$time = time(); //
//$token['iss']=''; //
//$token['aud']=''; // JWT ,
$token['iat']=$time; //
$token['nbf']=$time; //(Not Before): , time+30, 30
if($scopes){
$token['scopes']=$scopes; //token , token
}
if(!$exp_time){
$exp_time=7200;// =2
}
$token['exp']=$time+$exp_time; //token , 2
if($data){
$token['data']=$data; //
}
$json = JWT::encode($token,$key);
$returndata['status']="200";//
$returndata['msg']='success';
$returndata['token']= $json;//
return $returndata; //
}catch(\Firebase\JWT\ExpiredException $e){ //
$returndata['status']="104";//101=
$returndata['msg']=$e->getMessage();
$returndata['data']="";//
return $returndata; //
}catch(\Exception $e) { //
$returndata['status']="199";//199=
$returndata['msg']=$e->getMessage();
$returndata['data']="";//
return $returndata; //
}
}
/**
* token , exp,nbf,iat
* @param string $jwt token
* @return string $msg
*/
public function checkToken($jwt){
$key=$this->TokenKey;
try {
JWT::$leeway = 60;// 60,
$decoded = JWT::decode($jwt, $key, ['HS256']); //HS256 ,
$arr = (array)$decoded;
$returndata['status']="200";//200=
$returndata['msg']="success";//
$returndata['data']=$arr;//
return $returndata; //
} catch(\Firebase\JWT\SignatureInvalidException $e) { //
$returndata['status']="101";//101=
$returndata['msg']=$e->getMessage();
$returndata['data']="";//
//return json_encode($returndata); //
//exit(json_encode($returndata));
sendResponse($returndata,401,'Unauthorized');
}catch(\Firebase\JWT\BeforeValidException $e) { //
$returndata['status']="102";
$returndata['msg']=$e->getMessage();
$returndata['data']="";//
sendResponse($returndata,401,'Unauthorized');
}catch(\Firebase\JWT\ExpiredException $e) { // token
$returndata['status']="103";//103=
$returndata['msg']=$e->getMessage();
$returndata['data']="";//
sendResponse($returndata,401,'Unauthorized');
}catch(\Exception $e) { //
$returndata['status']="199";//199=
$returndata['msg']=$e->getMessage();
$returndata['data']="";//
sendResponse($returndata,401,'Unauthorized');
}
//Firebase throw new, catch ,catch , token Token Token
}
서명 발급 하 다
$jwtToken = new Token();
$tokenData = array(
'openid' => $user->getId(),
'uniacid' => $_W['uniacid'],
);
$token = $jwtToken->createToken($tokenData)
검증 하 다.
if (empty($_SERVER['HTTP_AUTHORIZATION']))
{
$res['status']="201";
$res['msg']="no token";
$res['data']="";//
sendResponse($res,401,'Unauthorized');
}
$token = $_SERVER['HTTP_AUTHORIZATION'];
$jwtToken = new Token();
$checkToken = $jwtToken->checkToken($token);
$data = (array)$checkToken['data']['data'];
thinkpHP 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.본 고 는 ThinkPHP 프레임 워 크 를 기반 으로 한 PHP 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Thinkphp의 S 캐시 사용법!텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.