gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 06:48:54 27 4
gpt4 key购买 nike

我正在尝试构建一个 Ruby 守护进程服务来访问 Office 365 rest API。最近可以通过 OAuth“client_credentials”流程来执行此操作,详见此博文:https://learn.microsoft.com/en-us/archive/blogs/exchangedev/building-daemon-or-service-apps-with-office-365-mail-calendar-and-contacts-apis-oauth2-client-credential-flow

我正在努力生成有效的访问 token 。 token 端点返回一个 JWT,但是当使用这个 token 时,我收到了一个 401 消息:

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

我知道 client_credentials 流程要求您出示 X.509 证书,不幸的是,博文中的所有示例都是针对 C# 的。

我在请求 token 时使用生成的自签名证书和私钥进行客户端断言。我按照博文中的步骤生成证书并更新 list 以使用此证书。

这是供引用的 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 特定位应该相当容易。

请记住用正确的值替换 YOUR CLIENT ID、TENANT_ID 和 CERT_THUMBPRINT,并将证书路径和客户端 key 方法指向正确的文件路径。

然后你可以这样做:

mailbox = OfficeAPI.new("nick@test.com")
messages = mailbox.request_messages

最佳答案

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

基本上,您需要构建一个 JSON Web Token 并使用 SHA256 哈希使用您的证书对其进行签名。 token 将看起来像这样:

标题:

{ 
"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 参数包含在 token 端点的 POST 中,还包含一个 client_assertion_type 参数设置为“urn:ietf:params:oauth:客户端断言类型: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 中测试过。

关于ruby - Office 365 Rest API - 守护进程周身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28351558/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com