2016-11-14 5 views
7

승인 시스템을 PHP에 만들었고 JWT 토큰을 전달하는이 무기 체계를 발견했습니다. RFC 6750을 읽었습니다. 다음과 같은 의문점이 있습니다.베어러 토큰을 올바르게 사용하는 방법은 무엇입니까?

  1. 보안이 어떻게 향상 되었습니까?
  2. 서버는 인증 및 로그인이 성공한 후 JWT 토큰을 사용하여 클라이언트에 응답하고 클라이언트가 다른 요청을하면 실제로 어떻게 수행 할 것인지 명확하지 않으며 권한 부여에서 클라이언트의 토큰을 보내려고합니다. 헤더를 요청에 포함시켜야합니다. 이제 서버의 이전 응답에서받은 "Bearer"에 접두사를 붙여야하며, 그렇다면 서버가 Authorization 헤더를 받으면 그냥 공백으로 문자열을 분할하고 얻은 배열에서 두 번째 값을 가져온 다음 디코드를 수행 하시겠습니까? 예를 들어 Authorization: Bearer fdbghfbfgbjhg_something 일 경우 서버가이 문제를 어떻게 처리해야합니까? decodeFunc(explode(" ", $this->getRequest()->getHeader("Authorization"))[1])? 토큰이 URL을 전송 헤더에 전송되지 않은 경우,이 네트워크 시스템, 서버 로그에 의해 기록되기 때문에 보안을 1.Improving

답변

21

....

2.A 좋은 기능

/Bearer\s((.*)\.(.*)\.(.*))/ 

및 교류 : 무기명가 유효한 JWT 토큰의 경우

/** 
* Get hearder Authorization 
* */ 
function getAuthorizationHeader(){ 
     $headers = null; 
     if (isset($_SERVER['Authorization'])) { 
      $headers = trim($_SERVER["Authorization"]); 
     } 
     else if (isset($_SERVER['HTTP_AUTHORIZATION'])) { //Nginx or fast CGI 
      $headers = trim($_SERVER["HTTP_AUTHORIZATION"]); 
     } elseif (function_exists('apache_request_headers')) { 
      $requestHeaders = apache_request_headers(); 
      // Server-side fix for bug in old Android versions (a nice side-effect of this fix means we don't care about capitalization for Authorization) 
      $requestHeaders = array_combine(array_map('ucwords', array_keys($requestHeaders)), array_values($requestHeaders)); 
      //print_r($requestHeaders); 
      if (isset($requestHeaders['Authorization'])) { 
       $headers = trim($requestHeaders['Authorization']); 
      } 
     } 
     return $headers; 
    } 
/** 
* get access token from header 
* */ 
function getBearerToken() { 
    $headers = $this->getAuthorizationHeader(); 
    // HEADER: Get the access token from the header 
    if (!empty($headers)) { 
     if (preg_match('/Bearer\s(\S+)/', $headers, $matches)) { 
      return $matches[1]; 
     } 
    } 
    return null; 
} 
+0

그것은 멋진 기능, 당신이 제안,하지만 내가 복귀하고있는'$의 headers'는, 그것은해야합니다 말 : '무기명 ' 이제는 공간에 의해 문자열을 폭발시키고 실제 토큰을 가져 오는 것이 옳지 않습니까? 아니면 전체 문자열'(Bearer )'전체가 취해지기로되어 있습니까? –

+0

바로 ''입니다. 우주로 폭발 할 수 있습니다. –

+0

좋아요, 고마워요. –

0

내가 확인하기 위해 다음과 같은 정규식을 사용하는 것이 좋습니다 토큰을 얻을 수 있습니다 그것을 성냥과 함께 버리십시오 [1].

는 JWT-토큰의 구조, 참조 : https://jwt.io/

+1

Regex는 기존 PHP 문자열 함수를 사용할 수없는 경우가 아니면 항상 문자열 분석을위한 권장 방법이 아닙니다. –

+2

정규식은 패턴을 찾는 데 사용됩니다. Imo, regex를 사용하여 'Bearer '형식의 jwt 토큰을 파싱 할 수 있습니다. 이것이 토큰 유효성 검사와 관련하여 생각할 수있는 최선의 방법이라고 생각합니다. 대답은 Regex를 사용합니다. 나는 이것이 더 나은 정규 표현식을 가지고 있다고하더라도 왜 투표가 내려 졌는지 모르겠다. – Arvind