【问题标题】:How to verify JWT signature in PHP?如何在 PHP 中验证 JWT 签名?
【发布时间】:2018-12-13 07:39:13
【问题描述】:

我有一个生成 JWT 的函数:

function getToken($user, $expTime){
   $jwt = \Firebase\JWT\JWT::encode([
     'iss' => request()->getBaseUrl(),
     'sub' => "{$user['id']}",
     'exp' => $expTime,
     'iat' => time(),
     'nbf' => time(),
     'is_admin' => $user['role_id'] == 1
 
  ], getenv("SECRET_KEY"), 'HS256');
 return $jwt;
}

此函数返回以下标记:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJcL2FwaSIsInN1YiI6InVzNWIzY2M4YmRlMDc4MSIsImV4cCI6NTUxMDY1ODkyNDAwMCwiaWF0IjoxNTMwNzM4NTkwLCJuYmYiOjE1MzA3Mzg1OTAsImlzX2FkbWluIjpmYWxzZX0.3bMaxCaMprURZEDurnckZWSoDRp7ePMxZXDW0B6q6fk P>

当我使用这个令牌发出请求时,我得到了:

{
  "status": "error",
  "message": "Signature verification failed"
}

为了让它工作,我去https://jwt.io/,添加密钥并通过传递秘密来验证它。

然后我得到这个令牌:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIvYXBpIiwic3ViIjoidXM1YjNjYzhiZGUwNzgxIiwiZXhwIjo1NTEwNjU4OTI0MDAwLCJpYXQiOjE1MzA3Mzg1OTAsIm5iZiI6MTUzMDczODU5MCwiaXNfYWRtaW4iOmZhbHNlfQ.heF_L9LrFp7Hht2dbVtOMx_gdUtmPKzrMgxW1_jdWLo P>

这很好用。但是如何使用 php 代码验证它,以便我可以将其发送给用户?

响应代码:

function loginUser($email, $password) {

    try {
        // Connecting to databas
        $db = new db();
        $db = $db->connect();

        $user = findUserByEmail($email, $db);

        if(empty($user)){
            echo 'User not found';
            exit;
        }
        if(!password_verify($password, $user['password'])) {
            echo 'Password does not match';
            exit;
        } 

        $expTime = time() * 3600;

        $jwt = getToken($user, $expTime);

        // Close databse
        $db = null;
        
    } catch(PDOException $e){
        echo $e->getMessage();
    }

    return $jwt;
}

【问题讨论】:

  • 发送此响应的代码在哪里?
  • 我更新了帖子,所以你可以看到代码。
  • 好的,但是,谁发送这个消息:"message": "Signature verification failed"?
  • 对不起,我忘了提。我将这个框架github.com/tuupola/slim-jwt-auth 用于身份验证系统。但我觉得没关系。思考的是如何验证密钥。
  • 此消息是在发出请求且令牌错误时从框架发送的。

标签: php jwt slim


【解决方案1】:

如果您因为“签名验证失败”的 Google 搜索而登陆此页面,则需要考虑一件事。我收到此错误是因为授权标头中的“Bearer”和我的令牌之间有两个空格。

错误:

Authorization:Bearer  eyJraWQiOiJDT2N...

正确:

Authorization:Bearer eyJraWQiOiJDT2N...

【讨论】:

    【解决方案2】:

    好的,最后我通过稍微更改生成令牌的函数使其工作:

    function getToken($user, $expTime){
        $key = "secretkey";
        $token = array(
          'iss' => request()->getBaseUrl(),
          'sub' => "{$user['id']}",
          'exp' => $expTime,
          'iat' => time(),
          'nbf' => time(),
          'is_admin' => $user['role_id'] == 1
      );
      return JWT::encode($token, $key);
    }
    

    【讨论】:

      猜你喜欢
      • 2016-12-27
      • 2014-05-29
      • 2016-07-10
      • 2016-08-28
      • 2016-12-27
      • 2016-04-17
      • 2019-11-14
      • 2022-10-31
      相关资源
      最近更新 更多