如何从 Ruby 访问 Office 365 API?

How to hit Office 365 API from Ruby?

我正在尝试从 Rails 后端上的 Ruby 访问 Office 365 API,但遇到了问题。

我是否使用ruby_outlookgem(github) or follow Microsoft's official Ruby on Rails sample,我得到401 unauthorized

我的 access_token 正在使用 Omniauth 保存并且有效,我通过将其粘贴到 here 进行了检查。

我使用的 access_token 正确吗?它的长度超过 1400 个字符(准确地说是 1442 个)。谁能告诉我如何从 Ruby 正确调用 Office 365 邮件 API 的示例?

代码示例(使用法拉第):

key = @auth[:key]

 conn = Faraday.new(:url => 'https://outlook.office.com') do |faraday|
   # Outputs to the console
   faraday.response :logger
   # Uses the default Net::HTTP adapter
   faraday.adapter  Faraday.default_adapter  
 end

 response = conn.get do |request|
   request.url '/api/v2.0/me/contacts'
   request.headers['Authorization'] = "Bearer #{key}"
   request.headers['Accept'] = 'application/json'
 end

代码示例(使用 ruby_outlook gem):

client = RubyOutlook::Client.new

key = @auth[:key]

page = 1
view_size = 30
fields = [
  'DisplayName',
  'EmailAddresses'
]
sort = {:sort_field => 'DisplayName', :sort_order => 'ASC'}
contacts = client.get_contacts key, view_size, page, fields, sort

ruby_outlook gem returns 的确切错误是:

{"ruby_outlook_error"=>401}

问题是您的令牌中的范围与您正在使用的 API 端点不匹配。范围必须匹配端点。

在您的情况下,您请求了一个 Graph API scope, but you're calling the Outlook API 端点。

您只需在一个地方注册您的客户端 ID 和密码:https://apps.dev.microsoft.com。听起来您可能还在 Azure 管理门户中注册了一个应用程序(这需要您在注册本身中指定范围)。

确保您使用的是来自 apps.dev.microsoft.com 的客户端 ID,并确保您的范围被请求为“https://outlook.office.com”范围,这样您就可以开始了。

如果 Omniauth 策略 可能 需要您在 Azure 管理门户中注册,如果它们依赖于 Azure 的 v1 身份验证端点。在这种情况下,请忘记我所说的 apps.dev.microsoft.com,而是更改您的应用程序注册以使用 Microsoft Exchange Online 的适当权限。

更新:根据您的评论,Omniauth 策略确实需要 v1 Azure auth/token 端点,因此如果您想继续使用该策略,您有 2 个选择:

  • 更改您的代码以使用 Graph 端点。您需要使用上面的法拉第选项(ruby_outlook 专为 Outlook 端点设计),并将 URL 更改为 https://graph.microsoft.com,将 request.url 更改为 /v1.0/me/contacts.
  • https://dev.outlook.com/appregistration 创建一个新的应用程序注册,这将为您的代码创建适当的范围。您需要 Office 365 帐户才能登录应用注册工具。