为命令存储访问和刷新令牌

Posted

技术标签:

【中文标题】为命令存储访问和刷新令牌【英文标题】:Store Access and Refresh Token for Command 【发布时间】:2020-01-26 01:07:31 【问题描述】:

我计划为受 OAuth 2 (JWT) 保护的 Web API 开发命令行客户端。访问令牌和刷新令牌分别存在 5 分钟和 30 分钟。由于用户将使用命令行客户端超过五分钟(例如测试或调试会话),因此刷新令牌需要存储在本地计算机上,因此一开始只需要一次身份验证会议结束,而不是稍后。

我想知道在哪里可以安全地存储刷新令牌。用户主目录中的文本文件听起来可能还不错,因为这也是用户存储他或她的所有私人文档的地方。但是,同一用户运行的任何其他应用程序都可以读取该令牌并滥用它。

此类问题的常见解决方案是什么?

【问题讨论】:

【参考方案1】:

您可以在此处使用 Resource Owner Password Credentials Grant,在其中您将使用命令提示符获取最终用户凭据并将其交换为令牌。有了这个,您可以考虑一种方法,根据您在请求令牌时获得的最终用户凭据来加密收到的令牌。因此,每当您需要使用刷新令牌时,您都可以提示最终用户输入他们的密码,这样您就不会存储密码,而且您还可以加密令牌,这样其他进程就不会照原样窃取它们。

【讨论】:

提示输入密码完全违背了在本地存储刷新令牌的目的。 @PatrickBucher 好吧,这里的重点是安全性。您可以构建 API 并通过访问令牌保护它。您可以使用可用的最佳身份服务器来保护获得的令牌。但是,如果您不能将令牌存储在使用 API 的客户端中,那么您只需打开漏洞。如果你想在文件系统中安全地存储一些东西,那么你需要考虑加密机制。我从这个角度写了我的建议。 还有一件事,你如何获取命令行应用程序的令牌?是复制粘贴方法还是使用我强调的授权类型。 提示用户输入密码,除非密码已经由参数提供。使用命令行密码管理器(例如pass:my-cli-app login -u johndoe -p $(pass show whatever))时,可以安全地发生这种情况。 @PatrickBucher 明白这一点。您提供密码,然后将其存储在加密的密码管理器中。为什么 ?保护原始密码。您需要了解的是保护代币的重要性。您必须安全地存放它们。我建议你的是一样的,保护令牌作为密码。【参考方案2】:

如 Kavindu 所说,使用 ROPG - 如果您的实现支持刷新令牌

之后,您可以将令牌存储在内存中或通过操作系统安全存储。选择有点主观,取决于被访问数据的敏感性

如果使用操作系统安全存储,则为每个应用 + 用户存储令牌,以确保隔离

执行此操作的示例跨平台组件是 keytar,我过去曾将其用于桌面应用程序 - 它基于 nodejs - 不确定这是否适合您: https://github.com/atom/node-keytar/blob/master/README.md

Sample code that uses it

请参阅本文的操作系统安全存储部分,了解如何通过内置操作系统工具查看和管理条目: https://authguidance.com/2018/01/26/final-desktop-sample-overview/

【讨论】:

我将使用 ROP(C)G;问题更多的是如何存储令牌而不是如何获取它们(这已经从我将要使用的 API 中给出。)所以操作系统密钥存储是要走的路......

以上是关于为命令存储访问和刷新令牌的主要内容,如果未能解决你的问题,请参考以下文章

访问令牌和刷新令牌的存储位置和方式

如何防止刷新被盗的访问令牌

存储位置 - OAuth 2.0 中的访问令牌和刷新令牌

访问令牌和刷新令牌困境 - JWT

JWT 刷新和访问令牌

使用访问令牌和刷新令牌保持身份验证