Composer使用JWT组件生成Toekn实例
1、Token和Session的区别?
SESSION 是服务器通过 Key-Value 对来保存数据的一种机制,比如 APP 的登录状态可以用 SESSION 来保存。
TOKEN 翻译过来叫令牌,令牌是什么意思?可以拿现实中的令牌对比,现实中的令牌起到通行证的作用,而这在服务端也是一样的。我们在登录后,服务端使用 SESSION 保存我们的登录状态,并把 SESSION 的 Key 返回给客户端,那么这个 Key 就成为我们的令牌(TOKEN),我们以后再访问数据,就直接把这个 TOKEN 随着请求一起发送给服务端,这样服务端通过这个 TOKEN 在 SESSION 中查找数据,如果有就说明 TOKEN 有效(就像你去旅游,关口认可你的通行证),并取出你的登录数据,利用你的用户信息(保存在登录数据内)查出你想要的内容。
2、APP为什么使用Token而不使用Session
相较于Session而言,每一次的会话操作都会对服务器造成压力。
Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。
3、Token在与客户端交互流程
1:客户端通过用户名和密码登录
2:服务器验证用户名和密码,若通过,生成token返回给客户端。
3:客户端收到token后以后每次请求的时候都带上这个token,相当于一个令牌,表示我有权限访问了
4:服务器接收(通常在拦截器中实现)到该token,然后验证该token的合法性(为什么能验证下面说)。
注:若该token合法,则通过请求,若token不合法或者过期,返回请求失败。
4、如何来生成Token 使用composer加载包lcobucci/jwt
composer require lcobucci/jwt
5、Token的格式
分为请求头 heard
{
"alg": "HS256",
"typ": "JWT"
}
保存的内容
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
加盐字符串
6、下面使用PHP来创建Token
<?php
use Lcobucci\JWT\Builder;
use Lcobucci\JWT\Signer\Hmac\Sha256;
use Lcobucci\JWT\Parser;
use Lcobucci\JWT\ValidationData;
use \Exception;
class Token
{
/**
* 创建Token
* @param $uid 需要保存的用户身份标识
* @return String
**/
public static function createToken($uid = null)
{
$signer = new Sha256();
$token = (new Builder())->setIssuer('https://www.baidu.com')
->setAudience('httpsp://www.baidu.com')
->setId('sxs-4f1g23a12aa', true) //自定义标识
->setIssuedAt(time()) //当前时间
->setExpiration(time() + (86400 * 30)) //token有效期时长
->set('uid', $uid)
->sign($signer, '你的加盐字符串')
->getToken();
//这里可以做一些其它的操作,例如把Token放入到Redis内存里面缓存起来。
/**
* ......
* ......
**/
return (String) $token;
}
/**
* 检测Token是否过期与篡改
* @param token
* @return boolean
**/
public static function validateToken($tokan = null)
{
$token = (new Parser())->parse((String) $token);
$signer = Sha256();
if (!$token->verify($signer, '创建时候的加盐字符串')) {
return false; //签名不正确
}
$validationData = new ValidationData();
$validationData->setIssuer('https://www.baidu.com');
$validationData->setAudience('https://www.baidu.com');
$validatationData->setId('sxs-4f1g23a12aa');//自字义标识
return $token->validate($validationData);
}
}
TokenController调用实现
Class TokenController
{
public function create()
{
$token = Token::createToken(1);
var_dump($token);
}
public function validate($token)
{
$bool = Token::validateToken($token);
var_dump($bool);
}
}
以上就是使用过程,希望能对你有所帮助。欢迎留言讨论