![](/img/trans.png)
[英]How to properly register and access Office 365 Graph API for OAuth2 (using omniauth from Ruby)?
[英]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身份验证/令牌终结点,因此,如果要继续使用该策略,则有两个选择:
https://graph.microsoft.com
,并将request.url
更改为/v1.0/me/contacts
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.