一 : 下载第三方插件
composer require lcobucci/jwt 3.3
二 : 创建相关的控制器
1:生成&校验token的控制器
php artisan make:controller Api/TokenController
2:登录的控制器
php artisan make:controller Api/LoginController
3:创建中间件
php artisan make:middleware TokenMiddleWare
三 : 在新建的token控制器内命名空间下调用
use LcobucciJWTBuilder; use LcobucciJWTSignerHmacSha256; use LcobucciJWTParser; use LcobucciJWTValidationData;
四 : 生成token的方法
//生成token static public function createToken($uid=null){ $signer = new Sha256();//加密规则 $time = time();//当前时间 $token = (new Builder()) ->issuedBy('teacher')//签发人 ->canOnlyBeUsedBy('student')//接收人 ->identifiedBy('kaslana', true) //标题id ->issuedAt($time)//发出令牌的时间 ->canOnlyBeUsedAfter($time) //生效时间(即时生效) ->expiresAt($time + 3600) //过期时间 ->with('uid', $uid) //用户id ->sign($signer, 'kiana') //签名 ->getToken(); //得到token return (string)$token; }
五 : 校验token的方法
//验证token static public function verifyToken($token=null){ //检测是否接收到了token if(empty($token)){ return 0; } //代码到30行,就表示取到token了,那么转化成jwt认识的token $token = (new Parser())->parse((string) $token); //验证基本设置 $data = new ValidationData(); $data->setIssuer('teacher'); $data->setAudience('student'); $data->setId('kaslana'); if(!$token->validate($data)){ return 0; } //验证签名 $signer = new Sha256(); if(!$token->verify($signer, 'kiana')){ return 0; } //验证通过,返回用户id return $token->getClaim('uid'); }
六 : 在新建的中间件中加入
try { //接取token $token = $request->get('token'); //token不存在 if (!isset($token)){ return ['code' => 200,'msg' => '未登录','data' => '']; } //解密获取用户id $uid = TokenController::verifyToken($token); //id错误 if (!$uid){ return ['code' => 200,'msg' => '账号错误!请联系管理员','data' => '']; } }catch (Exception $exception){ print_r($exception->getMessage()); return; } return $next($request);
七 : 在局部中间件中注册该中间件
protected $routeMiddleware = [ 'login' =>TokenMiddleWare::class, ];
八 : 按需在路由中调用即可
九 : 小程序app.js中插入
// 登录 wx.login({ success: res => { var code = res.code wx.getStorage({ "key" : "token", success(){ wx.request({ url : "http://127.0.0.1/laravel8/public/api/login", data : { code : code }, "method" : "POST", success(res){ var token = res.data.data wx.setStorage({ "key" : "token", "data" : token, success(){ wx.showToast({ title : "登录成功", icon : "success" }) } }) } }) },fail(){ wx.request({ url : "http://127.0.0.1/laravel8/public/api/login", data : { code : code }, "method" : "POST", success(res){ var token = res.data.data wx.setStorage({ "key" : "token", "data" : token, success(){ wx.showToast({ title : "注册成功", icon : "success" }) } }) } }) } }) } })
十 : 在login的控制器中插入
private $AppId = ''; private $AppSecret = ''; public function login(Request $request) { try { //接值 $code = $request->get('code'); //验证是否设置 if (!isset($code)){ return ['code' => 500,'msg' => '请重新进入小程序','data' => '']; } //拼接地址 $url = "https://api.weixin.qq.com/sns/jscode2session?appid={$this->AppId}&secret={$this->AppSecret}&js_code={$code}&grant_type=authorization_code"; //取出地址中的openid和session_key $res = $this->getUrl($url); //查询数据库中是否存在相同的openid $userInfo = ApiUsers::where('openid',$res['openid'])->get(); //不存在 if (!empty($userInfo)){ //组装用户信息 $userData = [ 'nickname' => md5(rand(1111,9999) . $res['openid']),//随机用户名 'openid' => $res['openid'],//唯一标识符 'image' => '', //默认为空 'phone' => '', //默认为空 'status' => 1 //默认为启用状态 ]; //执行添加入库 *** 作 $createUserInfo = ApiUsers::create($userData); //判断是否添加入库 if (!$createUserInfo){ //添加失败 return ['code' => 500,'msg' => '用户注册失败','data' => '']; }else{ //添加成功 获取token $token = TokenController::createToken($createUserInfo['id']); //返回 return ['code' => 200,'msg' => '注册成功','data' => $token]; } }else{ //存在用户 根据用户id霍去病token $token = TokenController::createToken($userInfo[0]['id']); //返回 return ['code' => 200,'msg' => '登录成功','data' => $token]; } }catch (Exception $e){ return ['code' => 500,'msg' => $e->getMessage(),'data' => '']; } } public function getUrl($url) { $headerArray = array("Content-type:application/json;", "Accept:application/json"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, $headerArray); $output = curl_exec($ch); curl_close($ch); $output = json_decode($output, true); return $output; }
END
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)