ошибка 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;
}