我在登录时使用jwt创建令牌。登录后,我尝试点击/ me api指向该函数:
public function me()
{
$user = auth()->user();
return response()->json($user);
}
我遵循了JWT的官方文档,最初我能够获得API的响应。突然,它开始抛出一个
{
"message": "Unauthenticated."
}
为什么会这样?有什么解决方法吗?如果有人可以帮助,那就太好了。
答案 0 :(得分:1)
我尝试了文档设置并且工作正常,您可能会错过在api调用中传递身份验证标头的权限。由于idk是什么设置,我只能在登录时才能知道,因此您应该在具有身份验证的api调用中使用接收到的令牌。
PostMan软件:在标题选项卡中,添加一个密钥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']]);
}
因此,在构造中,您将基于JWT设置middleware
,然后使用except
来修改哪些功能不需要基于JWT令牌进行身份验证。现在,当您使用auth()->user()
时,您可以获得信息或其他信息。
因此,如果我在尝试index, show, update, delete, store, create
或GET METHOD
使用url.com/posts
来进行API调用时遇到了url.com/posts/23
,则无需传递{{1} }令牌。
当您尝试使用JWT
时,您应该意识到它是基于您传递的令牌而工作的,使用登录名时您会获得令牌,但是由于您没有获得用户信息,因此未获得用户信息将用户的令牌传递给应用,在进行所有这些操作之前,您应该考虑先验证令牌,然后再进行其余的逻辑操作。祝你好运。
编辑:添加了更多信息
auth.php
JWT