Laravel 拉威尔+;JWT-找不到用户
我目前正在我的项目中实现JWT,以支持各种API。此API仅适用于特定的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文件中,我告诉它
型号
。当我想要登录时,使用我声明的自定义保护,这个模型可以正常工作,我已经确保契约和可验证特性得到了正确应用,但是->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我试过了,没什么。