在laravel8框架中除了登录的路由不用使用token验证,然后当我们进入其他控制器的时候都需要进行token验证,为了确保用户是否登录
首先我们需要先生成一个token中间件
php artisan make:middleware MiniLogin
如果想让多个路由继承这个中间件的话就设置一个分组中间件
//设置小程序分组中间件
'MiniLogin'=>[
MiniLogin::class
],
然后在路由中让想继承的路由进行继承
//小程序分组中间件
Route::group(['middleware'=>['MiniLogin']],function (){
//列表
Route::get('liebiao',[\App\Http\Controllers\LiebiaoController::class,'liebiao'])->name('liebiao');
});
小程序调用接口获取手机验证码请参考:
https://blog.csdn.net/stringQiang/article/details/117406574
当用户登录成功后生成token
composer require firebase/php-jwt
//签发Token
public function lssue(Request $request)
{
$user =$request->session()->get('user') ; //key
$key = '1314'; //key
$time = time(); //当前时间
$token = [
'iss' => 'http://www.helloweba.net', //签发者 可选
'aud' => 'http://www.helloweba.net', //接收该JWT的一方,可选
'iat' => $time, //签发时间
'nbf' => $time , //(Not Before):某个时间点后才能访问,比如设置time+30,表示当前时间30秒后才能使用
'exp' => $time+7200, //过期时间,这里设置2个小时
'data' => [ //自定义信息,不要定义敏感信息
'id' => $user['id'],
'phone' => $user['phone']
]
];
return JWT::encode($token, $key); //输出Token
}
这里比如需要在小程序列表进行token验证,则需要在小程序js中的自动加载方法中将登录成功存入缓存的token取出来然后一块传入后台。
小程序跳转到tabar页面的方法
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
//因为后台做了jwt的token验证,索引这里需要将存入缓存的token取出来然后发送到后台做一个安全验证
var jwt=wx.getStorageSync('jwt');
if(jwt ==""){
//这里需要注意的是wxwx.navigateTo只能跳转普通的页面,如果跳转tabar页面是没有反应的,如果非得跳转tabar页面,可以使用wx.switcaTab方法
wx.switchTab({
url: '/pages/index/index',
})
return false;
}
var _thih=this;
wx.request({
url: 'http://day531.week2.com/liebiao',
data:{
page:_thih.data.page,
limit:_thih.data.limit,
token:jwt
},
success:function(res){
//console.log(res.data.data.data)
var add = res.data.data.data;
var count = res.data.data.total;
//console.log(count)
_thih.setData({
data:add,
count:count
});
}
})
},
然后在从小程序中获取过来的token进行解析验证用户id
use \Firebase\JWT\JWT; //导入JWT
public function handle(Request $request, Closure $next)
{
//将用户从小程序js中发送过来的token接收过来,然后进行一个验证
$jwt=$request->input('token');
//print_r($jwt);die();.
$key = '1314'; //key要和签发的时候一样
JWT::$leeway = 60;//当前时间减去60,把时间留点余地
$decoded = JWT::decode($jwt, $key, ['HS256']); //HS256方式,这里要和签发的时候对应
//$uid=$decoded->data->userid;
$arr = (array)$decoded;
$id=$arr['data']->id;
//从session中获取出来登录成功存入的用户id,进行对比,解析出来的id和登录成功存入session中的id一样则整明是同一用户在登录
$res=$request->session()->get('user');
$ids=$res['id'];
if ($ids == $id){
//因为小程序走的是接口,所以这里因该返回三要素,然后小程序js拿到值之后再惊醒相应的操作
return ['code'=>200,'data'=>$res];
}else{
return ['code'=>502,'data'=>''];
}
}