具有单页应用程序刷新访问令牌的 Oauth2 隐式流程

2023-12-29

我正在使用 Thinktecture AuthorizationServer (AS),它运行良好。

我想编写一个本机 javascript 单页应用程序,它可以直接调用 WebAPI,但是隐式流不提供刷新令牌。

如果进行 AJAX 调用,如果令牌已过期,API 将发送重定向到登录页面,因为数据使用动态弹出窗口,这将中断用户。

Facebook 或 Stackoverflow 如何做到这一点,同时仍然允许页面上运行的 javascript 调用 API?

建议的解决方案

下面的场景听起来是否合理(假设这可以通过 iframe 完成):

我的 SPA 将我引导至 AS,然后我通过隐式流获取令牌。在 AS 中我单击允许Read data范围,然后单击Remember decision, then Allow button.

既然我点击了Remember decision按钮,每当我点击 AS 获取令牌时,都会自动传回一个新令牌,而无需我登录(我可以看到 FedAuth cookie 正在记住我的决定,并相信这使其能够正常工作)。

对于我的 SPA(不受信任的应用程序),我没有刷新令牌,只有访问令牌。所以我:

  1. 确保用户已登录并单击“记住决定”(否则 iframe 将无法工作)
  2. 调用 WebAPI,如果 401 响应尝试通过以下步骤获取新令牌...
  3. 页面上有一个隐藏的 iframe,我将设置 URL 以从授权服务器获取新的访问令牌。
  4. 从 iframe 的哈希片段获取新令牌,然后将其存储在 SPA 中并用于将来的所有 WebAPI 请求。

我想如果 FedAuth cookie 被盗的话我仍然会遇到麻烦。

对于上述场景有什么标准或推荐的方法吗?


我了解您的问题是,当访问令牌过期时,用户将通过重定向到授权服务器的登录页面而遇到中断。但我认为你不能而且不应该解决这个问题,至少在使用隐式授权时是这样。

我相信你已经知道了隐性授予 https://www.rfc-editor.org/rfc/rfc6749应该由无法保密其凭证的消费者使用。因此,授权服务器颁发的访问令牌应该具有有限的 ttl。例如,谷歌使他们的访问令牌无效3600 sec https://developers.google.com/identity/protocols/OAuth2UserAgent#handlingtheresponse。当然,您可以增加 ttl,但它永远不应该成为长期存在的令牌。

另外需要注意的是,在我看来,用户中断非常小,即如果实施正确,用户只需向授权服务器进行一次身份验证。完成此操作后(例如,第一次授权应用程序访问用户控制的任何资源时),将建立一个会话(基于 cookie 或基于令牌),并且当消费者的访问令牌(使用隐式授予的 Web 应用程序)过期后,将通知用户令牌已过期,需要向授权服务器重新进行身份验证。但由于会话已经建立,用户将立即重定向回 Web 应用程序。

然而,如果这不是您想要的,我认为您应该考虑使用授权代码授予,而不是使用 iframe 做复杂的事情。 在这种情况下,您需要一个服务器端 Web 应用程序,因为这样您就可以保密您的凭据并使用刷新令牌。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有单页应用程序刷新访问令牌的 Oauth2 隐式流程 的相关文章

随机推荐

  • 为什么我能够从本地主机上传到 AWS S3,但不能从 AWS Elastic BeanStalk 实例上传到 AWS S3?

    我正在使用 AWS Credentials 连接到我的 AWS S3 final AmazonS3 s3 new AmazonS3Client new AWSStaticCredentialsProvider new BasicAWSCre
  • 加速度计数据:如何解读?

    我正在试验 3 个加速度计分线板 X和Y轴非常容易控制 但Z轴有点神秘 我正在尝试找到一种解释代码中数据的方法 以在设备在空中升起时增加输出 并在设备下降时减少输出 这可能吗 如果是这样 怎么办 也许如果有人能给我指出一个好的参考来源会有帮
  • 循环遍历 numpy 数组中的每个项目?

    我正在尝试访问 numpy 二维数组中的每个项目 我习惯了 Python 中类似的东西 for row in data for col in data print data row col 但现在 我有一个data array np arr
  • 需要将 MS Visual C++ 移植到 Linux G++

    首先我想说我是一名计算生物物理学家 而不是软件工程师 所以我的编程知识仅限于科学计算 我使用 C Matlab 和 R 最近 我被要求将一个巨大的代码包 约 10 000 行 从 MS Visual C 移植到 Linux 我一直在其中开发
  • 以 Jenkins 用户身份部署或允许 Jenkins 以不同用户身份运行?

    我刚刚开始使用 Jenkins CI 有一个问题 努力在文档或在线中寻找答案 想知道是否 有人可以提供一些建议吗 我正在尝试使用它来自动部署我的开发和阶段 我的 Django 项目的分支托管在 Github 上 组织存储库 即私有 目前我有
  • 尝试将 pdfstamper 中的内存流获取到 pdfreader 中,但得到:“未找到 PDF startxref”

    我正在用 C 编写一个应用程序 它填充一堆 pdf 表单 将它们连接起来 然后放入一些页码 我在处理 pdfstamper 的内存流结果时遇到困难 如果我将内存流更改为文件流 它可以正常工作 但我不想使用文件系统 我创建了以下代码片段来重现
  • 添加 Twitter 组件时出现错误且网站无法加载

    在添加 Twitter 组件时 我得到了Uncaught ReferenceError process is not defined在我的 React Hooks Web 应用程序中 有人可以就这个问题提出建议吗 我尝试在下面添加windo
  • 如何使用直接流在Kafka Spark Streaming中指定消费者组

    如何使用直接流 API 为 kafka Spark 流指定消费者组 ID HashMap
  • 以编程方式禁用和启用 Android 中 Activity 的方向更改

    我有一个应用程序可以做一些后台人员 当后台工作正在运行时 会显示进度圈 如果设备在此期间旋转 则活动将 重置 我想避免这种情况 因此 我决定在此过程中禁用定向 我已经看到了这个问题的不同线程 但没有一个有效的解决方案 至少在我的情况下是这样
  • 使用 Room 进行动态排序

    我想使用 room 创建一个动态查询 以便在一种情况下查询返回特定的订单类型 并且在运行时如果订单类型发生更改 则会创建一个新查询 并根据此类型按顺序返回数据 我正在使用 Room 返回 DataSource Factory 对象 我正在使
  • 可存储向量和未装箱向量之间的差异

    所以 我使用了未装箱的向量 来自vector包 最好现在就不用考虑太多 vector th unbox让为它们创建实例变得轻而易举 所以为什么不呢 现在我遇到了一个实例 我无法自动派生这些实例 这是一种带有幻像类型参数的数据类型 如Vect
  • 如何使图像 100% 适合大屏幕

    我有以下 HTML div class jumbotron div class container h1 Souplesse h1 p Be a Good Sport p div div 以及以下 CSS jumbotron backgro
  • 精灵的对角线运动

    如何实现精灵的对角线移动 我创建了一个可移动的精灵 一个矩形 它向四个方向移动 为了使矩形具有动画效果 使用了计时器对象和动作执行方法 我在 keyPressed 和 keyReleased 方法中实现了以下代码 以将其向四个方向移动 pu
  • 优化代码以最小化宏的运行时间

    我一直在编写一些宏来执行一些占星计算 计算星座 月亮宫 D9 和 D60 原始数据的格式如下 上图中的lng代表经度 以度 分 秒的格式表示 输出必须采用以下格式 我编写了以下代码来从输入表中读取数据并格式化并将其复制到输出表中 然后使用每
  • 将多个嵌套的 LineairLayout 转换为单个relativelayout

    首先 我总体上对用户界面很不好 这就是为什么我需要一些帮助 现在我有以下内容 Explained with a Paint picture Actual Screenshot of what I currently have 代码可以在这篇
  • 如何从有效的 POM 中删除存储库

    那些天我学习 Maven 很困难 它似乎比学习我所知道的所有 4 5 种编程语言还要困难 然而 第一步已经完成 我成功地在 Eclipse 中使用 m2eclipse 插件构建了第一个基于 Jersey 的 Java REST 服务项目 当
  • “将磁盘插入驱动器 D”阻止 Haskell 启动

    这个问题是一个产物另一个问题 https stackoverflow com questions 45362161 how do you import data heap 在那个问题中 我寻求有关导入 Data Heap 的建议 有人告诉我
  • 向 Laravel 添加第三方库

    我有一个 RSA 算法库 由支付网关提供给我 当我执行 include app path PaymentGateway Crypt RSA php 这并尝试将一个对象制作为 rsa new Crypt RSA 这给了我错误的说法 Class
  • SwiftUI macOS Xcode 风格工具栏

    I like to recreate a toolbar similar to Apples Notes App using SwiftUI in a macOS app I am using Xcode 12 3 and macOS 11
  • 具有单页应用程序刷新访问令牌的 Oauth2 隐式流程

    我正在使用 Thinktecture AuthorizationServer AS 它运行良好 我想编写一个本机 javascript 单页应用程序 它可以直接调用 WebAPI 但是隐式流不提供刷新令牌 如果进行 AJAX 调用 如果令牌