2015-08-21 226 views
4

我已按照此處的說明獲取Web API的訪問令牌。從Azure Active Directory驗證JWT

https://msdn.microsoft.com/en-us/library/azure/dn645542.aspx

我有這個工作,但該文件是模糊的,當談到搞清楚如何驗證在PHP中的令牌。

您可以使用響應中返回的訪問令牌對受保護的資源(例如Web API)進行身份驗證。通常,使用RFC 6750中介紹的承載方案將令牌呈現給Web API。HTTP規範說明了如何在HTTP請求中使用承載令牌來訪問受保護的資源。

當Web API接收並驗證令牌時,它爲本地客戶端應用程序提供對Web API的訪問權限。

如何在應用程序中驗證JWT?我有一個使用PHP openssl_verify()函數與令牌,signiture,密鑰和算法PHP框架,但我收到的時候我使用私鑰從天青與SHA256算法錯誤:

openssl_verify(): supplied key param cannot be coerced into a public key 

這使我相信我在PHP中用來驗證的關鍵是不正確的。目前,我正在使用爲Active Directory應用程序生成的私鑰,當碰到oauth2 /令牌url時,碰巧也是我用於「client_secret」參數的相同值(任何其他值都不會導致令牌被生成,所以這可能是正確的)。

的關鍵是類似(但它實際上不是):

cLDQWERTYUI12asdqwezxctlkjpoiAn7yhjeutl8jsP= 

哪裏beleive OpenSSL的需要有一個證書......如果是這樣,我似乎無法找到這個地方證書是在Azure門戶。

我在這裏錯過了什麼?我應該使用openssl_verify()來驗證JWT以及我在Azure中找到它的關鍵是什麼?

感謝

-

UPDATE:

我發現這裏的公共密鑰:https://login.windows.net/common/discovery/keys

不過,我仍然無法使用提供驗證簽名的X5C。你如何在PHP中做到這一點?

-

更新2:

我使用的轉換來創建同時使用的 'e' 和 'n' 參數的公共密鑰爲.pem文件。這收到了一個公鑰。

error:0906D06C:PEM routines:PEM_read_bio:no start line 

回答

6

關閉這個問題,因爲我已經從原始的問題上感動:

現在用它解密,當我打開SSL錯誤。用我的問題更新了我的問題,顯示了我的進展。

創造了新的具體問題一個新的問題:How do I verify a JSON Web Token using a Public RSA key?

-

萬一它可以幫助別人:

欲瞭解更多信息,解決獲取公鑰從微軟在PHP我做了以下內容:

$string_microsoftPublicKeyURL = 'https://login.windows.net/common/discovery/keys'; 

$array_publicKeysWithKIDasArrayKey = loadKeysFromAzure($string_microsoftPublicKeyURL); 


function loadKeysFromAzure($string_microsoftPublicKeyURL) { 
    $array_keys = array(); 

    $jsonString_microsoftPublicKeys = file_get_contents($string_microsoftPublicKeyURL); 
    $array_microsoftPublicKeys = json_decode($jsonString_microsoftPublicKeys, true); 

    foreach($array_microsoftPublicKeys['keys'] as $array_publicKey) { 
     $string_certText = "-----BEGIN CERTIFICATE-----\r\n".chunk_split($array_publicKey['x5c'][0],64)."-----END CERTIFICATE-----\r\n"; 
     $array_keys[$array_publicKey['kid']] = getPublicKeyFromX5C($string_certText); 
    } 

    return $array_keys; 
} 


function getPublicKeyFromX5C($string_certText) { 
    $object_cert = openssl_x509_read($string_certText); 
    $object_pubkey = openssl_pkey_get_public($object_cert); 
    $array_publicKey = openssl_pkey_get_details($object_pubkey); 
    return $array_publicKey['key']; 
} 

它更好但是要將這些內容緩存到磁盤,以免每次都加載這些內容,但這只是一個簡單的示例。

然後,使用公鑰數組,檢查'kid'值的JWT頭以找到正確的公用證書進行驗證,並在openssl_verify()中的參數3中使用。我使用JWT類爲我處理這個問題。

使用上面創建的公鑰數組和JWT類應該允許您驗證Microsoft JWT。

鏈接到JWT類從火力點:https://github.com/firebase/php-jwt

呼叫JWT ::解碼與智威湯遜,該公鑰陣列的參數2和陣列只是「RS256」的PARAM三個參數1。

JWT::decode($string_JSONWebToken, $array_publicKeysWithKIDasArrayKey, array('RS256')); 

如果JWT無效或返回一個解密的JWT供您使用(並檢查聲明),這將引發異常。

+0

看起來你已經解決了這個問題在http://stackoverflow.com/questions/32185238/how-do-i-verify-a-json-web-token-using-a-public-rsa-key和如果你能在這裏總結解決方案的關鍵點,那麼會更好,那麼其他有類似問題的社區會從這個線索中受益。 –

1

如果要驗證jwt然後轉到jwt.io 這將允許您粘貼JWT,然後它將驗證標頭,聲明以及是否添加公鑰或私鑰(具體取決於服務器驗證簽名),它也將驗證智威湯遜的簽名。

相關問題