TP6 JWT封装

1、使用命令行创建安装插件   https://www.kancloud.cn/sfzl/tp6-jwtauth/248165

composer require thans/tp-jwt-auth

2、更改配置文件  在config/jwt.php

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,
];

3、在登录出生成token  引入 

use thans\jwt\facade\JWTAuth;
/**
     * 登录接口
     * @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
                    $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());
        }
    }

4、中间件使用   将中间件 放在路由出使用

Route::group(function (){
    #内容展示
    Route::any('show','News/shows');
#发布时间
    Route::get('time','News/time');
#赞
    Route::get('zan','News/zan');
#浏览
    Route::get('lan','News/lan');
    #热点
    Route::get('hot','News/hot');
})->allowCrossDomain()->middleware(\app\api\middleware\Check::class);
<?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');
        }
    }
}

5、退出登录

public function logout(){
        try {
            //获取token
            $token = JWTAuth::token()->get();
            //放入黑名单
            JWTAuth::invalidate($token);
            return fail('201','退出登录');
        }catch (\Error $exception){
            return fail('202','没有获取到token值');
        }
 
    }

6、获取token值配置伪静态  在public/.htaccess

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
TP6中使用JWT的方法如下所示[^1][^2]: 1. 首先,使用Composer安装JWT库: ```shell composer require firebase/php-jwt ``` 2. 在TP6的配置文件`config/jwt.php`中,配置JWT的相关参数,例如密钥、过期时间等: ```php return [ // 密钥 'secret' => 'your-secret-key', // 过期时间(单位:分钟) 'expire' => 60, ]; ``` 3. 创建一个JWT工具类,例如`app\utils\JwtUtil.php`,用于生成和验证JWT: ```php <?php namespace app\utils; use Firebase\JWT\JWT; use think\facade\Config; class JwtUtil { // 生成JWT public static function generateToken($data) { $config = Config::get('jwt'); $payload = [ 'iss' => 'your-issuer', 'aud' => 'your-audience', 'iat' => time(), 'exp' => time() + $config['expire'] * 60, 'data' => $data, ]; $token = JWT::encode($payload, $config['secret']); return $token; } // 验证JWT public static function verifyToken($token) { $config = Config::get('jwt'); try { $decoded = JWT::decode($token, $config['secret'], ['HS256']); return $decoded->data; } catch (\Exception $e) { return false; } } } ``` 4. 在需要使用JWT的地方,调用`JwtUtil`类的方法进行生成和验证JWT: ```php <?php namespace app\controller; use app\utils\JwtUtil; class UserController { // 生成JWT public function generateJwt() { $data = [ 'user_id' => 1, 'username' => 'admin', ]; $token = JwtUtil::generateToken($data); return $token; } // 验证JWT public function verifyJwt($token) { $data = JwtUtil::verifyToken($token); if ($data) { // 验证通过 return $data; } else { // 验证失败 return 'Invalid token'; } } } ``` 以上是TP6中使用JWT的方法,通过配置文件和自定义的JWT工具类,可以方便地生成和验证JWT

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值