2015-08-21 184 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,然后它将验证标头,声明以及是否添加公钥或私钥(具体取决于服务器验证签名),它也将验证智威汤逊的签名。

相关问题