IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> tp6 微信小程序 自动登录注册 jwt鉴权 -> 正文阅读

[PHP知识库]tp6 微信小程序 自动登录注册 jwt鉴权

声明:只取用户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验证中间件

?

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-08-31 15:13:29  更:2021-08-31 15:15:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 9:21:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码