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

Pas*_*auf 5 ruby-on-rails omniauth office365 office365api

我正在尝试从我们的 Ruby on Rails 应用程序(特别是日历读取 API)访问 Office 365(图形 API)。我们将 omniauth 用于我们的 OAuth2 流,因此,我们还尝试使用omn​​iauth-office365omn​​iauth-microsoft-office365 gem访问 Graph API 。但是到目前为止,我还没有能够使用这两种宝石获得访问令牌。

我已经在应用程序注册门户中注册了我们的应用程序,但是任何时候我想获得 Calendars.Read 权限(使用范围“profile 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,对吗?那么应用程序注册门户的重点是什么?如果有人能透露一些信息,那就太好了......

谢谢,帕斯卡

Pas*_*auf 4

好吧,经过一番折腾,我终于掌握了一些东西。而且访问不同 API 的方式多种多样,每种方式都有其特定的版本,并且每种方式都有大量过时的“这就是你如何做到这一点”的文章,这也无济于事

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

  1. 访问 API 的方式有“旧方式”和“新方式”。旧方法 (v1.0) 涉及 Azure AD,您必须获取 Azure 帐户并配置该仪表板中的所有内容。新方式(v2.0)涉及应用程序注册门户等等。另请参阅这篇文章
  2. Graph API 版本目前仍为 v1.0,此版本号与上述身份验证 (Azure AD) 版本号无关(另请参阅这篇文章
  3. 我使用的是omniauth-office365omniauth-microsoft-office365 gems,它们都试图访问主机上的资源https://outlook.office.com/,而所有示例都引用base https://graph.microsoft.com。切换到此 Ruby 示例中包含的 microsoft_v2_auth gem让我更进一步。
  4. 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'(所以复数日历和帕斯卡大小写)。这似乎为我解决了问题。
  5. 这种"Insufficient privileges to complete the operation."情况发生在使用访问令牌成功回调之后,但就在 gem 希望从 API 获取额外的配置文件信息时/v1.0/me。只有在我添加https://graph.microsoft.com/User.Read到 Ruby 应用程序中的范围并User.Read在应用程序注册中授予权限之后,gem 似乎才具有所需的权限,并且错误消失了。笔记!更新您的应用程序配置似乎最多需要 30 分钟才能生效!这使得取得任何进展并准确找出哪些行动会产生什么效果变得非常困难
  6. Microsoft 访问令牌会在一小时内过期,因此您需要使用刷新令牌经常刷新访问令牌。offline_access仅当您将其包含在范围中时,您才会通过初始授权请求获得刷新令牌(请参阅第 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
    
    Run Code Online (Sandbox Code Playgroud)

此外,在测试时,撤销您在早期测试中获得的访问令牌是非常有价值的。这可以在myapps.microsoft.com上完成。

我在此过程中也遇到过 CSRF 错误,在这种情况下您需要清除缓存。

如果我发现任何其他感兴趣的内容,我会将其添加到此处,希望没有人需要在这些阴暗的 API 森林中徘徊很长时间。:(