Laravel 拉威尔+;JWT-找不到用户

Laravel 拉威尔+;JWT-找不到用户,laravel,authentication,jwt,Laravel,Authentication,Jwt,我目前正在我的项目中实现JWT,以支持各种API。此API仅适用于特定的型号。当我想要登录时,使用我声明的自定义保护,这个模型可以正常工作,我已经确保契约和可验证特性得到了正确应用,但是->byId方法总是失败。这是我的密码: namespace App; class Customer extends Model implements Authenticatable { use \Illuminate\Auth\Authenticatable; 在我的jwt.php文件中,我告诉它

我目前正在我的项目中实现JWT,以支持各种API。此API仅适用于特定的
型号
。当我想要登录时,使用我声明的自定义保护,这个模型可以正常工作,我已经确保契约和可验证特性得到了正确应用,但是
->byId
方法总是失败。这是我的密码:

namespace App;

class Customer extends Model implements Authenticatable {

    use \Illuminate\Auth\Authenticatable;
在我的
jwt.php
文件中,我告诉它使用我的自定义模型:

'user' => \App\Customer::class,
return $app['tymon.jwt.provider.user'];
当我执行:

JWTAuth::fromUser($customer);
我收到一张合适的代币

然后,我使用Postman通过使用
Authorization:Bearer
标题传递它来检查这一点。令牌设置正确

对于对我的受保护路由的后续请求,我尝试以以下方式对用户进行身份验证:

$token = JWTAuth::parseToken()->authenticate();
->authenticate()
总是失败

它失败的原因是:

 if (! $this->auth->byId($id)) {
        return false;
 }
这总是返回false

但是,从
$id=$this->getPayload($token)->get('sub')解析
id
呼叫确实为我提供了此特定客户的有效ID。此外,该模型实际上是一个传统模型,其中PK是
id
列,并且我的标识符设置正确:

'identifier' => 'id',
为什么
雄辩的TuserAdapter
无法解析我的
客户的实例

我搜索了谷歌,尝试了各种各样的修复,但都没有结果。任何帮助都将不胜感激

更新

我已经转储了执行的SQL查询,它试图引用的表是我的默认用户模型,而不是我的自定义模型。为什么呢

更新2 绑定到UserInterface的
tymon.jwt.provider.user
singleton正确引用了我的自定义模型:

'user' => \App\Customer::class,
return $app['tymon.jwt.provider.user'];
规定:

EloquentUserAdapter {#849
    #user: Customer {#850
    #primaryKey: "id"
    #table: "customers"
更新3

在启动JWT用户提供程序时,它知道我要使用哪种型号:

$model = $app->make($this->config('user'));
收益率:

Customer {#1040
    #primaryKey: "id"
    #table: "customers"

我设法找到了问题所在

在引擎盖下,JWT将使用您的模型生成令牌。但是,它不会将该模型传递给Lightning的Auth Manager,在尝试验证该模型时将使用它的Auth Manager

为此,我需要创建自己的AuthAdapter和模型(客户)适配器:

AuthAdapter
应该扩展JWT的
AuthInterface

use Tymon\JWTAuth\Providers\Auth\AuthInterface;

class CustomerAuthAdapter extends AuthInterface {
当然,它必须实现与
AuthInterface
相同的所有方法

在该函数的
byCredentials
byId
方法中,您应该将用户登录到应用程序中。这将确保稍后当JWT想要解析令牌并调用
->authenticate()
时,您的用户将作为
Auth::guard('customer')->user()可用。出于您的目的,您可能不关心自定义保护,只需使用
Auth::user()
(或Auth()->user())

您还需要提供自己的
EloquentAdapter
,它扩展了JWT
用户界面

use Tymon\JWTAuth\Providers\User\UserInterface;

class EloquentCustomerAdapter implements UserInterface
在此文件中,必须将您的
Customer
模型(例如)依赖项注入构造函数:

 public function __construct(Customer $user)
然后在
/config

'user' => '\Path\To\My\EloquentAdapter'

'auth => '\Path\To\My\AuthAdapter'

然后,您将能够针对您的
客户
模型(或您希望使用的任何自定义模型)验证您的令牌
byId
byCredentials

尝试清除配置缓存artisan配置:clear@michail1982我试过了,没什么。