0

我按照本教程进行了操作,已经到了我正在解码返回的令牌并提取电子邮件地址(应存储在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"
}

快速浏览一下规范表明我从 Office 365 中获取了正确的对象,因为首选用户名被提及为潜在的声明,但它不在我返回的对象中。

有可能我没有使用正确的参数调用get_token函数,但是该库的文档非常稀疏,所以我无法确定。

我在 Github 上提出了一个问题。

这是 Office 365 端的错误、教程错误还是我自己做错了什么?

4

2 回答 2

1

我尝试使用正常的 HTTP 请求重现此问题,但是我可以成功获取preferred_username属性。

据我所知,只有在请求中指定了openid范围时,我们才能获取此属性。为了缩小这个问题的范围,我建议你尝试在没有 Ruby 的情况下使用 Fiddler 或 Postman。

这是使用 Web 浏览器和 Fiddler 获取 id 令牌供您参考的测试:

  1. 使用Office 365账号在门户中注册应用(可参考教程)
  2. 通过以下链接在网络浏览器中获取身份验证代码: https ://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id= {ClientID}&response_type=code&redirect_uri={RedirectURL}&response_mode=query&scope=https %3A%2F%2Foutlook.office.com%2Fmail.read%20https%3A%2F%2Foutlook.office.com%2Fmail.send%20 openid &state=12345
  3. 替换预览请求中的身份验证代码并使用 Fiddler 发布请求以获取令牌:

    发布:https: //login.microsoftonline.com/common/oauth2/v2.0/token grant_type=authorization_code&client_id={ClientID}&scope=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}&code={AuthCode}

  4. 从以下链接解码 ID 令牌:

    https://jwt.io/

然后我可以成功地从 ID 令牌中获取 preferred_username 属性。

于 2016-03-16T08:50:51.530 回答
1

Microsoft 的 Jason Johnston(本教程的作者)在回答:

Azure 团队对其 v2 身份验证端点部署了一项重大更改,这导致了 preferred_username 不存在。您需要将配置文件添加到 auth_helper.rb 中的 SCOPES 数组。在 Build 会议之后,我将发布对教程的更新。

auth_helper.rb 中的SCOPES数组现在如下所示:

SCOPES = [ 'openid', 'https://outlook.office.com/mail.read', 'profile' ]
于 2016-03-16T12:56:36.487 回答