设置应用的 Laravel 身份验证有几个要求。
您似乎选择了 Sanctum 作为您的身份验证提供者。
编辑:我似乎忽略了用户使用 Tymon/JWT-Auth 而不是 Passport/Sanctum 的事实。请在下面查看我的拆分答案。
根据sanctum documentation,您需要将 HasApiTokens 特征添加到您的用户模型类(您的用户模型缺少此特征)。此 trait 使您的模型能够发出访问令牌(通过 createToken() 方法)
(对于 Tymon/JWT-Auth,您需要遵循他们的 documentation 用户模型要求。)
此外,在您的 app/Http/Controllers/AuthController.php 中,
您的登录方法使用 auth()->attempt() 函数根据存储在数据库中的凭据来验证用户的凭据。这个特定的函数将始终返回真/假,因此将结果存储在 $token 变量中没有帮助,如下所示:
if (!$token = auth()->attempt($credentials)) {
你需要做的是:
护照/圣所:
检查尝试()是否成功(即,将其包装在 if/else 块中)然后自己发出访问令牌:
if (auth()->attempt($credentials)) {
$user = Auth::user();
$token = $user->createToken('Your Token Name');
return $this->respondWithToken($token);
} else {
return response()->json(['error' => 'Unauthorized'], 401);
}
对于 TYMON/JWT-AUTH:
Tymon/Jwt-Auth 通过在成功时返回令牌或在失败时返回 false 来更改尝试 () 函数的工作方式,因此,将您的 login() 代码更改为:
$token = auth()->attempt($credentials);
if($token === false){
return response()->json(['error' => 'Unauthorized'], 401);
}
return $this->respondWithToken($token);
其他用户注意事项:我使用了 sksmsWKd 的自定义 respondWithToken 包装函数来返回令牌,但显然您可以根据需要只返回 $token 本身。即:
return response()->json(['token' => $token]);
至于您的 config/auth.php 配置,将默认保护设置为“web”是非常标准的。 Web Guard 在应用导航期间使用 cookie 来携带访问令牌。
希望以上对你有所帮助。
问候,
弗里茨。