Как проверить подпись JWT в PHP? - PullRequest
0 голосов
/ 05 июля 2018

У меня есть функция, которая генерирует 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

Когда я использую этот токен для запроса, я получаю:

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

Чтобы заставить его работать, я иду к https://jwt.io/,, добавляю ключ и проверяю его, передавая секрет.

Тогда я получаю этот токен:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIvYXBpIiwic3ViIjoidXM1YjNjYzhiZGUwNzgxIiwiZXhwIjo1NTEwNjU4OTI0MDAwLCJpYXQiOjE1MzA3Mzg1OTAsIm5iZiI6MTUzMDczODU5MCwiaXNfYWRtaW4iOmZhbHNlfQ.heF_L9LrFp7Hht2dbVtOMx_gdUtmPKzrMgxW1_jdWLo

И это отлично работает. Но как проверить это с помощью 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;

}

1 Ответ

0 голосов
/ 05 июля 2018

Хорошо, наконец, я сделал это, немного изменив функцию, которая генерирует токен:

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);
}
...