如何在没有声明的情况下在api之间保存令牌?
Posted
技术标签:
【中文标题】如何在没有声明的情况下在api之间保存令牌?【英文标题】:How to save tokens between apis without statement? 【发布时间】:2019-08-24 16:54:48 【问题描述】:我们正在考虑下一个应用的架构,但在 api 之间传递令牌时遇到了问题。我们将拥有:
前面 -->(调用)自己的登录 api(如果一切正常,我们创建一个自己的令牌,命名为 ownToken)-->(调用)第三方 api --> 返回一个 JWT 令牌(命名为 1token)- ->一切正常后:
前面 --> 用户做一些任务-->(With ownToken Call to) 自己的业务 api (如果 ownToken ok, do some stuff)--> (with the 1token Call to) 第三方api (return some stuff ) --> 向用户显示信息。我们希望避免每次从该 api 获取信息时调用第三方 api,但我们也不想向用户显示该 JWT(我的意思是 localstorage、sessionstorage...)。
更多信息,我们将使用c#语言和sql server作为数据库。
我们的问题:
如何在 API 之间维护 1token?
【问题讨论】:
"我们希望避免每次我们想要从该 api 获取信息时调用第三方 api"...也许您可以缓存数据,如果它不经常更改,或者将其复制到你自己的数据库。目前还不清楚这与“你如何在 API 之间维护 1token?”有什么关系?尽管?通常访问令牌会在一段时间后过期,因此您可以将它存储在您的数据库中,直到它过期,但您通常应该从其他 API 获取刷新令牌,您可以使用更长时间,以获取新的访问令牌。或者它可能支持带有客户端密码的流,因此不需要重新验证 我不能完全弄清楚你在担心什么,但如果你希望用户可以直接从前端应用程序调用第 3 方 API(我猜它是浏览器或应用程序?),这样数据就不会每次都通过您的服务器,那么第 3 方 API 必须能够信任前端应用程序。因此,要么用户必须自己直接使用该 API 进行身份验证,要么您必须使用您在服务器上生成的令牌信任该应用程序 - 正如您正确指出的那样,这可能是有风险的。也许您可以准确地澄清您对数据和令牌的关注点? 首先感谢您的回答。 @ADyson 无法缓存该信息,关系是我们需要 1token 才能从第三方 api 的每次调用中获取信息。是的,存储在数据库中是我们想到的第一个选项,但我们想知道是否还有其他选项。问题是我们不希望任何人从我们的应用程序中访问该 1token。 好吧,如果您正确地保护了您的数据库和服务器,就不会有这种危险。但是,无论您在令牌的生命周期中将令牌存储在何处,都需要对其进行保护。数据库是一个非常合理的选择,因为大多数数据库都具有很好的安全功能,并且您的 API(如果它是唯一可以直接访问数据库的应用程序)也可以提供帮助。如果您将令牌存储在文件中,则必须改为控制对文件的访问。如果您的 API 不是完全无状态的,并且会话持续时间足够长,您可以将其存储在内存中的会话中 【参考方案1】:你有两件不同的事情需要管理:
-
前端和后端之间受 JWT 保护的调用
您的后端和第三方之间的 JWT 安全调用。
我要做的只是在后端生成一个“sessionId”,它是您发送到前端的令牌的一部分。这可能是一个 int 或 guid 或其他什么。
然后,我会将这个“sessionId”与从第 3 方检索到的令牌相关联,并以某种方式存储它 - 某种形式的数据库或文件存储(DB 将是显而易见的东西)。
这样,只要后端代码中的前端收到请求,您就应该:
-
从他们提供的令牌中提取 sessionId
在您的数据库中查找此 ID 的条目以获取与其关联的令牌
使用此令牌进行任何需要的调用和响应
您必须确保在需要获取新令牌时更新此关联,但这应该不会太难。
您还可以使用它来使事物的性质更加异步 - 您可以立即返回 您的 前端,并返回一个表明它正在“工作”的响应,然后前端可以稍后调用单独的端点以获取结果...这样,如果第 3 方链接需要一段时间,则原始请求不会等待太长时间等待响应...
【讨论】:
谢谢回答,第一点不是 JWT,就像你说的,t 是一个 sessionId。是的,这是我们的想法,但我们希望有其他方法可以做到这一点,但似乎没有。我想我们会将 sessionId 与 JWT 的关系保存在 sql 表中。另一个问题,我们听说 Redis 太快无法关联这种数据...你会使用数据库 Redis(会话)和 SQL Server(数据) 还是只有 SQL Server(会话和数据)? 我假设为 JWT,但原理是一样的......只有两种方法可以做到这一点 - 要么将所需的一切发送给客户端(可能是加密的),以便它可以通过所有这些返回每个请求,或者您需要记录您的哪些令牌与哪个 3rd 方令牌相关联。至于如何/在哪里存储它(例如 Redis Vs MsSqlServer),这完全取决于您的系统架构,对于 SO 问题来说实在是太宽泛了。断章取意,对于这个特定问题,您可以使用其中任何一个,它可能会正常工作。以上是关于如何在没有声明的情况下在api之间保存令牌?的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有 FilePicker 的情况下在固定位置保存和加载 InkCanvas gif 文件
如何在没有扩展内联 asm 的情况下在 gcc 内联汇编中声明和初始化局部变量?
如何在不使用dotnet中的安全令牌(使用soap api)的情况下登录salesforce?
如何在没有外部库的情况下在 React 中实现 Google Maps JS API?