- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在尝试构建一个 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/
一 点睛 线程可以设置为守护线程,ThreadGroup 也可以设置为守护 ThreadGroup,但是若将一个 ThreadGroup 设置为 deamon,也并不会影响线程的 daemon 属性,
我有一个 python 脚本需要在启动时作为守护进程运行。进程从 tty(和 pdb)分离,但代码不运行。 我已经将它缩小到一个最小的例子 import daemon from time import
reactjs isMounted API 的文档提到: You can use this method to guard asynchronous calls to setState() or fo
我正在开发一个需要嵌入 HTTP 服务器的守护进程。我正在尝试使用 BaseHTTPServer 来完成它,当我在前台运行它时,它工作正常,但是当我尝试将守护进程 fork 到后台时,它停止工作。我的
我正在尝试使用 Apache Commons Daemon 使用 Daemon 接口(interface)来守护我的应用程序。 Java 应用程序本身不执行任何操作,只是写入 stout。 我编译了j
我正在使用 Bootle Python Web Framework 在 Ubuntu 上开发网络应用程序。是否有任何有效的方法来守护启动默认 bottlepy 网络服务器的脚本? 谢谢。 UPD:现在
我一直使用 bluepill成功地守护简单的 Ruby 脚本。然而这一次,我有一个脚本,它也在加载 Rails 环境,因此我可以访问 Rails 应用程序及其各自模型的数据库连接。我使用的 bluep
我试图守护一些代码,但我遇到了一些麻烦。 如果我用 tklogger() 调用代码,它运行得很好。但是,如果我在守护程序上下文中调用它,我会得到以下跟踪信息: Traceback (most rece
我打算使用 systemd 将 celery 4.3.0 作为守护进程运行,但它给了我这个错误: 它会启动 worker 但会很快停止它们。但是,我可以通过键入以下命令手动运行工作人员: celery
我是一名优秀的程序员,十分优秀!