gpt4 book ai didi

javascript - key 斗篷 |无法在异步函数中等待 updateToken()

转载 作者:行者123 更新时间:2023-11-29 16:05:03 26 4
gpt4 key购买 nike

我们正在使用 React/Redux 前端开发 Spring 应用程序。我们成功地将它与 Keycloak 身份验证服务集成在一起。但是,我们在访问 token 超时后遇到了不良行为。我们的 restMiddleware 看起来像这样(简化):

    function restMiddleware() {
return (next) => async (action) => {
try{

await keycloak.updateToken(5);

res = await fetch(restCall.url, {
...restCall.options, ...{
credentials: 'same-origin',
headers: {
Authorization: 'Bearer ' + keycloak.token
}
}
});

}catch(e){}
}

问题是,在 token 过期并执行 updateToken() 之后,异步函数不会停止并在收到新访问 token 之前立即调用 fetch()。这当然会阻止获取请求成功并导致代码 401 的响应。updateToken() 返回一个 Promise,所以我看不出 await 无法处理它的原因,这肯定正在发生。

我确认 updateToken().success(*function*) 中的函数将在 token 刷新成功后执行,并将 fetch() 放入其中可以解决问题,但由于我们的中间件构造,我不可以这样做。我开发了这个解决方法:

    function refreshToken(minValidity) {

return new Promise((resolve, reject) => {

keycloak.updateToken(minValidity).success(function () {
resolve()
}).error(function () {
reject()
});
});
}

function restMiddleware() {
return (next) => async (action) => {
try{
await refreshToken(5);

res = await fetch(restCall.url, {
...restCall.options, ...{
credentials: 'same-origin',
headers: {
Authorization: 'Bearer ' + keycloak.token
}
}
});

}catch(e){}
}

它可以工作,但并不优雅。

问题是:为什么第一个解决方案不起作用?为什么我不能等待 updateToken() 而必须改用 updateToken().success()?

我怀疑这可能是一个错误,确认这是这个问题的主要目的。

最佳答案

是的,如前所述,keycloak.js 使用与 ES6 Promise 不兼容的自主开发的 promise 实现。我倾向于在我的项目中做的是像这里这样的小 helper (TypeScript)。

export const keycloakPromise = <TSuccess>(keycloakPromise: KeycloakPromise<TSuccess, any>) => new Promise<TSuccess>((resolve, reject) =>
keycloakPromise
.success((result: TSuccess) => resolve(result))
.error((e: any) => reject(e))
);

像这样使用它

keycloakPromise<KeycloakProfile>(keycloak.loadUserProfile())
.then(userProfile => ...)
.catch(() => ...)

关于javascript - key 斗篷 |无法在异步函数中等待 updateToken(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45610720/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com