在开发一个独立的exist-db应用程序时,我在ajax调用期间传递用户身份时遇到了一些问题。
我创建了一个标准页面,该页面允许用户使用他或她的标准exist-db帐户登录。 (或多或少基于此https://github.com/eXist-db/existdb-login)。
在某些时候,用户需要创建自己的条目并上传文件,这是通过ajax脚本完成的(我使用的是Kartik的bootstrap uploader,但它基本上是标准的ajax上传功能):
$('#input-24').fileinput({
uploadUrl: "../modules/uploader.xql",
uploadAsync: true,
fileActionSettings : {
uploadExtraData() {
return {
'FileName': $(this).data('title'),
}
}
},
});
现在,这当然会失败,因为看起来就像GUEST用户正在尝试创建条目,此操作仅允许注册用户使用。
existent-db是否允许在这种情况下发送我的登录凭据,而不必诉诸标准的HTTP登录(这是有问题的,因为这意味着创建一个cookie来存储密码,这或多或少会呈现该密码)。整个登录诉讼都存在无用的机制),还是有什么方法可以使用控制器代替外部脚本?
谢谢!
答案 0 :(得分:0)
我认为您可以将用户名和密码添加到URI中,以触发Ajax客户端进行基本操作。例如http://username:password@your-server/some/uri/modules/uploader.xql
答案 1 :(得分:0)
对于简单的基本身份验证,我们执行以下操作,因为页面本身是由xQuery提供服务的。
步骤1:我们在页面xQuery中创建一个包含会话信息的变量。这对您来说应该没问题……您的登录结果将是一个HTML页面:
let $sessinfo := util:base64-encode(concat(request:get-parameter('user', ()), ":", request:get-parameter('pass', ())))
步骤2:在xQuery中构建结果页面的过程中,我们通过放置在
标记中的简单script
命令将其转换为javascript变量:
<script>
var sessinfo = "{$sessinfo}";
</script>
第3步:在载入页面的Javascript中(我们使用jQuery),在页面准备就绪后,我们为所有AJAX请求设置身份验证:
jQuery.ajaxSetup({
headers: {
"Authorization": "Basic " + sessinfo
}
});
此后,发出的任何AJAX请求都将带有用户名和密码的基本身份验证标头发送到其他用jQuery.ajax
执行的xQueries中。
答案 2 :(得分:0)
要使eXistdb会话与XHR(Ajax请求)一起使用,您需要确保
login:set-user('my.login.domain', (), false())
在控制器中调用之前,将其转发到请求处理程序。否则,所有请求似乎都来自“来宾”用户。
如果您想使用原始/原生JavaScript请求,例如fetch
您还需要告诉它向请求添加凭据:
fetch(url, { credentials: 'same-origin', method: 'GET' })
顺便说一句,在exidtb-login中使用的持久登录可能使用cookie值来获取存储在服务器上的会话变量(JSESSIONID),但我需要检查一下。