繁体   English   中英

如何从Ruby中访问Office 365 API?

[英]How to hit Office 365 API from Ruby?

我正在尝试从Ruby on Rails后端访问Office 365 API,并且遇到问题。

无论我使用ruby_outlook gem( github)还是遵循Microsoft的Ruby on Rails官方示例 ,我都会得到401 unauthorized

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

我使用的是正确的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返回的确切错误是:

{"ruby_outlook_error"=>401}

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

在您的情况下,您请求了Graph API范围,但您正在调用Outlook API端点。

您只需要在一个位置注册客户ID和密码即可: https : //apps.dev.microsoft.com 听起来您可能还已经在Azure管理门户中注册了一个应用程序(这要求您在注册本身中指定作用域)。

确保您使用的是来自apps.dev.microsoft.com的客户端ID,并确保将您的范围请求为“ https://outlook.office.com ”范围,并且您应该很方便。

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

更新 :根据您的评论,Omniauth策略确实需要v1 Azure身份验证/令牌终结点,因此,如果要继续使用该策略,则有两个选择:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM