此示例展示了如何为 htmx 实现异步认证令牌流程。
我们将使用的一种技术是利用 htmx:confirm 事件可以延迟请求这一事实。
我们首先有一个按钮,在检索到认证令牌之前不应发出请求:
<button hx-post="/example" hx-target="next output">
An htmx-Powered button
</button>
<output>
--
</output>
接下来,我们将添加一些脚本来处理 auth 承诺(由库返回):
<script>
// auth 是我们的认证系统返回的承诺
// 等待认证令牌并将其存储在某处
let authToken = null;
auth.then((token) => {
authToken = token
})
// 以认证令牌为条件限制 htmx 请求
htmx.on("htmx:confirm", (e)=> {
// 如果没有认证令牌
if(authToken == null) {
// 阻止常规请求发出
e.preventDefault()
// 仅在 auth 承诺解析后发出请求
auth.then(() => e.detail.issueRequest())
}
})
// 将认证令牌作为请求头添加到请求中
htmx.on("htmx:configRequest", (e)=> {
e.detail.headers["AUTH"] = authToken
})
</script>
在这里,我们使用了全局变量,但您可以使用 localStorage 或任何您喜欢的机制来将认证令牌传递给 htmx:configRequest 事件。
使用此代码后,htmx 将在 auth 承诺解析之前不会发出请求。