2016-11-14 9 views
7

私はPHPの認証システムを作っています。私はこのベアラー方式でJWTトークンを渡しました。私はRFC 6750と読みました。私は次の疑問を持っています:ベアラトークンを正しく使うには?

  1. これはどのようにセキュリティを改善していますか?
  2. サーバーは、認証とログインが成功した後、JWTトークンを使用してクライアントに応答します。クライアントが別の要求を行ったときに、実際にそれを行う方法がわかりません。認証からクライアントへトークンを送信します。私が前の応答で受け取ったトークンに接頭辞 "Bearer"を接頭辞として付ける必要があります。そうであれば、Authorizationヘッダーを受け取ったサーバは、単に文字列をスペースで分割し、得られた配列から2番目の値を取り出し、それをデコードしますか?たとえばAuthorization: Bearer fdbghfbfgbjhg_somethingのように、サーバーでこれを処理する方法は、decodeFunc(explode(" ", $this->getRequest()->getHeader("Authorization"))[1])ですか?トークンは、URLで送信されたヘッダーで送信されない場合、それはネットワークシステム、サーバログで記録されますので、セキュリティを1.Improving

答えて

21

....

2.A良い機能それは有効な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

を得るために、私は、確認するには、次の正規表現を使用することをお勧めします:

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

と交流をマッチ[1]でそれをやめる。

これは、JWT・トークンの構造を参照してくださいです:https://jwt.io/

+1

Regexは、既存のPHP文字列関数を使用できない限り、文字列の解析には常に推奨される方法ではありません。 –

+2

正規表現を使用してパターンを検索します。あなたはregexを使って 'Bearer 'の形式のjwtトークンを解析することができます。私はこれがトークンの検証になると思います。受け入れられた答えはRegexも使用します。私はなぜこれが良い正規表現を持っていても投票されたのか分からない。 – Arvind

関連する問題