2016-07-07 65 views
0

我正在嘗試從Ruby on Rails後端訪問Office 365 API,並遇到問題。如何從Ruby訪問Office 365 API?

無論我用的是ruby_outlook寶石(github)或按照微軟的official Ruby on Rails sample,我得到401 unauthorized

我的access_token正在使用Omniauth保存,並且有效的,我檢查在here粘貼。

上午我使用的是正確的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寶石):

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寶石返回確切的錯誤是:

{"ruby_outlook_error"=>401} 
+0

當您將標記粘貼到JWT解析器中時,您對「scp」聲明有什麼看法? –

+0

@JasonJohnston我看到「Contacts.Read Mail.Read Mail.ReadWrite Mail.Send User.Read」 – tommybond

+0

好的。那麼'aud'聲明呢?你要求的範圍是什麼(在紅寶石漫遊中的'SCOPES'數組)? –

回答

1

的問題是在令牌中的範圍之間的不匹配以及您正在使用的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驗證端點)。在這種情況下,請忘記我對apps.dev.microsoft.com所說的內容,而是將您的應用註冊更改爲使用Microsoft Exchange Online的相應權限。

UPDATE:根據您的意見,即Omniauth策略的確,如果你想使用的策略,以保持所需要的V1 Azure的身份驗證/令牌端點,所以你有兩個選擇:

  • 更改代碼使用圖形端點。您需要使用上面的Faraday選項(ruby_outlook是爲Outlook端點設計的),並將您的URL更改爲https://graph.microsoft.com,並將request.url更改爲/v1.0/me/contacts
  • https://dev.outlook.com/appregistration創建一個新的應用程序註冊,它將爲您的代碼創建適當的範圍。您需要一個Office 365帳戶才能登錄到應用程序註冊工具。
+0

當使用apps.dev.microsoft.com應用程序時,當使用該omniauth策略嘗試擊中我的auth端點時,出現'unauthorized_client'錯誤,並且* API_id *不支持此API版本。我最初在http://dev.office.com/app-registration註冊了我的應用程序。我在哪裏可以找到這些Microsoft Exchange Online範圍? – tommybond

+0

這就是我所害怕的。 dev.office.com網站註冊Graph範圍。我會更新我的答案。 –

+0

因此,最後,我將無法使用Graph作用域的'ruby_outlook' gem,對嗎? – tommybond