一 : 下载第三方插件
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



