Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP从login.microsoftonline.com在JWT中验证签名_Php_Azure_Active Directory_Single Sign On_Jwt - Fatal编程技术网

使用PHP从login.microsoftonline.com在JWT中验证签名

使用PHP从login.microsoftonline.com在JWT中验证签名,php,azure,active-directory,single-sign-on,jwt,Php,Azure,Active Directory,Single Sign On,Jwt,我正在尝试使用为网页设置单一登录服务 我有一些方法,我可以让他们的服务给我发送一个id_令牌,但我正在努力验证该令牌。当我从用户浏览器收到它时,而不是通过服务器到服务器的请求,我需要验证它,对吗 要获取令牌,我只需使用一个链接: https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize?client_id=[myclientid]&response\u type=id\u令牌和重定向\u uri=https://l

我正在尝试使用为网页设置单一登录服务

我有一些方法,我可以让他们的服务给我发送一个id_令牌,但我正在努力验证该令牌。当我从用户浏览器收到它时,而不是通过服务器到服务器的请求,我需要验证它,对吗

要获取令牌,我只需使用一个链接:

https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize?client_id=[myclientid]&response\u type=id\u令牌和重定向\u uri=https://localhost/ssotest.php&response_mode=form_post&scope=openid+配置文件和状态=12345&nonce=678910

(对于那些试图这样做的读者,我花了很长时间才找到,但您可以在此处设置您的客户id:)

然后,该页面将数据发布到我的脚本中,如下所示:

array(3) {
  ["id_token"]=>
  string(1026) "abc.def.geh"
  ["state"]=>
  string(5) "12345"
  ["session_state"]=>
  string(36) "dd7781aa-74e8-4aa8-ac7e-d3800c5c2247"
}
从那时起,我根据句点/句号将ID标记拆分为标题、正文和签名

然后,我可以解码标题:

["typ"]=> string(3) "JWT"
["alg"]=> string(5) "RS256"
["kid"]=> string(27) "MnC_VZcATfM5pOYiJHMba9goEKY" 
和机构:

["aud"]=> string(36) "[client_id]"
["iss"]=> string(75) "https://login.microsoftonline.com/52f161e7.../v2.0"
["iat"]=> int(1466523280)
["nbf"]=> int(1466523280)
["exp"]=> int(1466527180)
["ipaddr"]=> string(15) "111.111.111.111"
["name"]=> string(12) "Mr E Xample"
["nonce"]=> string(6) "678910"
["oid"]=> string(36) "c3beeb42..."
["preferred_username"]=> string(23) "email@example.co.uk"
["sub"]=> string(43) "oGAnGQ..."
["tid"]=> string(36) "52f161e7..."
["ver"]=> string(3) "2.0"
现在我有了一个签名,但我真的不知道该怎么处理它。我知道我可以从
https://login.microsoftonline.com/common/discovery/v2.0/keys
由标题中的
孩子指定,但我不确定这有什么帮助。因为我知道公钥,我想我需要用它来解密签名-是吗

当然,必须有一种方法来发送服务器到服务器的请求,以验证从客户端发送给我的信息?例如,
GEThttps://login.microsoftonline.com/verfifytoken/[令牌]

我建立了谷歌SSO,与此相比,这是一件轻而易举的事——我肯定我遗漏了一些东西,但它确实看起来太复杂了

任何帮助都将不胜感激-我已经阅读了很多小时的文档了!如果可能的话,我真的希望避免使用库来实现这一点,这样我就可以完全理解正在发生的事情

因为我知道公钥,我想我需要用它来解密签名-是吗

实际上,您需要做的是自己验证签名


alg
属性告诉您算法是RS256,即rsa256。我不是Python爱好者,但快速搜索会将我指向(不确定这个库是否是最好的…)可以验证签名的地方。消息是JWT的前两个块(由“.”分割),签名是第三个块。

根据我的经验,我们可以在你的头中使用[Authorization]:id_token。你可以用这个头请求你的应用程序URL(你使用URL注册应用程序)。威尔,我认为你的意思不是“授权”“:id\u令牌,但授权:承载者[id\u令牌]?