一、安装JWT
composer require firebase/php-jwt
二、配置JWT
我是将jwt的获取token和获取id方法封装在了app下面的common里面
1、引入jwt
use \Firebase\JWT\JWT;
2、封装方法
<?php
// 应用公共文件
use \Firebase\JWT\JWT;
//jwt
//生成验签
//判断方法是否存在
if (!function_exists('signToken')) {
function signToken($uid)
{
$key = '15553242780'; //这里是自定义的一个随机字串,应该写在config文件中的,解密时也会用,相当 于加密中常用的 盐 salt
$token = array(
"iss" => $key, //签发者 可以为空
"aud" => '', //面象的用户,可以为空
"iat" => time(), //签发时间
"nbf" => time() + 3, //在什么时候jwt开始生效 (这里表示生成100秒后才生效)
"exp" => time() + 200, //token 过期时间
"data" => [ //记录的userid的信息,这里是自已添加上去的,如果有其它信息,可以再添加数组的键值对
'uid' => $uid,
]
);
// print_r($token);
$jwt = JWT::encode($token, $key, "HS256"); //根据参数生成了 token
return $jwt;
}
}
//获取写入的id
if (!function_exists('checkToken')) {
//验证token
function checkToken($token)
{
$key = '15553242780';
$status = array("code" => 2);
try {
JWT::$leeway = 60;//当前时间减去60,把时间留点余地
$decoded = JWT::decode($token, $key, array('HS256')); //HS256方式,这里要和签发的时候对应
$arr = (array)$decoded;
$res['code'] = 1;
$res['data'] = $arr['data'];
return $arr['data']->uid;//解析出来的id 在数组里面的对象
} catch (\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
$status['msg'] = "签名不正确";
return $status;
} catch (\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
$status['msg'] = "token失效";
return $status;
} catch (\Firebase\JWT\ExpiredException $e) { // token过期
$status['msg'] = "token失效";
return $status;
} catch (Exception $e) { //其他错误
$status['msg'] = "未知错误";
return $status;
}
}
}
3、获取token和id
public function getToken()
{
$id = 2;
$token = signToken($id);
$res=checkToken($token);
echo $token;
echo 'id='.$res;
}
4、在微信小程序中使用jwt--token
基于token(令牌)的用户认证步骤:
- 用户输入其登录信息
- 服务器验证信息是否正确,并返回已签名的token
- token储在客户端,例如存在local storage或cookie中(小程序存在缓存中)
- 之后的HTTP请求都将token添加到请求头里
const token = wx.getStorageSync('token')//从缓存中取出token wx.request({ url: '', data:{ }, header: { 'token': token, //请求header头携带token }, success:(res)=>{ console.log(res); this.setData({ bargain:res.data.data }) } })
- 服务器解码JWT,并且如果令牌有效,则接受请求
- 一旦用户注销,令牌将在客户端被销毁,不需要与服务器进行交互一个关键是,令牌是无状态的。后端服务器不需要保存令牌或当前session的记录。
小程序header添加touken 方法有两种
1、header:{ //微信小程序存入token 'Authorization': token //token是从缓存中取出来的 },
$token = $_SERVER['HTTP_AUTHORIZATION'];
2、
header: { 'token': token, //请求header头携带token },
$token = $_SERVER['HTTP_TOKEN'];