ошибка 401 после запроса в postman при любом запросе требующий авторизацию

вот кусок кода который может быть проблемой

// генерация jwt токена
function generateJWT($payload, $secret) {
  $header = json_encode(['alg'=>'HS256','typ'=>'JWT']);
  $payload = json_encode($payload);
  $base64UrlHeader = base64UrlEncode($header);
  $base64UrlPayload = base64UrlEncode($payload);
  $signature = hash_hmac('sha256', $base64UrlHeader.'.'.$base64UrlPayload, $secret, true);
  $base64UrlSignature = base64UrlEncode($signature);
  return $base64UrlHeader.'.'.$base64UrlPayload.'.'.$base64UrlSignature;
}

// проверка jwt токена
function verifyJWT($jwt, $secret) {
  $parts = explode('.', $jwt);
  if(count($parts) != 3) return false;
  list($headerB64, $payloadB64, $signatureProvided) = $parts;
  $signature = hash_hmac('sha256', $headerB64.'.'.$payloadB64, $secret, true);
  $base64UrlSignature = base64UrlEncode($signature);
  if($base64UrlSignature !== $signatureProvided) return false;
  $payload = json_decode(base64_decode(strtr($payloadB64, '-_', '+/')), true);
  if(!$payload) return false;
  if(isset($payload['exp']) && $payload['exp'] < time()) return false;
  return $payload;
}

Ответы (1 шт):

Автор решения: Арсен

Первое, что сразу бросается в глаза, в вашем примере отсутствует метод base64UrlEncode, возможно забыли скопировать и показать тут, но если его не будет, понятно,что алгоритм не сработает. Второй момент, вы сравниваете строки if($base64UrlSignature !== $signatureProvided) return false; т.е !== этот метод думаю неправильный т.к возможно у вас будут проблемы. В вашем случае наверно правильно будет использовать для сравнения hash_equals, слегка подкорректировал ваш пример:

function base64UrlEncode($data) {
    return str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($data));
}

function generateJWT($payload, $secret) {
    $header = json_encode(['alg' => 'HS256', 'typ' => 'JWT']);
    $payload = json_encode($payload);
    $base64UrlHeader = base64UrlEncode($header);
    $base64UrlPayload = base64UrlEncode($payload);
    $signature = hash_hmac('sha256', $base64UrlHeader . '.' . $base64UrlPayload, $secret, true);
    $base64UrlSignature = base64UrlEncode($signature);
    return $base64UrlHeader . '.' . $base64UrlPayload . '.' . $base64UrlSignature;
}

function verifyJWT($jwt, $secret) {
    $parts = explode('.', $jwt);
    if (count($parts) !== 3) return false;
    list($headerB64, $payloadB64, $signatureProvided) = $parts;
    $signature = hash_hmac('sha256', $headerB64 . '.' . $payloadB64, $secret, true);
    $base64UrlSignature = base64UrlEncode($signature);
    if (!hash_equals($base64UrlSignature, $signatureProvided)) return false;
    $payload = json_decode(base64_decode(strtr($payloadB64, '-_', '+/')), true);
    if (!$payload) return false;
    if (isset($payload['exp']) && $payload['exp'] < time()) return false;
    return $payload;
}
→ Ссылка