从Office 365返回的OAuth2令牌不包含preffered_username声明

时间:2016-03-15 15:45:59

标签: ruby-on-rails ruby json office365api oauth2

我跟着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端的错误,教程错误,还是我自己做错了什么?

2 个答案:

答案 0 :(得分:1)

我尝试使用普通的HTTP请求重现此问题,但我可以成功获得 preferred_username 属性。

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

以下是使用网络浏览器和Fiddler获取id引用的测试:

  1. 使用Office 365帐户(可以参考教程)在门户中注册应用程序
  2. 通过以下链接在网络浏览器中获取身份验证码: https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id= {客户端ID}&安培; RESPONSE_TYPE =代码&安培; REDIRECT_URI = {的redirectUrl}&安培; response_mode =查询&安培;范围= HTTPS%3A%2F%2Foutlook.office.com%2Fmail.read%20https%3A%2F%2Foutlook .office.com%2Fmail.send%20的的OpenID &安培;状态= 12345
  3. 从预览请求中替换身份验证代码,并使用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}&安培;代码= {}校验码

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

    https://jwt.io/

  5. 然后我可以成功从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' ]