当前位置: 首页 > 知识库问答 >
问题:

Laravel-JWT身份验证无法从请求中解析令牌

任文乐
2023-03-14

我在中间件中添加了以下代码,用于JWT Auth的用户身份验证,这对于中间件处理的所有路由都很有效。

public function handle($request, Closure $next)
{
    if ($request->has('token')) {
        try {
            $this->auth = JWTAuth::parseToken()->authenticate();
            return $next($request);
        } catch (JWTException $e) {
            return redirect()->guest('user/login');
        }
    }
}

但是对于一个使用Post方法的路由,令牌被正确传递,但我仍然得到:

JWTException-无法从请求中分析令牌

在我尝试的同一路线上:

public function handle($request, Closure $next)
{
    if ($request->has('token')) {
        try {
            dd($request->input('token'));
            $this->auth = JWTAuth::parseToken()->authenticate();
            return $next($request);
        } catch (JWTException $e) {
            return redirect()->guest('user/login');
        }
    }
}

输出:

"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9iaXNzIjoiaHR0cDpcL1wvbG9jYWxob3N0OjgwMDFcL2F1dGhcL2xvZ2luIiwiaWF0IjoxNDcyNTI4NDU0LCJleHAiOjE0NzI1MzIwNTQsIm5iZiI6MTQ3MjUyODQ1NCwianRpIjoiM2E0M2ExYTZlNmM5NjUxZDgxYjZhNDcxMzkxODJlYjAifQ.CH8ES2ADTCrVWeIO8uU31bGDnH7h-ZVTWxrdXraLw8s"

我能够看到我用来访问其他路由的有效令牌,并且该令牌在所有其他路由上都能正常工作。

提前感谢!!!

共有3个答案

龚联
2023-03-14

通过向. htaccess中添加ReWriteLaw^-[E=HTTP_AUTHORIZATION:%{HTTP: Authoration}]来修复它,因此授权头不会被Laravel丢弃。将此添加到文档中可能有用。

松德曜
2023-03-14

我在ec2 amazon AMI Linux php7.2 apache2.4上也遇到了同样的问题,但令牌在apache请求头中生成,但在Laravel请求头中不可见,因此在中间件中添加此代码这将只在服务器上工作,但在本地主机上可能不工作。

 $headers = apache_request_headers();
 $request->headers->set('Authorization', $headers['authorization']);

JWT中间件

    try {
            $headers = apache_request_headers(); //get header
            $request->headers->set('Authorization', $headers['authorization']);// set header in request

            $user = JWTAuth::parseToken()->authenticate();
        } catch (Exception $e) {
            if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenInvalidException){
                return response()->json(['status' => 'Token is Invalid']);
            }else if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenExpiredException){
                return response()->json(['status' => 'Token is Expired']);
            }else{
                return response()->json(['status' => 'Authorization Token not found']);
            }
        }
李甫
2023-03-14

根据您的描述,我检查了JWT Auth的源文件。

在类Tymon\JWTAuth\JWTAuth第191-219行中,有两个函数:

/**
 * Parse the token from the request.
 *
 * @param string $query
 *
 * @return JWTAuth
 */
public function parseToken($method = 'bearer', $header = 'authorization', $query = 'token')
{
    if (! $token = $this->parseAuthHeader($header, $method)) {
        if (! $token = $this->request->query($query, false)) {
            throw new JWTException('The token could not be parsed from the request', 400);
        }
    }

    return $this->setToken($token);
}

/**
 * Parse token from the authorization header.
 *
 * @param string $header
 * @param string $method
 *
 * @return false|string
 */
protected function parseAuthHeader($header = 'authorization', $method = 'bearer')
{
    $header = $this->request->headers->get($header);

    if (! starts_with(strtolower($header), $method)) {
        return false;
    }

    return trim(str_ireplace($method, '', $header));
}

检查它们的逻辑,我相信你的请求头没有正确提供。

if (! $token = $this->parseAuthHeader($header, $method)) { // all your get method not passed this step
   if (! $token = $this->request->query($query, false)) { // all your post method stucked here 
       throw new JWTException('The token could not be parsed from the request', 400);
   }
}

格式正确的标题如下所示:

http POST http://${host}/api/v1/product/favorite/111 "Authorization: Bearer ${token}"

这就是我能提供给你的一切,希望它能帮助你克服你的想法。如果不行,您仍然可以调试这两个函数。

 类似资料:
  • 编辑: 阅读有关bug的讨论:https://github.com/tymondesigns/jwt-auth/issues/83 我原来的问题是: 我正在使用jwt auth my protected resources实现,该资源需要经过身份验证的用户,代码如下: 当用户在API上登录时,将创建一个授权令牌,并将响应授权标头发送到调用资源的客户端应用程序。因此,客户端应用程序在截获任何响应的头

  • 我有一个LaravelAPI(实际上是LumenAPI)服务于VueJS前端。Vue应用程序允许用户登录到谷歌。然后将Google令牌发送回Lumen API,后者使用Google验证令牌,然后验证电子邮件地址是否为有效用户。然后它生成一个令牌,与用户一起存储在数据库中,并返回用户对象。 我没有使用Passport或jwt auth之类的东西。那么现在,我如何使用默认的Auth中间件来验证(现在已

  • 我正在开发一个具有自己的身份验证和授权机制的REST应用程序。我想使用JSON Web Tokens进行身份验证。以下是有效且安全的实现吗? < li >将开发一个REST API来接受用户名和密码并进行认证。要使用的HTTP方法是POST,因此没有缓存。此外,在传输时还会有安全SSL < li >在认证时,将创建两个JWTs访问令牌和刷新令牌。刷新令牌将具有更长的有效期。这两个令牌都将写入coo

  • 我在做一个全堆栈的web应用程序。我的前端由angular-cli组成,后端由node+Express构建。

  • 我正在尝试向正在运行的本地服务器发出GET请求。我无法返回正确的数据,我看到“未经授权”的响应。如果字符串“token”是正确的,那么任何人都能发现任何明显的问题吗。 }* 我能够从命令行获得一个curl请求:

  • } 要获取令牌,我执行以下步骤: > 使用浏览器转到:http://localhost:9000/oauth/authorize?response_type=code&client_id=test&redirect_uri=http%3a%2f%2flocalhost%3a8080%2f&scope=write 首先,它将我重定向到一个登录表单,在那里我输入用户名和密码:admin abc 请帮我