我跟着this tutorial并且已经到了我正在解码返回的令牌并提取电子邮件地址(应该存储在 preferred_username 属性中)的地步,即以下代码:
decoded_token = Base64.urlsafe_decode64(encoded_token)
jwt = JSON.parse(decoded_token)
email = jwt['preferred_username']
问题是返回的对象不包含此属性,我回复的内容类似于以下内容:
{
"ver":"2.0",
"iss":"https://login.microsoftonline.com/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0",
"aud":"0ab6433e-84fc-469b-8c72-41f7a0241a61",
"exp":1458142389,
"iat":1458055989,
"at_hash":"0OYaLKpTTdHNBrQNOqwQ0Q",
"sub":"AAAAAAAAAAAAAAAAAAAAAC1TrOaOmvInYrFAyrQjlFI",
"tid":"9188040d-6c67-4c5b-b112-36a304b66dad"
}
快速浏览the spec表示我从Office 365获取了正确的对象,因为 preferred_username 被提及为潜在声明,但它不在我得到的对象中回来。
我可能没有使用正确的参数调用 get_token 函数,但是the documentation for the library is pretty sparse,所以我无法说出来。
I have raised an issue on Github.
这是Office 365端的错误,教程错误,还是我自己做错了什么?
答案 0 :(得分:1)
我尝试使用普通的HTTP请求重现此问题,但我可以成功获得 preferred_username 属性。
据我所知,只有在请求中指定 openid 范围时,我们才能获取此属性。为了缩小这个问题,我建议你尝试使用没有Ruby的Fiddler或Postman。
以下是使用网络浏览器和Fiddler获取id引用的测试:
从预览请求中替换身份验证代码,并使用Fiddler发布请求以获取令牌:
POST:https://login.microsoftonline.com/common/oauth2/v2.0/token grant_type = authorization_code&安培; CLIENT_ID = {客户端ID}&安培;范围= HTTPS%3A%2F%2Foutlook.office.com%2Fmail.read%20https%3A%2F%2Foutlook.office.com%2Fmail.send%20的的OpenID 强>&安培; REDIRECT_URI = HTTP%3A%2F%2Flocalhost%3A55065%2F&安培; client_secret = {ClientSecret}&安培;代码= {}校验码
从以下链接解码ID令牌:
然后我可以成功从ID令牌中获取preferred_username属性。
答案 1 :(得分:1)
来自Microsoft的Jason Johnston(本教程的作者)回答here:
Azure团队对其v2 auth端点部署了重大更改,导致preferred_username不存在。您需要在auth_helper.rb中将配置文件添加到SCOPES数组。我将在Build会议之后发布教程更新。
auth_helper.rb 中的SCOPES数组现在看起来像这样:
SCOPES = [ 'openid', 'https://outlook.office.com/mail.read', 'profile' ]