我使用 jwt 在登录时创建令牌。登录后,我尝试点击指向该函数的 /me api:
public function me()
{
$user = auth()->user();
return response()->json($user);
}
我遵循了 JWT 官方文档,最初我能够得到 API 的响应。突然它开始抛出
{
"message": "Unauthenticated."
}
为什么会出现这种情况?有什么解决方法吗?如果有人能帮忙那就太好了。
我尝试了文档设置,效果很好,您可能错过了在 API 调用中传递身份验证标头。由于我不知道你的设置是什么,我只能说,当你登录时,你应该使用 API 调用中收到的令牌进行身份验证。
PostMan 软件:在标题选项卡中添加一个键作为
Authorization
并使用 Bearer
为值分配令牌,例如 Bearer token...
...
如需更多帮助,请说明您如何尝试 api 调用。
编辑:添加了使用中间件的替代方法
另一种实现或使用中间件的方法:
创建一个名为JWT的中间件,并将以下代码放入handle函数中
不要忘记导入
JWTAuth
。
use JWTAuth;
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 中将中间件添加到构造函数中,如下所示。
public function __construct()
{
$this->middleware('jwt', ['except' => ['index','show']]);
}
因此,在构造函数中,您将基于 JWT 设置
middleware
,然后使用 except
您可以修改哪一个函数不需要基于 JWT 令牌进行身份验证。现在当您使用auth()->user()
时,您可以获取您的信息等。
因此,如果我尝试进行 API 调用时有
index, show, update, delete, store, create
,如果我使用 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',
],
],
如果有人遇到同样的问题,并且所选的解决方案确实可以解决它。检查以下内容:如果您继续respose{“message”:“未经身份验证”。解决方案是将其添加到根文件夹的 .htaccess 中(不仅在公共文件夹内)
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]