首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法在不使用身份验证选项的情况下对调度任务中的xdmp:http-put函数进行身份验证?

有没有办法在不使用身份验证选项的情况下对调度任务中的xdmp:http-put函数进行身份验证?
EN

Stack Overflow用户
提问于 2020-10-20 21:24:10
回答 1查看 45关注 0票数 1

有没有办法,我们会得到调度任务的认证来认证调度任务内部的xdmp:http-put函数。

例如,:=调度任务每分钟运行一个xqyfile,该文件包含一个调用rest服务的http:put方法。

代码语言:javascript
复制
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是必需的,因为密码与环境相关,我们将不知道密码。

EN

回答 1

Stack Overflow用户

发布于 2020-10-21 01:30:44

如果您希望能够在没有身份验证的情况下调用端点,则可以使用Application Level身份验证配置应用程序服务器并设置默认用户。有明显的安全考虑因素,因此您可能为此设置了特定的应用程序服务器,并为该默认用户配置了最低限度的角色和权限。

另一种选择是使用Secure Credentials在安全数据库中安全地存储身份验证信息。

<credential-id>要用于身份验证的凭据id。这是提供身份验证凭据的首选方式,因为它们安全地存储在安全数据库中。指定凭据id时,其他身份验证信息字段应保留为空,并将被忽略。有关获取凭据id的详细信息,请参阅下面的使用说明。

代码语言:javascript
复制
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的选项中利用这些凭据。

代码语言:javascript
复制
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调用:

代码语言:javascript
复制
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)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64446117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档