Laravel + JWT - 未找到用户

时间:2017-07-18 08:56:26

标签: laravel authentication jwt

我目前正在我的项目中实施JWT以支持各种API。此API仅适用于特定的model。这个模型使用我想要登录时声明的自定义守卫正常工作,我确保合同和可验证的特征已经正确应用,但->byId方法总是失败。这是我的代码:

namespace App;

class Customer extends Model implements Authenticatable {

    use \Illuminate\Auth\Authenticatable;

在我的jwt.php文件中,我已告诉它使用我的自定义模型:

'user' => \App\Customer::class,

执行时:

JWTAuth::fromUser($customer);

我收到了一个合适的令牌。

然后我使用Postman通过传递Authorization: Bearer <token>标题来检查它。令牌已正确设置。

对于对我的受保护路由的后续请求,然后我尝试以这种方式验证用户:

$token = JWTAuth::parseToken()->authenticate();

->authenticate()总是失败。

失败的原因是由于:

 if (! $this->auth->byId($id)) {
        return false;
 }

这总是返回false。

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

'identifier' => 'id',

为什么EloquentUserAdapter无法解析Customer的实例?

我已经搜索过Google并尝试了各种修复方法,但没有任何结果。任何帮助将不胜感激。

更新

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

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

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"

1 个答案:

答案 0 :(得分:0)

我设法找到了问题。

在幕后,JWT将使用您的模型生成令牌。但是,它没有通过该模型来照亮Auth Manager,它将在尝试验证模型时使用。

为此,我需要创建自己的AuthAdapter和Model(Customer)适配器:

AuthAdapter应该扩展JWT的AuthInterface

use Tymon\JWTAuth\Providers\Auth\AuthInterface;

class CustomerAuthAdapter extends AuthInterface {

当然,它必须实现AuthInterface所做的所有相同方法。

在此功能的byCredentialsbyId方法中,您应该将用户登录到应用程序中。这将确保稍后当JWT想要解析令牌并致电->authenticate()时,您的用户将可以Auth::guard('customer')->user()使用。出于您的目的,您可能不关心自定义后卫,只能使用Auth::user()(或auth() - &gt; user())。

您还需要提供自己的EloquentAdapter,这会扩展JWT UserInterface

use Tymon\JWTAuth\Providers\User\UserInterface;

class EloquentCustomerAdapter implements UserInterface

在此文件中,必须将Customer模型(对于我的示例)依赖项注入构造函数:

 public function __construct(Customer $user)

然后在jwt.php

中更新您的/config文件
'user' => '\Path\To\My\EloquentAdapter'

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

然后,您就可以针对byId模型(或您希望使用的任何自定义模型)验证令牌byCredentialsCustomer