tp6 微信小程序 自动登录注册 jwt鉴权

本文介绍了如何在ThinkPHP6框架下,利用微信小程序的openid进行用户唯一标识,通过weixin.login获取code,后台接收并用jwt生成token,实现自动登录注册功能,并详细阐述了JWT的封装和CURL请求的使用,最后讲解了如何设置中间件进行鉴权。

声明:只取用户openid作为用户唯一标识使用,获取其他信息需要用户授权

1.在微信小程序app.js中,weixin.login获取code码给后台赋值

 wx.login({
      success: res => {
        // 发送 res.code 到后台换取 openId, sessionKey, unionId

        wx.request({

          url: 'http://www.xxxxx.com/api/login',//需要请求的地址

          method:'POST',//建议使用POST提交

          data:{

              code:res.code//传值code

          },

          success:ret=>{

              wx.setStorageSync('token', ret.data.data)//将后台传递的token存入缓存 后期鉴权使用

          }
        })
      }
    })
  }

2.后台接收数据并使用jwt注册token

/**
     * @return \think\response\Json
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     * 小程序登录
     */
    public function login()
    {
//        接收code
        $code=input('code');

//        调取封装方法获取openid
        $res=getWxMessage($code);

//        获取用户信息
        $userInfo=user::where('openid',$res['openid'])
            ->find();

        if (empty($userInfo)){
            $userInfo=user::create(['openid'=>$res['openid'],'session_key'=>$res['session_key']]);
        }else{
            $userInfo->session_key=$res['session_key'];
            $userInfo->save();
        }

//        对用户ID进行加密
        $token=signToken($userInfo->id);

//        返回token至小程序
        return successJson('登录成功',$token);
    }

3.封装JWT(封装公共方法或者server层)

composer安装JWT

composer require firebase/php-jwt

use Firebase\JWT\JWT;

//生成验签
function signToken($uid){
    $key='zbcazbc';         //这里是自定义的一个随机字串,应该写在config文件中的,解密时也会用,相当    于加密中常用的 盐  salt
    $token=array(
        "iss"=>$key,        //签发者 可以为空
        "aud"=>'',          //面象的用户,可以为空
        "iat"=>time(),      //签发时间
        "nbf"=>time()+3,    //在什么时候jwt开始生效  (这里表示生成100秒后才生效)
        "exp"=> time()+7200, //token 过期时间
        "data"=>[           //记录的userid的信息,这里是自已添加上去的,如果有其它信息,可以再添加数组的键值对
            'uid'=>$uid,
        ]
    );
    //  print_r($token);
    $jwt = JWT::encode($token, $key, "HS256");  //根据参数生成了 token
    return $jwt;
}


//验证token
function checkToken($token){
    $key='zbcazbc';
    $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 $res['data']->uid;

    } 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;
    }
}

4.封装CURL请求

function getCurl($url)
{
    $headerArray =array("Content-type:application/json;","Accept:application/json");
    $ch = curl_init();//初始化CURL
    curl_setopt($ch, CURLOPT_URL, $url);//设置访问地址
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);//HTTPS访问设置 关闭监视
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);//HTTPS访问设置 关闭监视访问地址
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch,CURLOPT_HTTPHEADER,$headerArray);//设置访问头部信息
    $output = curl_exec($ch);//获取结果
    curl_close($ch);//关闭连接
    $output = json_decode($output,true);//json数据转换
    return $output;
}

5.请求微信地址

function getWxMessage($code)
{
    //网址,appid,appsecret都封装至配置文件中,方便后期管理
    $url=sprintf(config('wx.url'),config('wx.AppID'),config('wx.AppSecret'),$code);
    //使用封装的CURL方法
    $res=getCurl($url);
    //返回结果
    return $res;

}

6.使用中间件鉴权

生成中间件

php think make:middleware XXXXCheck

 中间件中验证token

/**
     * 处理请求
     *
     * @param \think\Request $request
     * @param \Closure       $next
     * @return Response
     */
    public function handle($request, \Closure $next)
    {
        //获取头部信息token
        $token=request()->header('token');

        //验证token
        $res=checkToken($token);

        //对返回结果进行判断
        if (!is_numeric($res)){
            return errorJson($res);
        }
        //保存用户ID
        $request->uid=$res;

       return $next($request);
    }

在指定的分组路由中引入中间件 

//被校验的分组
Route::group(function (){

//    轮播图+访问节流中间件
Route::get('banner','house/banner')->middleware(\think\middleware\Throttle::class,[
    'visit_rate' => '5/m'
]);

// 文件上传
Route::post('uploadfile','house/uploadFile');
Route::get('phone','house/phone');

//添加信息
Route::post('personage_append','house/personageAppend')->middleware(\think\middleware\Throttle::class,[
    'visit_rate' => '2/m'
]);
//添加信息
Route::post('enterprise_append','house/enterpriseAppend')->middleware(\think\middleware\Throttle::class,[
    'visit_rate' => '2/m'
]);
})->middleware(\app\api\middleware\checkToken::class);//Token验证中间件

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值