2016-08-19 1 views
0

토큰 기반 인증을 시작하고 매우 간단한 PHP 스크립트를 작성하여 JWT를 작성했습니다. 그러나 jwt.io의 디버거에서 실행할 때 서명이 확인되지 않습니다.PHP에서 JWT 서명이 확인되지 않습니다.

JWT.io

$secret = "super_secure_private_key"; 

    function base64url_encode($data) { 
     return rtrim(strtr(base64_encode($data), "+/", "-_"), "="); 
    } 

    $header = base64url_encode(json_encode([ 
     "alg" => "HS256", 
     "typ" => "JWT" 
    ])); 

    $payload = base64url_encode(json_encode([ 
     "name" => "James Walker", 
     "privileges" => "total" 
    ])); 

    $signature = base64url_encode(hash_hmac("sha256", $header . "." . $payload, $secret)); 

    $token = $header . "." . $payload . "." . $signature; 

는 지금까지 내가 말할 수있는, 내 구현은 JWT의 서식 인라인입니다. 뭔가를 놓친 적이 있습니까? 예를 들어 도서관을 사용해야합니까? php-jwt를 사용하여 새 토큰을 생성하고 검증 할 수 있습니까?

동일한 코드를 사용하여 토큰을 직접 확인할 수 있기 때문에 제 구현에는 문제가 없을 수 있습니다. 하지만 jwt.io가 서명을 검증하지 않는 이유는 확실하지 않습니다.

답변

2

이 문제는 JWT 구현을 처음 작성했을 때 큰 두통을 낳았습니다. 트릭은 서명을 생성하는 키순 해시는 원시 이진 데이터를 출력해야하지만 기본 설정 인 hash_hmac은 그렇지 않습니다.

적인 raw_output : TRUE로 설정하면, 원시 출력 마지막 매개 변수 in the manual에 대한 정보를 참조하십시오

hash_hmac("sha256", $header . "." . $payload, $secret); 

hash_hmac("sha256", $header . "." . $payload, $secret, true); 

에 : 당신의 서명을 생성하는 방법을

변경 이진 데이터. 거짓 출력 소문자 수를

+0

정말 고마워요! 이제 작동하며 모든 서명이 검증됩니다. 매우 감사. – Ilmiont

+0

@Ilmiont 해피 코딩 * <모자 팁> * – BeetleJuice