【问题标题】:Laravel API response Unauthenticated even when Authentication is passed即使通过了身份验证,Laravel API 响应也未通过身份验证
【发布时间】:2020-12-02 14:41:35
【问题描述】:

我在登录时使用 jwt 创建令牌。登录后,我尝试点击指向该函数的 /me api:

     public function me()
        {
            $user = auth()->user();
            return response()->json($user);
        }

我遵循了 JWT 官方文档,最初我能够获得 API 的响应。突然它开始抛出一个

{
    "message": "Unauthenticated."
}

为什么会这样??有什么解决方法吗?如果有人可以提供帮助,那就太好了。

【问题讨论】:

  • 你的中间件设置正确吗?
  • 它使用完全相同的设置工作?您使用的是邮递员吗?
  • 我完全按照 JWT 文档中推荐的方式进行操作,@Atlas-Pio
  • @Menawer。确切地。在我安装 hashids/hashids 包之前,它在相同的设置下工作正常。在我实现了 hashids 之后,它不断给出未经身份验证的消息。是的,我正在使用 Postman

标签: laravel jwt laravel-7 laravel-authentication laravel-jwt


【解决方案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 中像这样将中间件添加到构造函数中。

public function __construct()
{
    $this->middleware('jwt', ['except' => ['index','show']]);
}

因此,在构造中,您将基于 JWT 设置 middleware,然后使用 except,您可以修改您的哪个函数不需要基于 JWT 令牌进行身份验证。现在,当您使用auth()->user() 时,您可以获得您的信息等。

因此,如果我在尝试进行 API 调用时使用 GET METHOD 或 url.com/posts 或 url.com/posts/23 时有 index, show, update, delete, store, create,我可以在不传递 JWT 令牌的情况下获取我的帖子。

当您尝试使用JWT 时,您应该意识到它是基于您传递的令牌工作的,当您使用登录时您会获得令牌,但您没有获得用户信息,因为您没有传递用户的令牌到应用程序,在所有这些之前,您应该考虑验证令牌,然后执行其余的逻辑。祝你好运。

编辑:添加更多信息

auth.php

'defaults' => [
    'guard' => 'api',
    'passwords' => 'users',
],
'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],

【讨论】:

  • 感谢@Atlas-Pio。这引发了另一个错误“无法从请求中解析令牌”。知道这是什么吗?尝试了其他 StackOverflow 帖子中的所有修复。好像没用。
  • 之前我使用的是auth:api 中间件,并根据上述评论@Atlas-Pio 的指导对其进行了更改
  • 非常感谢。我用你的评论重新检查了它。我认为我的中间件设置不正确。无法弄清楚,因为我只是在学习 Laravel。非常感谢。你是救世主!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
  • 2018-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
相关资源
最近更新 更多