tymon/jwt 只能使用默认的 auth.php 中 defaults.guard 吗?

我有如下的一个中间件:

use Auth;
use Closure;
use Tymon\JWTAuth\Exceptions\JWTException;
use Tymon\JWTAuth\Http\Middleware\BaseMiddleware;
use Tymon\JWTAuth\Exceptions\TokenExpiredException;
class Authenticate extends BaseMiddleware
{
    public function handle($request, Closure $next){
        if( $request->url()==route('lva.login') ){
            return $next($request);
        }
        // 检查此次请求中是否带有 token,如果没有则抛出异常。
        try {
            $this->checkForToken($request);
        } catch (\Throwable $th) {
            return response()->json(['message'=>'未登录'],401);
        }
        try {
            if ($this->auth->parseToken()->authenticate()) {
                return $next($request);
            }    
            // 刷新用户的 token
            $token = $this->auth->refresh();
            // 使用一次性登录以保证此次请求的成功
            $this->auth->onceUsingId(
                $this->auth->manager()->getPayloadFactory()->buildClaimsCollection()->toPlainArray()['sub']
            );
            //更新请求中的token
            $request->headers->set('Authorization','Bearer '.$token);
        } catch (JWTException $exception) {
            // 如果捕获到此异常,即代表 refresh 也过期了,用户无法刷新令牌,需要重新登录。
            return response()->json(['message'=>'登录超时'],401);
        }
        // 在响应头中返回新的 token
        return $this->setAuthenticationHeader($next($request), $token);
    }
}

默认的 auth.php 中的 defaults.guard 是web
在不修改 auth.php 中的 guard 的前提下 如何实现 验证 guard 是 api 的情况呢
使用 $this->auth = \Auth::guard(‘api’) 不行 会出现

Method [authenticate] does not exist.

使用

config(['auth.defaults.guard'=>'api'])

可以 但是不想这么用. 有其他好的方法吗。

jwt
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

表示 7.x 的 airlock 挺香

4年前 评论
讨论数量: 16

file

file 中间件参数传递guard

4年前 评论
一念之间 (楼主) 4年前
fangmuke (作者) 4年前
一念之间 (楼主) 4年前

\Auth::guard (‘api’) 这个不能打印出来吗?打印出来可以看下是什么;还有Method [authenticate] does not exist.这个不是提示方法验证不存在?

4年前 评论
一念之间 (楼主) 4年前
uax

@crazy airlock 没办法刷新吧。还有验证有效期。 翻了翻源码没找到数据库中和生成的 token 验证。

4年前 评论
sodasix 4年前
萧晔离

airlock好像问题还挺多的 我在新项目中测试使用,分用户表登录,管理后台用session和admins表,api接口用token和users表,经常在api接口返回admins表里的同ID用户数据 登录方法都是单独写的,还有其他好多地方会冲突,不适合分表登录使用

4年前 评论
一念之间 (楼主) 4年前

你好,请问这个问题你最终有解决方案吗?

3年前 评论

@yjy1200 只要继承了 Tymon\JWTAuth\Http\Middleware\BaseMiddleware 无需关心auth.php的default guard
Laravel Version: 8.5.7
Laravel Framework Version: 8.21.0
Jwt Auth Version: 1.0.2
PHP Version: 7.4.11

file

file

file

file

3年前 评论

@fangmuke 那可能是版本问题,我用的是6.X,tymon/jwt-auth 1.0 然后自定义中间件 继承 JWT 的 BaseMiddleware ,$this->auth 默认使用的依然是web 。

3年前 评论

楼主咋解决的

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!