Laravel API 即使通过身份验证也未通过身份验证
Laravel API response Unauthenticated even when Authentication is passed
我在登录时使用 jwt 创建令牌。登录后,我尝试点击 /me api 指向函数:
public function me()
{
$user = auth()->user();
return response()->json($user);
}
我遵循了 JWT 官方文档,最初我能够得到 API 的响应。突然它开始抛出一个
{
"message": "Unauthenticated."
}
为什么会这样??有什么解决方法吗?如果有人能提供帮助就太好了。
我尝试了文档设置并且工作正常,您可能在 api 调用中错过了通过身份验证 header。因为我知道你的设置是什么我只能告诉你什么时候登录,你应该在 api 调用中使用接收到的令牌进行身份验证。
PostMan 软件:在 header 选项卡中添加一个键作为 Authorization
并使用 Bearer
为值分配令牌,例如 Breaer token...
...
如需更多帮助,请说明您尝试 api 调用的方式。
编辑:添加了使用中间件的替代方法
实现或使用中间件的另一种方式:
使用 JWT 名称创建一个中间件并将下面的代码放在句柄函数中
Don't forget to import
use JWAuth;
public function handle($request, Closure $next)
{
JWTAuth::parseToken()->authenticate();
return $next($request);
}
然后在内核中将 jwt 添加到 $routeMiddleware 中,如下所示:
protected $routeMiddleware = [
// you should add below code.
'jwt' => \App\Http\Middleware\JWT::class,
];
在routes/api
Route::apiResource('/posts', 'PostController');
现在在 PostController 中像这样将中间件添加到 Constructor。
public function __construct()
{
$this->middleware('jwt', ['except' => ['index','show']]);
}
所以在构造中你将设置你的 middleware
基于 JWT,然后使用 except
你可以修改你的哪个函数不需要基于 JWT 令牌的身份验证。现在,当您使用 auth()->user()
时,您可以获得您的信息等
所以如果我有 index, show, update, delete, store, create
当我尝试做 API 调用 如果我使用 GET METHOD
为 url.com/posts
或 url.com/posts/23
我可以得到我的帖子不传递 JWT
令牌。
当您尝试使用 JWT
时,您应该意识到它是基于您传递的令牌工作的,您在使用登录时获得令牌,但您没有获得用户信息,因为您'没有将用户的令牌传递给应用程序,在所有这些之前,您应该考虑验证令牌然后执行其余逻辑。祝你好运。
编辑:添加了更多信息
auth.php
'defaults' => [
'guard' => 'api',
'passwords' => 'users',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
],
我在登录时使用 jwt 创建令牌。登录后,我尝试点击 /me api 指向函数:
public function me()
{
$user = auth()->user();
return response()->json($user);
}
我遵循了 JWT 官方文档,最初我能够得到 API 的响应。突然它开始抛出一个
{
"message": "Unauthenticated."
}
为什么会这样??有什么解决方法吗?如果有人能提供帮助就太好了。
我尝试了文档设置并且工作正常,您可能在 api 调用中错过了通过身份验证 header。因为我知道你的设置是什么我只能告诉你什么时候登录,你应该在 api 调用中使用接收到的令牌进行身份验证。
PostMan 软件:在 header 选项卡中添加一个键作为 Authorization
并使用 Bearer
为值分配令牌,例如 Breaer token...
...
如需更多帮助,请说明您尝试 api 调用的方式。
编辑:添加了使用中间件的替代方法
实现或使用中间件的另一种方式:
使用 JWT 名称创建一个中间件并将下面的代码放在句柄函数中
Don't forget to import
use JWAuth;
public function handle($request, Closure $next)
{
JWTAuth::parseToken()->authenticate();
return $next($request);
}
然后在内核中将 jwt 添加到 $routeMiddleware 中,如下所示:
protected $routeMiddleware = [
// you should add below code.
'jwt' => \App\Http\Middleware\JWT::class,
];
在routes/api
Route::apiResource('/posts', 'PostController');
现在在 PostController 中像这样将中间件添加到 Constructor。
public function __construct()
{
$this->middleware('jwt', ['except' => ['index','show']]);
}
所以在构造中你将设置你的 middleware
基于 JWT,然后使用 except
你可以修改你的哪个函数不需要基于 JWT 令牌的身份验证。现在,当您使用 auth()->user()
时,您可以获得您的信息等
所以如果我有 index, show, update, delete, store, create
当我尝试做 API 调用 如果我使用 GET METHOD
为 url.com/posts
或 url.com/posts/23
我可以得到我的帖子不传递 JWT
令牌。
当您尝试使用 JWT
时,您应该意识到它是基于您传递的令牌工作的,您在使用登录时获得令牌,但您没有获得用户信息,因为您'没有将用户的令牌传递给应用程序,在所有这些之前,您应该考虑验证令牌然后执行其余逻辑。祝你好运。
编辑:添加了更多信息
auth.php
'defaults' => [
'guard' => 'api',
'passwords' => 'users',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
],