钥匙斗篷|无法在异步函数中等待 updateToken()

2024-01-04

我们正在使用 React/Redux 前端开发 Spring 应用程序。我们成功地将其与 Keycloak 身份验证服务集成。但是,访问令牌超时后,我们遇到了不需要的行为。我们的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){}
    }

问题是,在令牌过期并执行 updateToken() 后,异步函数不会停止并在收到新的访问令牌之前立即调用 fetch() 。这当然会阻止 fetch 请求成功并导致响应代码为 401。 updateToken() 返回一个 Promise,所以我认为没有理由等待 await 不能对其起作用,这肯定正在发生。

我确认了该功能updateToken().success(*function*)将在成功的令牌刷新后执行并将 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 实现。我在项目中倾向于做的是一个小助手,就像这里的这个(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(() => ...)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

钥匙斗篷|无法在异步函数中等待 updateToken() 的相关文章

  • 如何在react-select v2中创建optgroup?

    我想在我的反应选择列表中包含 optgroups 但它似乎没有记录在任何地方 我有以下结构 是从评论中提取的https github com JedWatson react select issues 59 https github com
  • 循环内的局部变量会被垃圾收集吗?

    我想知道将循环内引用的任何变量放在循环外是否更有效 或者它们可以像函数内的变量一样被垃圾收集吗 var obj key val for var i 0 i lt 10 i console log obj or for var i 0 i l
  • 有没有办法在 Next.js 的 getStaticProps 中使用 redux 工具包?

    我使用时获取数据useEffect代替getStaticProps 但在getStaticProps它表明钩子只能在功能组件中使用 import Head from next head import Image from next imag
  • 执行页面的 javascript 后保存页面的 html 输出

    我正在尝试抓取一个网站 它首先加载 html js 使用js修改表单输入字段 然后使用POST 如何获得 POSTed 页面的最终 html 输出 我尝试使用 phantomjs 执行此操作 但它似乎只有渲染图像文件的选项 谷歌搜索表明这应
  • jQuery - 提高处理 XML 时的选择器性能

    我正在处理一个 XML 文件 当使用 XPath 样式选择器选择节点时 该文件的性能非常慢 这是运行特别慢的部分代码 for i 0 i
  • 将组件注册到现有的 Vue.js 实例

    我是 Vue js 新手 我想注册一个本地组件 如下所述 https v2 vuejs org v2 guide components html Local Registration https v2 vuejs org v2 guide
  • NodeJs读取JSON文件

    我正在使用 NodeJs 读取 json 文件 我的代码非常基本 var obj require sample json console log obj 0 Sample json 文件包含这样的字符串化 JSON sample good
  • Visual Studio IDE 中功能后的空间

    如何设置 Visual Studio 中的设计以在我的 javascript 函数后面放置一个空格 目前 当我按下返回键时 我得到了这个 var myfunc function 当我想要这个的时候 var myfunc function 知
  • JBoss 会话超时

    我正在尝试编写我的应用程序的一部分 以便它可以优雅地处理会话超时 但我似乎无法控制测试超时之前的持续时间 我正在使用 JBoss 5 1 并且正在修改我的 Web 描述符 web xml 的会话配置 以便会话在一分钟后超时 仅用于测试
  • s3 中托管的静态网站:页面刷新后返回 404

    使用此存储桶策略 Version 2012 10 17 Statement Sid PublicReadGetObject Effect Allow Principal Action s3 GetObject Resource arn aw
  • 数据表“footerCallback”函数未在页脚中显示结果

    我尝试获取每列的总和并将结果显示在页脚中 我在用着 页脚回调 https datatables net reference option footerCallbackDatatables提供的功能 但是它在页脚中没有显示任何内容 数据表解释
  • 属性访问器(getter)的扩展运算符问题

    我很难理解为什么以下代码存在一些问题https jsfiddle net q4w6e3n3 3 https jsfiddle net q4w6e3n3 3 Note 所有示例均在 chrome 版本 52 0 2743 116 中进行测试
  • 我可以在不使用 Jquery UI 的情况下获得 Jquery Pulsate Effect 吗?

    我遇到了由于某种原因无法使用 Jquery UI 的情况 我正在尝试在不使用 Jquery UI 的情况下获得 Jquery UI 脉冲效果 与此链接类似 http docs jquery com UI Effects Pulsate ht
  • 从未使用 mimeType 初始化的 MediaRecorder 获取 mimeType

    我正在使用 MediaRecorder API 在页面上录制一些媒体 在我的 MediaRecorder 初始化中 我没有指定内容类型 因为我不需要任何特别的内容 浏览器可以选择它想要的 var mediaRecorder new Medi
  • 获取 byte[]

    我有一个 html 画布 如下所示 output is a base64string of image data var oldImage new Image oldImage onload function var resizeRatio
  • window.open 使用 css 样式

    我想设计我的 window open 目前 我的网页上有一些项目由于解析了某个类而打开 然后在新窗口中打开指定的文本 我想更改字体大小 字体和填充等 这是我的 JavaScript 代码
  • 无法从 JSON 请求获取数据,尽管我知道它已返回

    我试图获取从 getJSON 返回的数据 但我无法让它工作 我已经在 search twitter API 上尝试了相同的代码 效果很好 但它不适用于其他网站 我知道数据已返回 因为我在使用检查器时可以找到它 我通过检查器找到的值是 id
  • 角度 ng-repeat 根据条件添加样式

    我在 div 列表上使用 ng repeat 并且在渲染此 div 的 json 中手动添加项目 我需要定位我在 json 中添加的最后一个 div 它会自动在屏幕上渲染 即 couse 光标所在的位置 其余部分保持在相同位置 但没有给出渲
  • 指定在任何 Jest 设置发生之前运行的代码

    tl dr 是 1 我怎样才能让Jest使用原生的require函数可以在任何地方加载我的测试中的所有模块 2 我将在哪里 如何进行修改 即替换为esm加载程序 https github com standard things esm ht
  • React 错误:目标容器不是 DOM 元素

    我刚刚开始使用 React 所以这可能是一个非常简单的错误 但我们开始吧 我的html代码非常简单 load staticfiles

随机推荐

  • DNN 重定向循环

    我正在尝试通过创建数据库副本并将 net 文件复制到新文件夹中来复制用于测试目的的现有 DNN 门户 在复制站点并更改 Web 配置以指向新站点并更改数据库中的别名后 我收到此错误 此网页有重定向循环 网页位于http xxx us xxx
  • zend框架中的动态自定义ACL?

    我需要一个解决方案 允许经过身份验证的用户访问某些控制器 操作 而不是根据其用户类型 即 管理员或普通用户 尽管我稍后可能会使用标准 ACL 添加此内容 但要根据其用户的当前状态 例如 他们成为该网站的会员已经超过 1 周了吗 他们完整填写
  • 如何在recyclerview中显示加载消息

    我有一个 recyclerview 我想在回收器填充来自 json 的数据时显示 正在加载 消息或旋转圆圈 这是我的回收商的代码 arrayList new ArrayList lt gt adapter new ListAdapterGr
  • Palm Pre 框架

    我有一定的网络开发经验 不是我的主要技能 但我的基础知识相当不错 我非常缺乏的是现代 JS 框架 Prototype jQuery YUI 等 的知识和经验 我想和他们一起玩 最终都会有 但需要从一个开始 问题是这样的 我是very最终有兴
  • C++11 非静态成员初始值设定项和删除的复制构造函数

    我正在尝试使用 GCC 4 7 2 MinGW 编译以下简单代码 这里我使用 C 11 功能 非静态成员初始值设定项 include
  • 有什么办法可以有异步消息框吗?

    或者我必须使用线程 C 不 没有 或者 您可以创建 非模式对话框
  • 使用模型名称和外键模型的区别

    In the Django 文档 https docs djangoproject com en dev ref models fields foreignkey条目为ForeignKey 它说 如果需要在尚未定义的模型上创建关系 可以使用
  • PuTTY plink发送control+C

    我正在使用 Putty plink 命令行实用程序在 UNIX 服务器上运行一些脚本 我使用 m 选项 plink ssh pw xxx myserver m file txt 文件 file txt 包含要执行的命令列表 并且是使用某些应
  • Twitter API 仅应用程序模式身份验证

    我尝试集成 STTwitter 框架 Github 项目 以与 Twitter API 1 1 进行交互 在我的开发帐户中创建应用程序后 我使用 OAuth 凭据进行仅应用程序模式身份验证 无论如何 我收到以下错误 但我不知道如何修复它 错
  • 这是在存储过程中使用 UNION ALL 的正确方法吗?

    这是正确的方法吗UNION ALL在存储过程中 ALTER PROCEDURE GetHomePageObjectPageWise PageIndex INT 1 PageSize INT 10 PageCount INT OUTPUT w
  • 为云函数指定区域时出现异常“firebase.functions() gets ... no argument ...”

    我正在关注 Firebase文档 https firebase google com docs functions locations http and client callable functions为了从网页调用位于不同区域的可调用函
  • 如何在 gradle kotlin-dsl 中覆盖任务

    在 Groovy 中 我重写了这样的任务 task jar overwrite true 如何使用 Kotlin dsl 做到这一点 我知道我可以创建这样的任务 tasks val jar by creating 但我找不到将其声明为覆盖的
  • 如何从 JSON 中删除不需要的字符串属性

    假设我的输入遵循 JSON obj x y test str myStr Hi 我想删除所有空字符串和值为N A使输出变为 obj y test str myStr Hi 请注意 上面的输入只是一个示例输入文件 我尝试写一些代码 var s
  • libcurl -curl_easy_perform() 失败:SSL CA 证书有问题(路径?访问权限?)

    我在 Windows 7 x64 上使用 mingw64 MSYS2 从下面的链接编译了简单的 libcurl 示例程序 https curl se libcurl c simple html https curl se libcurl c
  • 为什么访问我的根路径需要预热时间才能使我的测试数据可用?

    我正在从 capybara webkit 切换到 poltergeist phantomjs 我遇到了计时问题 并且已确定哪一行代码需要预热时间 但我无法确定这是为什么或如何解决它 我有一个 225 行规范文件 其中包含几十个测试 在任何给
  • OneNote API 有什么方法可以提取另一个 OneNote 页面的链接吗?

    如果我们在 HTML 内容中有指向另一个 OneNote 页面的链接 a href 编辑 好吧 我已经编写了例程来提取链接笔记的页面 id 但该页面 id 与作为链接笔记的属性 id a
  • sourcetree 行结束问题

    我遇到了一个非常奇怪的空白问题 我正在使用 WordPress 网站的本地副本 并在 wp content themes 文件夹中使用 git 存储库 以便跟踪对任何主题的所有更改等 当我设置存储库时 它认为每个文件 除了 gitignor
  • 无法使用 Android 版 Chrome 播放 blob-url 视频

    我在尝试在 Android 版 Chrome 中录制和播放视频时遇到了一个不寻常的问题 相同的代码在桌面版 Chrome 上运行良好 首先 一些信息 安卓4 4 2 适用于 Android 的 Chrome 40 0 2214 89 它适用
  • Kubernetes 中的一个节点上仅允许一个类型的 pod

    如何在 Kubernetes 中的一个节点上仅允许一个类型的 pod 守护进程集不适合此用例 例如 限制一个节点上仅调度一个 Elasticsearch pod 以防止节点出现故障时数据丢失 可以通过仔细规划Pod的CPU 内存资源和集群的
  • 钥匙斗篷|无法在异步函数中等待 updateToken()

    我们正在使用 React Redux 前端开发 Spring 应用程序 我们成功地将其与 Keycloak 身份验证服务集成 但是 访问令牌超时后 我们遇到了不需要的行为 我们的restMiddleware 看起来像这样 简化 functi