Office 365 Rest API-守护程序周身份验证

尼克·马赫(Nick Maher)

我正在尝试构建Ruby Daemon服务来访问Office 365 rest API。最近,可以通过OAuth“ client_credentials”流程执行此操作,如本博客文章中所述:http : //blogs.msdn.com/b/exchangedev/archive/2015/01/22/building-demon-or与办公室365邮件日历和联系人API的应用程序服务-apis-oauth2-client-credential-flow.aspx

我正在努力生成有效的访问令牌。令牌端点向我返回了一个JWT,但是使用此令牌时,我收到了一条带有以下消息的401:

使用太弱而无法允许对此应用程序进行访问的身份验证方法来获取访问令牌。显示的身份验证强度为1,要求为2

我了解到client_credentials流要求您提供X.509证书,不幸的是,博客文章中的所有示例都是针对C#的。

请求令牌时,我使用生成的自签名证书和私钥来进行客户端声明。我按照博客文章中的步骤生成证书并更新清单以使用此证书。

这是供参考的红宝石代码:

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

显然,为了安全起见,我删除了某些信息。即使它是红宝石,您也可以看到我正在使用我的证书通过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("[email protected]")
messages = mailbox.request_messages
杰森·约翰斯顿

而不是client_secret您的请求正文中,您需要一个client_assertion这有点复杂,但这就是您需要该证书的原因。

基本上,您需要构建一个JSON Web令牌并使用SHA256哈希与您的证书签名。令牌看起来像这样:

标头:

{ 
  "alg": "RS256",
  "x5t": "..." // THUMBPRINT of Cert
}

有效负载:

{
  "aud": "https:\\/\\/login.windows.net\\/<The logged in user's tenant ID>\\/oauth2\\/token",
  "exp": 1423168488,
  "iss": "YOUR CLIENT ID",
  "jti": "SOME GUID YOU ASSIGN",
  "nbf": 1423167888,
  "sub": "YOUR CLIENT ID"
}

如果您仍然和我在一起,则现在需要对这两段进行base64编码(分别),然后将它们连接为“。”。因此,现在您应该具有:

base64_header.base64_payload

现在,您使用SHA256散列获取该字符串并使用证书对其进行签名。然后对结果进行base64编码,对其进行url编码,然后追加到字符串,所以现在您有了:

base64_header.base64_payload.base64_signature

最后,将此client_assertion参数作为参数包含在您的POST到令牌端点中,还包括一个client_assertion_type设置为“ urn:ietf:params:oauth:client-assertion-type:jwt-bearer”的参数:

req.set_form_data(
    :grant_type    => 'client_credentials',
    :redirect_uri  => 'http://spready.dev',
    :resource      => 'https://outlook.office365.com/',
    :client_id     => '== Client ID ==',
    :client_assertion_type => 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer',
    :client_assertion => 'base64_header.base64_payload.base64_signature'
  )

希望对您有所帮助!这一切都是基于我对ADAL的研究得出的,而我还没有在Ruby中对其进行过测试。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Office 365 API身份验证表单REST API

Office 365 API编程身份验证

Office 365 REST API入门

Office365 REST API的API限制

通过REST进行Office 365身份验证而无需注册应用程序

使用Office 365 API的身份验证问题

Office365 API身份验证-Azure与应用程序注册门户

由于逻辑应用程序中的交叉API连接,导致Office365 API连接身份验证/授权失败

Office 365 REST日历API,用于使用OAuth承载令牌进行身份验证时创建失败的HTTP-403事件

使用Java中的Office 365 REST API构建后台驻留程序或服务应用程序

适用于Java应用程序的OAuth2 for Office365 REST API

是否有任何Office 365 REST API可以注销Office 365的用户?

Office 365“创建事件” Rest API提供了错误

使用没有UI的Office 365 REST API

使用Office365 REST API检索用户照片

ajax获取对Office365 REST Api的请求失败CORS?

Office 365 REST API的响应时间差

Office 365 Rest API-更改消息ID

Office 365 REST API列表资源(会议室)

Office365 Rest API 401“受众声明值无效”

通过Office 365 REST API提取“已取消”事件

Office 365 REST API-访问会议室日历

无法使用Office 365 REST API登录电子邮件

使用Office 365 REST API搜索电子邮件

使用Office 365 REST API从共享日历中获取事件

JAVA中的Microsoft Office 365邮件REST API

Odata $ filter用于Office 365 REST API中的日期

JAVA中的Microsoft Office 365邮件REST API

如何从Office 365 REST API检索ItemAttachment的附件?