2016-11-14 35 views
7

PHP numaralı telefondan bir yetkilendirme sistemi yapıyorum ve JWT jetonlarını geçirmenin bu Bearer şemasına rastladım, RFC 6750'u okudum. Şu şüphelerim var:Taşıyıcı jetonları nasıl düzgün kullanılır?

  1. Bu güvenlik nasıl iyileştiriliyor?
  2. Sunucu, başarılı bir yetkilendirme ve oturum açmanın ardından istemciye bir JWT belirteci ile yanıt verir ve şimdi istemci başka bir istekte bulunduğunda, bunu nasıl yapacağımı bilmiyorum, Yetkilendirilen istemciden belirteci göndermek istiyorum istekte header, şimdi sadece "Bearer" öneki, sunucudan önceki yanıtta aldığım token öneki ve Evet ise, Yetkilendirme üstbilgisini alan sunucu dizgiyi yalnızca boşlukla bölmeli ve Elde edilen dizi ikinci değer ve daha sonra bunu çözmek? Örneğin, Authorization: Bearer fdbghfbfgbjhg_something, sunucunun bunu nasıl işleyeceği, decodeFunc(explode(" ", $this->getRequest()->getHeader("Authorization"))[1])? belirteç url gönderilen başlığında gönderilmezse, ağ sistemine, sunucusu günlük tarafından kaydedilir, çünkü güvenlik 1.Improving

cevap

21

....

2.A iyi işlev

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

ve ac: Hamiline geçerli bir jwt-belirteci eğer

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

Bu güzel fonksiyonu, sizin önerdiğiniz, ama ben dönüyorum '$ headers', O olacak ki:' Hamiline ' Şimdi, sadece dizgeyi boşluk ile patlatmak ve gerçek belirteci almak doğru mu, yoksa bütün dize '(Bearer )' nin bir bütün olarak ele alınması gerekiyor mu? –

+0

'' Bu doğru. Uzaya patlayabilirsin. –

+0

Tamam, teşekkürler, devam ediyor. –

0

Ben kontrol etmek için aşağıdaki RegEx kullanmak öneriyoruz belirteçleri almak için aynı zamanda maçlarla da [1].

Bu

bir JWT-Token yapıdır bkz: https://jwt.io/

+1

Regex, varolan PHP String işlevleriyle uyum sağlayamadığınız sürece her zaman dizgiyi ayrıştırma önerisi değildir. –

+2

Regex, kalıpları bulmak için kullanılır. Imo, 'Bearer ' biçimindeki jwt belirtecini ayrıştırmak için normal ifadeyi kullanabilirsiniz. Bu, belirteç doğrulama söz konusu olduğunda düşünebileceğim en iyi yaklaşım olduğuna inanıyorum. Kabul edilen cevap ayrıca Regex kullanıyor. Daha iyi bir regex'e sahip olsa bile neden bu kadar düşük oy kullandığını bilmiyorum. – Arvind

İlgili konular