关键词搜索

全站搜索
×
密码登录在这里
×
注册会员
×

已有账号? 请点击

忘记密码

已有账号? 请点击

使用其他方式登录

Thinkphp5中使用JWT Token登陆接口验证完整使用详解

发布2020-11-10 浏览2802次

详情内容

JWT 全称 JSON Web Tokens ,是一个非常轻巧的规范。这个规范允许我们使用 JWT 在用户和服务器之间传递安全可靠的信息。它的两大使用场景是:认证和数据交换。

一、JWT的优点

1、服务端不需要保存传统会话信息,没有跨域传输问题,减小服务器开销。

2、jwt构成简单,占用很少的字节,便于传输。

3、json格式通用,不同语言之间都可以使用。

二、使用JWT进行用户登录鉴权的流程

① 用户使用用户名密码来请求服务器

② 服务器进行验证用户的信息

③ 服务器通过验证发送给用户一个token

④ 客户端存储token,并在每次请求时附送上这个token值

⑤ 服务端验证token值,并返回数据

三、php-jwt库下载地址

通过composer下载:

composer require firebase/php-jwt


新建验证类:

JWTAuth.php

<?php
 
 
namespace app\common\Auth;
use \Lcobucci\JWT\Builder;
use \Lcobucci\JWT\Signer\Hmac\Sha256;
use \Lcobucci\JWT\Parser;
use \Lcobucci\JWT\ValidationData;
/**
 * 单例模式
 */
class JWTAuth
{
	private static $instance;
	/**
	 * JWT TOKEN
	 * @var [type]
	 */
	private $token;
	/**
	 * 颁发
	 * @var string
	 */
	private $iss = 'api.test.com';
	/**
	 * 接收
	 * @var string
	 */
	private $aud = 'app.com';
 
	private $uid;
 
	private $secrect="#$%#$%*&^(*(*(";
 
	private $decodeToken;
 
	public static function getInstance() {
		if(is_null(self::$instance)) {
			self::$instance = new self();
		}
		return self::$instance;
	}
 
	private function __contruct(){
 
	}
 
	private function __clone(){
 
	}
 
	public function encode(){
		$time = time();
		$this->token = (new builder())->setHeader('alg','HS256')
			->setIssuer($this->iss)
			->setAudience($this->aud)
			->setIssuedAt($time) //生效时间
			->setExpiration($time + 20)//过期时间
			->set('uid',$this->uid)
			->sign(new Sha256(), $this->secrect)//加密算法
			->getToken();
 
			return $this;
	}
 
	public function getToken(){
		return (string)$this->token;
	}
 
	public function setToken($token){
		$this->token = $token;
		return $this;
	}
	/**
	 * 用户信息uid
	 * @param [type] $uid [description]
	 */
	public function setUid($uid){
		$this->uid = $uid;
		return $this;
	}
 
	public function jsonDecode(){
 
		$token = $this->token;
		$this->decodeToken = (new Parser())->parse((string) $token); 
 
		// echo $this->decodeToken->getClaim('uid');
		return $this->decodeToken;
	}
	/**
	 * 验证令牌是否有效
	 * @return [type] [description]
	 */
	public function validate(){
 
		$data = new ValidationData();
		$data->setIssuer($this->iss);
		$data->setAudience($this->aud);
		return $this->jsonDecode()->validate($data);
 
	}
	/**
	 * 签名来验证令牌在生成后是否未被修改
	 * @return [type] [description]
	 */
	public function verify(){
		$result = $this->jsonDecode()->verify(new Sha256(), $this->secrect);
		return $result;
	}
 
}

user.php 用来测试

<?php
namespace app\index\controller;
use app\common\Auth\JWTAuth;
 
class User{
 
	public function login(){
		
		$jwtAuth = JWTAuth::getInstance();
		$token = $jwtAuth->setUid(1)->encode()->getToken();
		echo $token;
		// var_dump(success_json_data(['token'=>$token]));
	}
 
	public function check_login(){
		$jwtAuth = JWTAuth::getInstance();
		$jwtAuth->setToken('eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhcGkudGVzdC5jb20iLCJhdWQiOiJhcHAuY29tIiwiaWF0IjoxNTU2MDk1MDI5LCJleHAiOjE1NTYwOTUwNDksInVpZCI6MX0.oi4rLbQFNZUJsW4fVHWiOQxfEmomuvldAV-gFKl2V74');
 
		if($jwtAuth->validate() && $jwtAuth->verify()){
			echo '验证成功';
		}else{
			echo '登录过期';
		}
 
	}
}

jwt本身的话是不带token刷新方法,所以一旦token过期,客户端就要重新登录。

点击QQ咨询
开通会员
返回顶部
×
  • 微信支付
微信扫码支付
微信扫码支付
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
确定支付下载