2016-11-14 39 views
7

Robię system autoryzacji w PHP, i natknąłem się na ten system okaziciela przekazywania żetonów JWT, przeczytałem RFC 6750. Mam następujące wątpliwości:Jak prawidłowo używać tokenów na okaziciela?

  1. Jak to poprawia bezpieczeństwo?
  2. Serwer odbiera klienta z tokenem JWT w swoim ciele po pomyślnej autoryzacji i zalogowaniu, a teraz, gdy klient wysyła kolejne żądanie, nie wiem, jak to zrobić, chcę wysłać token od klienta w autoryzacji nagłówek w żądaniu, więc teraz powinienem przedrostkiem "Nosić" do tokenu, który otrzymałem w poprzedniej odpowiedzi od serwera i Jeśli tak, to serwer po otrzymaniu nagłówka Authorization, powinien po prostu podzielić ciąg z spacją i wziąć drugą wartość z uzyskanej tablicy, a następnie ją odkodować? Na przykład: Authorization: Bearer fdbghfbfgbjhg_something, w jaki sposób serwer ma sobie z tym poradzić, decodeFunc(explode(" ", $this->getRequest()->getHeader("Authorization"))[1])?

Odpowiedz

21

1.Improving bezpieczeństwa, ponieważ jeśli znak nie jest przesyłana w nagłówku, który wysłał w adresie URL, zostanie on zarejestrowany przez system sieci, log serwera ....

2.A dobra funkcja dostać okaziciela tokeny

/** 
* 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

Jest to miły funkcji, sugerowali, ale '$ headers' wracam, to będzie, powiedzieć:' okaziciela ' więc czy jest to słuszne, aby po prostu rozbić łańcuch przez spację i wziąć rzeczywisty token, lub cały ciąg '(Bearer )" ma być traktowany jako całość? –

+0

'' To prawda. Możesz eksplodować w kosmosie. –

+0

Dobra, dziękuję, idźcie z tym. –

0

polecam użyć następującego wyrażenia regularnego, by sprawdzić, czy jest to prawidłowy JWT-żeton:

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

i ac go również z zapałkami [1].

Jest to struktura JWT token, zobaczyć: https://jwt.io/

+1

Regex nie zawsze jest polecanym podejściem do analizy łańcucha parsowania, chyba że nie można uzyskać zgodności z istniejącymi funkcjami PHP String. –

+2

Regex służy do znajdowania wzorów. Imo, możesz użyć wyrażenia regularnego do przeanalizowania tokenu jwt, który ma format "Nośnik ". Uważam, że jest to najlepsze podejście, jakie mogę wymyślić, jeśli chodzi o walidację tokena. Przyjęta odpowiedź używa również Regex. Nie wiem, dlaczego to jest przegłosowane, nawet jeśli ma lepsze wyrażenie regularne. – Arvind