【问题标题】:Laravel + JWT - User Not FoundLaravel + JWT - 找不到用户
【发布时间】:2017-07-19 02:22:45
【问题描述】:

我目前正在我的项目中实现 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 = $this->getPayload($token)->get('sub'); 调用解析id 确实为我提供了此特定客户的有效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"

【问题讨论】:

  • 尝试清除配置缓存 artisan config:clear
  • @michail1982 我试过了,没用。

标签: laravel authentication jwt


【解决方案1】:

我已经设法找到了问题。

在后台,JWT 将使用您的模型生成令牌。但是,它不会将该模型传递给Illumina的授权管理器,它将在尝试验证模型时使用。

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

AuthAdapter 应该扩展 JWT 的 AuthInterface

use Tymon\JWTAuth\Providers\Auth\AuthInterface;

class CustomerAuthAdapter extends AuthInterface {

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

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

您还需要提供自己的 EloquentAdapter,它扩展了 JWT UserInterface

use Tymon\JWTAuth\Providers\User\UserInterface;

class EloquentCustomerAdapter implements UserInterface

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

 public function __construct(Customer $user)

然后在/config 中更新您的jwt.php 文件

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

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

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

【讨论】:

    猜你喜欢
    • 2017-06-07
    • 2020-08-26
    • 2013-03-25
    • 1970-01-01
    • 2019-01-12
    • 2021-07-01
    • 2021-09-28
    • 2016-03-13
    相关资源
    最近更新 更多