我正在尝试从我们的 Ruby on Rails 应用程序(特别是日历读取 API)访问 Office 365(图形 API)。我们将omniauth 用于我们的OAuth2 流程,因此,我们也尝试使用omniauth-office365 访问Graph API。和 omniauth-microsoft-office365 gem 。但是到目前为止,我还没有能够获得使用这些 gem 的访问 token 。
我已在 Application Registration Portal 中注册了我们的应用程序,但任何时候我想获得 Calendars.Read 权限(使用范围“配置文件 https://graph.microsoft.com/calendar.read”),我总是得到错误 AADSTS65005: The client application has requested access to resource 'https://graph.windows.net/'. This request has failed because the client has not specified this resource in its requiredResourceAccess list
.阅读更多关于此的文章,我觉得我需要真正通过 Azure AD,所以我注册了。但似乎我必须在 Azure 仪表板中注册一个全新的 Web 应用程序,该应用程序没有指向先前创建的应用程序的链接。我试了一下,但结果只有 AADSTS70002: Error validating credentials. AADSTS50011: The reply address 'https://example.com/auth/office365/callback?code=AQABA...a_very_long_string&session_state=e1029a3b-f6a5-4e7a-940e-18a21ee4c44f' does not match the reply address 'https://example.com/auth/office365/callback' provided when requesting Authorization code.
错误。
我处于完全困惑的地步。解决这个问题并让它发挥作用的正确方法是什么?我不可能真的需要通过 Azure AD,对吗?那么应用程序注册门户的重点是什么?如果有人能提供一些启示,那就太好了……
谢谢,帕斯卡
最佳答案
好的,经过多次摆弄,我终于掌握了一些东西。访问不同 API 的方法有很多,每一种方法都有自己的特定版本,而且每一种方法都有大量过时的“这就是你的做法”文章,这也无济于事。
让我总结一下我是如何让一切正常工作的以及吸取的教训。
https://outlook.office.com/
,而所有示例均引用基数 https://graph.microsoft.com
.切换到 this Ruby sample 中包含的 microsoft_v2_auth gem让我更进一步。 AADSTS65005
似乎与范围的确切“措辞”有关。我见过像 :scope => 'openid email profile offline_access https://graph.microsoft.com/calendar.read'
这样的措辞,但正确的措辞是:scope => 'openid email profile offline_access https://graph.microsoft.com/Calendars.Read'
(所以复数日历和帕斯卡案例)。这似乎为我解决了这个问题。 "Insufficient privileges to complete the operation."
在使用访问 token 成功回调之后发生,但就在 gem 想要从 /v1.0/me
获取额外的配置文件信息时发生。 API。只有在我添加了 https://graph.microsoft.com/User.Read
之后到我的 Ruby 应用程序的范围,以及 User.Read
在应用程序注册中授予,gem 似乎具有所需的权限并且错误消失了。 笔记!似乎更新您的应用程序配置可能需要 30 分钟才能生效!这使得很难做出任何进展并准确地找到哪些 Action 有什么效果。 offline_access
时,您才会在初始授权请求中获得刷新 token 在你的范围内(见第 4 点)。然后您可以使用以下类型的代码:oauth = OmniAuth::Strategies::MicrosoftV2Auth.new(
nil,
ENV['OFFICE365_KEY'],
ENV['OFFICE365_SECRET']
)
token = OAuth2::AccessToken.new(
oauth.client,
@access_token,
{ refresh_token: @refresh_token }
)
new_token = token.refresh!
@access_token = new_token.token if new_token.token
此外,在测试时,撤销您在早期测试中获得的访问 token 是非常宝贵的。这可以在 myapps.microsoft.com 上完成。 .
我在这个过程中也遇到了 CSRF 错误,在这种情况下你需要清除缓存。
如果我发现任何其他感兴趣的内容,我会在此处添加,希望没有人需要在这些阴暗的 API 森林中长时间徘徊。 :(
关于ruby-on-rails - 如何正确注册和访问 OAuth2 的 Office 365 Graph API(使用来自 Ruby 的 omniauth)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41119421/