有没有办法,我们会得到调度任务的认证来认证调度任务内部的xdmp:http-put函数。
例如,:=调度任务每分钟运行一个xqyfile,该文件包含一个调用rest服务的http:put方法。
let $url :=
fn:concat('http://',xdmp:hostname($host),':',$PORT,'/v1/resources/example')
return
xdmp:http-put($url,
<options xmlns="xdmp:http">
<data>{
xdmp:quote($data)
}</data>
</options> 其中$port是rest服务端口,$host是集群中的主机是否可以从调度任务获取认证并将其传递给xdmp:http-put method.This是必需的,因为密码与环境相关,我们将不知道密码。
发布于 2020-10-21 01:30:44
如果您希望能够在没有身份验证的情况下调用端点,则可以使用Application Level身份验证配置应用程序服务器并设置默认用户。有明显的安全考虑因素,因此您可能为此设置了特定的应用程序服务器,并为该默认用户配置了最低限度的角色和权限。
另一种选择是使用Secure Credentials在安全数据库中安全地存储身份验证信息。
<credential-id>要用于身份验证的凭据id。这是提供身份验证凭据的首选方式,因为它们安全地存储在安全数据库中。指定凭据id时,其他身份验证信息字段应保留为空,并将被忽略。有关获取凭据id的详细信息,请参阅下面的使用说明。
import module namespace sec = "http://marklogic.com/xdmp/security" at "/MarkLogic/security.xqy";
xdmp:invoke-function(function() {
sec:create-credential("my-secure-credential", "a secure credential",
"myUsername", "myPassword",
(), (), fn:false(),
sec:uri-credential-target(".*/v1/resources/example.*", "digest"),
xdmp:permission("rest-writer", "execute")
)
},
<options xmlns="xdmp:eval">
<database>{xdmp:database("Security")}</database>
</options>
)然后在xdmp:http-put的选项中利用这些凭据。
let $url := fn:concat('http://',xdmp:hostname($host),':',$PORT,'/v1/resources/example')
return
xdmp:http-put($url,
<options xmlns="xdmp:http">
<data>{xdmp:quote($data)}</data>
<credential-id>{xdmp:credential-id("my-secure-credential")}</credential-id>
</options>) 这样,您就可以更新每个系统上的凭据,并避免在代码中硬编码身份验证信息。
如果您尝试调用的端点是MarkLogic REST端点,那么您可以让计划任务模块导入REST模块并调用它的get或post方法,而不是通过HTTP调用:
import module namespace m = "http://marklogic.com/rest-api/resource/example"
at "/marklogic.rest.resource/example/assets/resource.xqy";
let $context := map:map()
let $params := map:map()
let $input := ()
return m:post($context,$params, $input)https://stackoverflow.com/questions/64446117
复制相似问题