【问题标题】:laravel jwt-auth Token is Invalidlaravel jwt-auth 令牌无效
【发布时间】:2016-10-20 05:29:58
【问题描述】:

我在 Laravel 中使用 tymondesigns/jwt-auth 构建了一个 api 来验证用户。

我按照github 上的教程进行操作,登录正常:

public function login() {
        if (!$token = JWTAuth::attempt(Input::only('email', 'password'))) {
            return response()->json(['error' => true], HttpResponse::HTTP_UNAUTHORIZED);
        }

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

        return response()->json(array(
            'user' => $user, 
            'token' => compact('token')['token'])
        );
    }

对于响应,我得到了令牌。

但每次我尝试使用我得到的令牌时:

[
  "Token is invalid"
]

即:

public function getUser() {
        $token = JWTAuth::getToken();
        return response()->json(JWTAuth::toUser($token));
    }

这是一个到 {{url}}/api/getUser 的 GET,标题为 Authorization: Bearer {{token}}

我的 routes.php 包含以下内容:

Route::group(array('prefix' => 'api'), function() {
    Route::post('/login', 'API\UserController@login');
    Route::get('/getUser', ['before' => 'jwt-auth', 'uses' => 'API\UserController@getUser']);
});

我怎样才能使它与令牌一起工作?我在这里遗漏了什么吗?

更新:

我得到了这样的令牌:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjEsImlzcyI6Imh0dHA6XC9cL3NtYXJ0YXBwXC9hcGlcL2xvZ2luIiwiaWF0IjoxNDY2Mjc5ODUxLCJleHAiOjE0NjYyODM0NTEsIm5iZiI6MTQ2NjI3OTg1MSwianRpIjoiYjNkZjViZGNiMjQ2YWU0NzVlZDYwODQxMWFlZDNkMTAifQ.pqU0pWKVzmOel51ObyE9vKLk07tefh2lDE-fp-AOavE

在我检查https://jwt.io 上的令牌后,我得到了无效的签名。 为什么我得到无效签名,我怎样才能使它有效?

【问题讨论】:

  • routes.php 文件的内容是什么?
  • 我将路线添加到我的问题中,请参阅编辑
  • 你到底是如何传递令牌的?你在用邮递员吗?令牌应该不带大括号 {{ }} 传递。
  • 是的,我正在使用 Postman。我的头部授权示例:Bearer eyJ0eXAiOiJKV1QiLCJ......
  • Postman 中,您应该转到 Headers 选项卡,然后将 Authorization 代替 keyBearer eyJ0eXAiOiJKV1QiLCJ... in value 的位置。我希望你这样做。

标签: php laravel jwt


【解决方案1】:

试试这个

public function getUser() {
  // set the token on the object

  JWTAuth::parseToken();

  // get the user from token
  $user = JWTAuth::parseToken()->authenticate();

  return response()->json(compact('user'));
}

【讨论】:

  • 同样的问题。即使我从路线中获取 'before' => 'jwt-auth' 。我得到了同样的错误
  • 你使用的是哪个版本的 Laravel?尝试在@linuxartisan 的回答中将中间件用作'middleware' => 'jwt.auth'
  • 我使用的是 laravel 5,我的路由有 jwt.auth 'Route::get('/getUser', ['before' => 'jwt-auth', 'uses' => 'API\UserController@getUser']);'
【解决方案2】:

试试这个,

定义一个构造函数,这样您就可以在该类中使用 $this->jwtauth->toUser() 来获取用户,而无需在函数中重复使用 JWTAuth $jwtauth。

private $jwtauth;

public function __construct(JWTAuth $jwtauth)
{
    $this->jwtauth = $jwtauth;
}

public function getUser()
{
    $user = $this->jwtauth->toUser();
    return response($user);
}

【讨论】:

    【解决方案3】:

    你可以这样做:

        public function login() {
             if (!$token = JWTAuth::attempt(Input::only('email', 'password'))) {
                return response()->json(['error' => true], 
            HttpResponse::HTTP_UNAUTHORIZED);
           }
    
        $user = User::where('email', Input::get('email'))->first();
    
        return response()->json(array(
            'user' => $user, 
            'token' => compact(['token'])
        );
    }
    

    【讨论】:

      猜你喜欢
      • 2020-05-11
      • 2021-09-08
      • 2020-07-04
      • 2018-11-28
      • 2022-01-17
      • 2021-04-13
      • 2017-01-06
      • 2021-09-25
      • 2018-10-21
      相关资源
      最近更新 更多