【发布时间】:2015-04-05 18:09:14
【问题描述】:
我正在尝试构建一个 Ruby 守护程序服务来访问 Office 365 REST API。最近可以通过 OAuth 'client_credentials' 流程来执行此操作,如本博文中所述:https://docs.microsoft.com/en-us/archive/blogs/exchangedev/building-daemon-or-service-apps-with-office-365-mail-calendar-and-contacts-apis-oauth2-client-credential-flow
我正在努力生成有效的访问令牌。令牌端点返回给我一个 JWT,但是当使用这个令牌时,我收到了一个 401 和这个消息:
访问令牌是使用一种太弱的身份验证方法获取的,该方法不允许此应用程序访问。提供的身份验证强度为 1,要求为 2
我了解 client_credentials 流程要求您提供 X.509 证书,不幸的是,博客文章中的所有示例都是针对 C# 的。
我在请求令牌时使用生成的自签名证书和私钥来执行客户端断言。我按照博文中的步骤生成证书并更新清单以使用此证书。
这是供参考的ruby代码:
def request_token
uri = URI.parse("https://login.windows.net/== TENANT-ID ==/oauth2/token?api-version=1.0")
https = Net::HTTP.new(uri.host, uri.port)
req = Net::HTTP::Post.new(uri.request_uri)
req.set_form_data(
:grant_type => 'client_credentials',
:redirect_uri => 'http://spready.dev',
:resource => 'https://outlook.office365.com/',
:client_id => '== Client ID ==',
:client_secret => '== Client secret =='
)
https.use_ssl = true
https.cert = client_cert
https.key = client_key
https.verify_mode = OpenSSL::SSL::VERIFY_PEER
resp = https.start { |cx| cx.request(req) }
@access_token = JSON.parse(resp.body)
end
显然,为了安全起见,我删除了某些信息。即使它是 ruby,您也可以看到我正在使用我的证书来验证使用 SSL 连接的客户端。
以下是有关错误的更多信息:
"x-ms-diagnostics" => "2000010;
reason=\"The access token is acquired using an authentication method that is too weak to allow access for this application. Presented auth strength was 1, required is 2.\";
error_category=\"insufficient_auth_strength\"",
"x-diaginfo"=>"AM3PR01MB0662",
"x-beserver"=>"AM3PR01MB0662"
任何帮助将不胜感激。
编辑
对于希望在 Ruby 中做类似事情的其他人,这里是我使用的代码的要点:https://gist.github.com/NGMarmaduke/a088943edbe4e703129d
该示例使用 Rails 环境,但应该很容易去除 Rails 特定的位。
记得将您的 CLIENT ID、TENANT_ID 和 CERT_THUMBPRINT 替换为正确的值,并将证书路径和客户端密钥方法指向正确的文件路径。
然后你可以这样做:
mailbox = OfficeAPI.new("nick@test.com")
messages = mailbox.request_messages
【问题讨论】:
-
嘿@Nick 你有没有让这个工作?我想看看你的代码。我正在尝试在 Ruby 中做类似的事情,即使尝试按照 Jason 的回答所说的去做,似乎也无法让它工作。
-
嘿乔尔,刚刚在问题中添加了更多细节,以及我的代码要点
-
完美。非常感谢!
标签: ruby rest ssl office365 exchangewebservices