4.TP6学习 - jwt + 微信小程序验证token

一、安装JWT

composer require firebase/php-jwt

4.TP6学习 - jwt + 微信小程序验证token_第1张图片

二、配置JWT

我是将jwt的获取token和获取id方法封装在了app下面的common里面

4.TP6学习 - jwt + 微信小程序验证token_第2张图片

1、引入jwt

use \Firebase\JWT\JWT;

2、封装方法

 $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(令牌)的用户认证步骤:

  1. 用户输入其登录信息
  2. 服务器验证信息是否正确,并返回已签名的token
  3. token储在客户端,例如存在local storage或cookie中(小程序存在缓存中)
  4. 之后的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
            })
          }
        })
  5. 服务器解码JWT,并且如果令牌有效,则接受请求
  6. 一旦用户注销,令牌将在客户端被销毁,不需要与服务器进行交互一个关键是,令牌是无状态的。后端服务器不需要保存令牌或当前session的记录。
     

    小程序header添加touken 方法有两种
    1、

     header:{
                  //微信小程序存入token
                'Authorization': token //token是从缓存中取出来的
              },
    $token = $_SERVER['HTTP_AUTHORIZATION'];

    2、

     header: {
            'token':  token, //请求header头携带token
          },
    $token = $_SERVER['HTTP_TOKEN'];

你可能感兴趣的:(微信小程序,jwt,小程序,php)