ruby-on-rails - 如何正确注册和访问 OAuth2 的 Office 365 Graph API(使用来自 Ruby 的 omniauth)?

标签 ruby-on-rails office365 omniauth office365api

我正在尝试从我们的 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 的方法有很多,每一种方法都有自己的特定版本,而且每一种方法都有大量过时的“这就是你的做法”文章,这也无济于事。

让我总结一下我是如何让一切正常工作的以及吸取的教训。

  • 有一种“旧方式”和一种“新方式”可以访问 API。旧方式 (v1.0) 涉及 Azure AD,您必须在其中获取一个 Azure 帐户并在该仪表板中配置所有内容。新方式(v2.0)涉及Application Registration Portal仅此而已。另见 this article .
  • Graph API 版本目前仍为 v1.0,此版本号与上述身份验证(Azure AD)版本号无关。 (另见 this article )
  • 我使用的是 omniauth-office365omniauth-microsoft-office365 gems,它们都试图访问主机上的资源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 有什么效果。
  • Microsoft 访问 token 会在一小时内过期,因此您需要经常使用刷新 token 刷新您的访问 token 。仅当您包含 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/

    相关文章:

    ruby-on-rails - 错误 - 未初始化的常量 Project::Ticket

    java - 如何在Office 365上通过java进行身份验证?

    ruby-on-rails - 使用 Devise 和 Omniauth 的路由问题

    facebook - 如何调试 Facebook 连接问题?

    ruby-on-rails - 为什么使用 Omnicontacts 导入 Gmail 联系人仅需 99 个联系人

    javascript - Rails file_field 大小限制

    ruby-on-rails - Rails 2.3.14:如何序列化 ActionController::Request 对象?

    ruby-on-rails - ruby /rails : How to determine if module is included?

    azure - Powershell 函数 -WhatIf 用于没有 -WhatIf 支持的 cmdlet?

    javascript - ContentControl 操作减慢 Word Online