【问题标题】:Laravel JWT Auth Token invalid / Signature could not be verifiedLaravel JWT Auth Token 无效/无法验证签名
【发布时间】:2017-04-03 23:23:20
【问题描述】:

我已经厌倦了这个错误。现在卡了 2 天。

我确实收到了有效凭据上的令牌,但我的令牌仍然无效,无论我是通过 url 参数 (?token=[token]) 还是作为 Auth 标头 (Bearer: [token]) 传递它。 有人还在经历这个吗?我遵循了教程中的所有内容。还在我的公用文件夹和我的 apache 配置中配置了 .htaccess

Route::get('/test', function () {
  return JWTAuth::parseToken()->authenticate();
});

走这条路返回

NamshiAdapter.php 第 71 行中的 TokenInvalidException: 无法验证令牌签名。 对于查找,这是来自我的 AuthController.php 的身份验证方法

public function authenticate(Request $request) {
    $credentials = $request->only('email', 'password');

    $user = User::where('email', Input::get('email'))->first();

    try {
        if (!$token = JWTAuth::attempt($credentials)) {
            return $this->respondUnauthorized();
        }
    } catch (JWTException $e) {
          return $this->respondInternalError('Could not create token!');
    }
    // dd()
    return $this->respond([
        'token' => compact('token'),
        'user' => $user]);
}

我的路由中间件组:

Route::group(['middleware' => ['jwt.auth', 'jwt.refresh']], function() {

当我在我的 NamshiAdapter 中检查第 71 行并且我 dd() 我的令牌时,它说我的秘密是空的......

一定有什么问题吗?这只是一个小错误还是我遗漏了什么?

【问题讨论】:

  • 您需要在配置文件夹内的 jwt.php 中设置 api 密码... laravel 将生成令牌,但由于密钥不存在,因此无法验证,因此应用程序不知道它是否是合法的令牌
  • 你跑php artisan jwt:secret了吗?
  • 两者都做了,还尝试为jwt生成密钥,没有自动设置(这是另一个错误),手动设置没有问题..@g3ek1337
  • 出于好奇,您使用的是哪个版本的 JWT?因为我遇到了一些类似的问题,最终成为namshi/jose 版本与另一个包创建问题并且无法验证令牌。
  • 嗯,我相信它是 0.5.9..?在我的 composer.json 它说 ">=0.5".. 我在哪里可以检查确切的版本?我尝试使用作曲家更新来更新它。 @g3ek1337

标签: laravel jwt


【解决方案1】:

我遇到了同样的问题

解决办法就是jycr753所说的……“在jwt.php中设置api密码”

其实config/jwt.php上,有'secret' => env('JWT_SECRET'),这一行,

  • 用这个助手php artisan jwt:generate生成密钥(由于某种原因,我不知道为什么它不像php artisan key:generate那样在.env文件本身中设置)。

  • 复制不带括号的密钥 (jwt-auth secret [DSvO98YtJ0204mBu9zqWN9QOMX7Tmvr9] set successfully.) 并将其添加到 .env 文件中,例如 JWT_SECRET=DSvO98YtJ0204mBu9zqWN9QOMX7Tmvr9 或者您可以在 jwt.php secret' => env('DSvO98YtJ0204mBu9zqWN9QOMX7Tmvr9') 中直接更改它

【讨论】:

  • 最后一行应该是 env('JWT_SECRET', 'DSvO98YtJ0204mBu9zqWN9QOMX7Tmvr9')
  • 在你有'secret' => env('JWT_SECRET')的行中的文件config/jwt.php中,使用命令php artisan jwt:generate生成密钥后,复制该密钥可能与我的不同并替换JWT_SECRET jwt.php 文件
  • 并确保在生成新的 JWT_SECRET 后通过 auth 端点重新生成 auth 用户令牌
【解决方案2】:

在 Laravel 5.5 中(以我为例):

1- 运行命令:

php artisan jwt:secret

你应该看到这个结果:

jwt-auth secret [mygeneratedsecret] 设置成功。

2-复制括号(mygeneratedsecret)之间的秘密并将其添加到.env文件中,如下所示:

JWT_SECRET=mygeneratedsecret

3- 确保您的配置文件jwt.php 的密码设置如下:

'secret' => env('JWT_SECRET'),

重要提示:

不要忘记重新生成令牌(使用您的登录脚本或您使用的任何东西),因为旧令牌(在秘密配置之前) 对新密钥仍然无效

快乐编码:)

【讨论】:

    猜你喜欢
    • 2020-05-11
    • 2018-11-28
    • 2020-05-11
    • 2019-01-02
    • 2017-09-18
    • 2020-12-15
    • 2021-03-02
    • 1970-01-01
    • 2016-10-20
    相关资源
    最近更新 更多