c# - 多个并发请求之间的令牌共享 C#
问题描述
我有一个应用程序(A),多个用户可以通过该应用程序登录。用户名和密码,并接收即将到来的请求的令牌。如果他们的令牌过期,他们可以得到一个新的。这一切都很好。现在的问题是有时App(A)需要通过App(B)访问。一个 API 调用本身也需要一个(单独的)令牌。无论是哪个客户端进行调用,从 A 到 B 的调用都需要使用相同的令牌。换句话说 - 应用程序 B 不需要知道是哪个客户端拨打了电话,它只是将每个呼叫都视为应用程序 A 的来电。
我的问题在于以线程安全的方式生成和刷新 TokenB。假设 TokenB 已过期,C1、C2、C3 都在同一时间拨打电话。当然,应该只生成一个新令牌。
我认为这是一个很常见的障碍,但我真的找不到关于线程安全令牌(重新)生成这个特定主题的任何指南。
应用程序 A 是用 C# 编写的。并不是说它对这个问题很重要,但也许微软对此有解决方案。
解决方案
好问题,在 OAuth 客户端中处理令牌刷新很棘手。有两种常见的技术。我更喜欢其中的第二个,因为它更可靠,但它需要更复杂的代码:
- 应用 A 在后台计时器线程上定期刷新 TokenB,以防止出现 401
- 应用 A 处理 401,通过令牌刷新然后重试对应用 B 的请求
同步令牌刷新
一种常见的技术是使客户端代码从外部看起来很简单:
var data = await myApiClient.getData();
但是在实现中的某个地方,当需要刷新令牌时,您会使用一组回调。其中第一个进行实际的刷新调用,当它完成时,它会以相同的结果解析所有其他回调。
示例代码
这是一些处理并发进行中令牌刷新的 TypeScript 代码。在 C# 中,您可以对任务执行等效的操作,并且您的回调处理需要是线程安全的:
推荐阅读
- performance - 从 Ubuntu 迁移到 Centos 7 后磁盘性能不佳
- python - Replacing for-loop with better alternatives in panda dataframes for similarity measurement
- php - 如何获取条件 HTML 字段值
- java - 每当在 Android Kotiln 中的搜索过滤器上搜索时,列表都不会显示在 RecyclerView 中
- powershell - `Start-Process` 找不到 PATH 中存在的文件,即使给定了文件的绝对路径
- javascript - Firebase 存储 - 获取实际数据而不是 downloadURL
- jquery - 如何更改 node.js 中的日期格式
- python - Python:如何使用 for 循环执行我的代码 5 次?
- html - 单击 Angular 8 外部关闭的下拉菜单
- html - Laravel 页面已过期 419