如何从 Ruby 访问 Office 365 API?
How to hit Office 365 API from Ruby?
我正在尝试从 Rails 后端上的 Ruby 访问 Office 365 API,但遇到了问题。
我是否使用ruby_outlook
gem(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 帐户才能登录应用注册工具。
我正在尝试从 Rails 后端上的 Ruby 访问 Office 365 API,但遇到了问题。
我是否使用ruby_outlook
gem(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 帐户才能登录应用注册工具。