tp6官方jwt---Token认证

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失效的效果。

RewriteCond  %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

****想要在中间件中获取到token值需要在伪静态中添加这两行代码

详情可跳转:JWT-AUTH · tp6-jwtauth · 看云


原文连接:https://blog.csdn.net/Follow_found/article/details/122283750

相关推荐

国产API管理神器Apifox全面提升开发效率

这款国产API神器工具也太强了吧...让我放弃了postman

忘掉Postman,Apifox更好用

超越Postman,新一代国产调试工具Apifox,用起来够优雅

功能强大的国产Api管理工具

全栈开发提效神器——ApiFox(Postman + Swagger + Mock + JMeter)

Postman使用AES加密并更换请求body

Postman如何设置成中文?(汉化)

难怪大家丢掉了postman而选择 Apifox

好用到爆,IDEA 版 Postman 面世了,功能强大

前端后端的爱恨情仇--续集

Postman for API Automation Testing Ⅰ

前端后端的爱恨情仇

纯 Java 撸个后台管理系统,这框架用起来贼好

好用到爆!IDEA 版 Postman 面世了,功能真心强大

IT大牛:Apifox和Apipost有什么区别?到底谁更牛?

如何使用postman做接口测试(菜鸟级攻略)

一文搞定 Postman 接口自动化测试

Apifox:节省研发团队的每一分钟

【Elasticsearch】- elasticsearch索引的创建、查询和删除