我已按照此处的说明获取Web API的访问令牌。
https://msdn.microsoft.com/en-us/library/azure/dn645542.aspx
我有这个工作,但在弄清楚如何在PHP中验证令牌时,文档是模糊的。
您可以使用响应中返回的访问令牌对受保护资源(例如Web API)进行身份验证。通常,使用承载方案在HTTP请求中将令牌呈现给Web API,这在RFC 6750中有所描述。该规范解释了如何在HTTP请求中使用承载令牌来访问受保护资源。
当Web API接收并验证令牌时,它为本机客户端应用程序提供对Web API的访问权。
如何在应用程序中验证JWT?我有一个PHP框架,它使用PHP openssl_verify()函数与令牌,签名,密钥和算法但我收到错误,当我使用Azure的私钥与SHA256算法时:
openssl_verify(): supplied key param cannot be coerced into a public key
这让我相信我在PHP中使用的密钥验证不正确。目前,我使用的是为Active Directory应用程序生成的私钥,它恰好也是我用于" client_secret"的相同值。点击oauth2 / token url时的参数(任何其他值都不会导致生成令牌,因此这可能是正确的。)
密钥类似于(但不是实际):
cLDQWERTYUI12asdqwezxctlkjpoiAn7yhjeutl8jsP=
我相信openssl需要有证书......如果是这样,我似乎无法找到此证书在Azure门户中的位置。
我在这里缺少什么?我应该使用openssl_verify()验证JWT以及在Azure中哪里找到它的关键是什么?
由于
-
更新
我在这里找到了公钥:https://login.windows.net/common/discovery/keys
但是我仍然无法使用提供的X5C来验证签名。你是如何用PHP做的?
-
更新2:
我使用转换为公钥创建.pem文件,同时使用' e'和' n'参数。这收到了公钥。
现在,在使用它解密时,我会收到OPEN SSL错误:
error:0906D06C:PEM routines:PEM_read_bio:no start line
答案 0 :(得分:9)
关闭这个问题,因为我已经从原始问题转移了。更新了我的问题,其中的评论显示了我的进步。
为新的特定问题创建了一个新问题:How do I verify a JSON Web Token using a Public RSA key?
-
万一它可以帮助其他任何人:
有关使用PHP从Microsoft获取公钥的解决方案的更多信息,我执行了以下操作:
$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'];
}
然而,最好将这些缓存到磁盘,这样你就不会每次加载它们,但这只是一个如何做到这一点的简单例子。
然后,使用公钥数组,检查'孩子的JWT标题。用于查找要验证的正确公共证书的值,并在openssl_verify()中的参数3中使用它。我使用JWT课程来处理这个问题。
使用上面创建的这个公钥数组和JWT类应该允许你验证微软的JWT。
从firebase链接到JWT类:https://github.com/firebase/php-jwt
使用你的JWT的param 1,这个公钥数组的param 2和只有' RS256'的数组中的三个来调用JWT :: Decode。
JWT::decode($string_JSONWebToken, $array_publicKeysWithKIDasArrayKey, array('RS256'));
如果JWT无效或者返回解密的JWT供您使用(并检查声明),这将抛出异常。
答案 1 :(得分:1)
如果您想验证jwt,请转到jwt.io 这将允许您粘贴JWT,然后它将验证标题,声明,如果您添加公钥或私钥(取决于服务器如何验证签名),它还将验证JWT的签名。