如何从Ruby访问Office 365 API?

我试图从Ruby on Rails后端访问Office 365 API并遇到问题。

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

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

我使用正确的access_token吗? 它超过1400个字符(确切地说是1442个字符)。 有人能告诉我如何从Ruby正确调用Office 365 Mail 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管理门户中注册,如果它们依赖于Azure的v1 auth端点。 在这种情况下,请忘记我对apps.dev.microsoft.com所说的内容,而是更改您的应用注册以使用Microsoft Exchange Online的相应权限。

更新 :根据您的意见,Omniauth策略需要v1 Azure身份validation/令牌端点,因此如果您想继续使用该策略,则有2个选项:

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