Laravel + dingoapi + jwt 用户认证无法正确指定 guard 的解决办法

原文链接

由于项目需要,api 端的登录使用的是 users 之外的另一张表,在配置了Dingo Apijwt 之后,发现登录之后获取的用户是users表中的,这里使用的中间件是Dingo Apiapi.auth。当然,直接使用框架的auth:api中间件是没有问题的,但是这样一来是有违使用Dingo的初衷,二来是返回的错误信息永远是Unauthenticated

于是研究了一下这两个扩展的源码,过程很无聊也很漫长,虽然问题很快就找到了,但是没找到合适(或者说优雅的)解决办法,总感觉Dingo整合jwt不是很完美,或者有可能是没有及时作出更新,也不知道对不对。下面是我的解决办法:

写了一个中间件,然后在 api.auth 之前调用,来更改 Guard 的绑定:

<?php

namespace App\Http\Middleware;

use Closure;

class BindJWTGuard
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        app()->instance(\Illuminate\Contracts\Auth\Guard::class, auth('api'));
        return $next($request);
    }
}

也看见有同学说动态修改配置,改掉默认的guard,这当然也能实现啦!

本文章首发在 Laravel China 社区