使用PHP从login.microsoftonline.com在JWT中验证签名
我正在尝试使用为网页设置单一登录服务 我有一些方法,我可以让他们的服务给我发送一个id_令牌,但我正在努力验证该令牌。当我从用户浏览器收到它时,而不是通过服务器到服务器的请求,我需要验证它,对吗 要获取令牌,我只需使用一个链接:使用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
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令牌]?