How to hit Office 365 API from Ruby?

十年热恋 提交于 2019-12-08 11:31:26

问题


I am attempting to access the Office 365 API from a Ruby on Rails backend and am having problems.

Whether I use the ruby_outlook gem (github) or follow Microsoft's official Ruby on Rails sample, I am getting 401 unauthorized.

My access_token is being saved using Omniauth and is valid, I checked by pasting it in here.

Am I using the correct access_token? It is over 1400 characters long (1442 to be exact). Can anyone show me an example of how to properly call the Office 365 Mail API from Ruby?

Code Example (using Faraday):

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

Code Example (using 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

The exact error that the ruby_outlook gem returns is:

{"ruby_outlook_error"=>401}

回答1:


The problem is a mismatch between the scopes in your token and the API endpoint you're using. The scope has to match the endpoint.

In your case, you requested a Graph API scope, but you're calling the Outlook API endpoint.

You should only have to register in one place for your client ID and secret: https://apps.dev.microsoft.com. It sounds like you may have also registered an app in the Azure Management Portal (which requires you to specify scopes in the registration itself).

Make sure you're using a client ID from apps.dev.microsoft.com and make sure your scopes are requested as 'https://outlook.office.com' scopes, and you should be good to go.

That Omniauth strategy might require that you register in the Azure Management Portal if they are dependent on Azure's v1 auth endpoints. In that case, forget what I said about apps.dev.microsoft.com and instead change your app registration to use the appropriate permissions from Microsoft Exchange Online.

UPDATE: Based on your comments, that Omniauth strategy DOES require the v1 Azure auth/token endpoints, so you have 2 options if you want to keep using that strategy:

  • Change your code to use the Graph endpoints. You'll need to use the Faraday option above (ruby_outlook is designed for the Outlook endpoints), and change your URL to https://graph.microsoft.com, and the request.url to /v1.0/me/contacts.
  • Create a new app registration at https://dev.outlook.com/appregistration, which will create the proper scopes for your code. You'll need an Office 365 account to login to the app registration tool.


来源:https://stackoverflow.com/questions/38253104/how-to-hit-office-365-api-from-ruby

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!