我目前正在我的项目中实施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"
答案 0 :(得分:0)
我设法找到了问题。
在幕后,JWT将使用您的模型生成令牌。但是,它没有通过该模型来照亮Auth Manager,它将在尝试验证模型时使用。
为此,我需要创建自己的AuthAdapter和Model(Customer)适配器:
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() - &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
模型(或您希望使用的任何自定义模型)验证令牌byCredentials
或Customer