tp6jwt:JWT-AUTH · tp6-jwtauth · 看云https://www.kancloud.cn/sfzl/tp6-jwtauth/2481656
第一步安装:
composer require thans/tp-jwt-auth
第二步安装扩展:
php think jwt:create
此举将生成jwt.php和.exe文件,jwt.php里可以更改配置信息(app/config/jwt.php)比如jwt过期时间.
return [
'secret' => env('JWT_SECRET'),
//Asymmetric key
'public_key' => env('JWT_PUBLIC_KEY'),
'private_key' => env('JWT_PRIVATE_KEY'),
'password' => env('JWT_PASSWORD'),
//JWT time to live(默认是60)
'ttl' => env('JWT_TTL', 86400),
//Refresh time to live
'refresh_ttl' => env('JWT_REFRESH_TTL', 20160),
//JWT hashing algorithm
'algo' => env('JWT_ALGO', 'HS256'),
//token获取方式,数组靠前值优先
'token_mode' => ['header', 'cookie', 'param'],
//黑名单后有效期
'blacklist_grace_period' => env('BLACKLIST_GRACE_PERIOD', 10),
'blacklist_storage' => thans\jwt\provider\storage\Tp5::class,
];
这里表示已经存在,可以直接使用.
/**
* 登录接口
* @param Request $request
* @return false|string|\think\response\Json
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function login(Request $request){
try {
$data = input();
//独立验证器
validate(\app\homeapi\validate\Login::class)->check($data);
$list = Db::name('user')->where('user',$data['user'])->find();
if ($list){
if ($data['pwd']==$list['pwd']){
//参数为用户认证的信息,请自行添加
$token = JWTAuth::builder(['id' => $list['id']]);
//记录日志
Log::record($list['id'].'登录了');
return success(200,'登录成功',['token'=>$token]);
}else{
abort(2002,'密码错误');
}
}else{
abort(2002,'用户名错误');
}
}catch(HttpException $exception){
//fail/success是自己封装的接口格式
return fail(2002,$exception->getMessage());
}catch (ValidateException $e) {
// 验证失败 输出错误信息
return fail(2002,$e->getError());
}
}
在中间件里只需要简单的两三行代码就可以解决:
<?php
declare (strict_types = 1);
namespace app\adminapi\middleware;
use thans\jwt\exception\TokenInvalidException;
use thans\jwt\facade\JWTAuth;
use think\Response;
class login
{
/**
* 处理请求
*
* @param \think\Request $request
* @param \Closure $next
* @return Response
*/
public function handle($request, \Closure $next)
{
try {
//可以获取请求中的完整token字符串
$tokenStr = JWTAuth::token()->get();
//可验证token, 并获取token中的payload部分
$payload = JWTAuth::auth();
return $next($request);
}catch (\Error $e){
//fail(common文件中自己封装的接口格式)
return fail(2002,'请先登录');
}catch (TokenInvalidException $exception){
return fail(2002,'无效的Token');
}
}
}
这里需要引入try{}catch(){},给出对应的提示
对应的提示是“请先登录”
?
?对应的是“Token值无效”,这里我手动在令牌里删减了一部分值导致出现的结果,可以看出明显的效果。
这里表示token已经过期
?退出登录:
public function logout(){
try {
//获取token
$token = JWTAuth::token()->get();
//放入黑名单
JWTAuth::invalidate($token);
return fail('201','退出登录');
}catch (\Error $exception){
return fail('202','没有获取到token值');
}
}
只需要把获取到的token值放入到黑名单中就可以做到让token失效的效果。
详情可跳转:JWT-AUTH · tp6-jwtauth · 看云
|