在计算机上本地存储JWT令牌的位置?

时间:2019-05-09 23:25:22

标签: node.js jwt command-line-interface

我正在使用节点构建自定义命令行工具。用户将需要能够登录并继续其会话。对于使用localStorage的Web应用程序,我之前已经使用节点和通行证完成了该操作,但是我应该如何使用cli工具存储用户JWT。

1 个答案:

答案 0 :(得分:1)

  • 如果它是OAuth2或OIDC access_token,则即使它是JWT,也应将其视为不透明的Blob,因为OAuth2和OIDC客户端不是access_token的目标受众(它们的目的是将其原样传递给远程受保护资源)。
    • 我注意到OAuth2和ODIC允许access_token任何-包括非JWT令牌,例如不透明的短“引用令牌”值。
    • 这意味着您可以将JWT(以Base64编码格式)直接写入磁盘上的文件,然后根据需要将其读回。因为它是Base64,所以您不必担心文件编码过多(例如7位ASCII和UTF-8都可以)。
  • 如果它是ODIC id_token,那么,如果您打算使用客户端中存储的每个Claim,则可以对其进行Base64解码并将解码后的原始JSON存储在文件中。请注意,如果您确实将原始JSON存储到文件中,则除非您希望遇到困难,否则必须使用UTF-8。

每个平台都有一个针对每个用户的临时数据的首选位置:

  • 在Windows上,您应将其存储在%LOCALAPPDATA%C:\Users\me\AppData\Local)的子目录中,例如%LOCALAPPDATA%\YourCompany\YourProduct\Jwt.json
    • 如果安全性很重要,则应使用DPAPI对该文件进行静态加密:DPAPI使用用户配置文件中的秘密密钥对文件进行加密-您只需将明文传递到Win32函数中,然后它会返回加密的密文,然后写入磁盘。当然,请确保您对读取和写入的任何文本的二进制编码都非常小心。可以在每个用户(在计算机之间漫游)或每台计算机(多个用户,但只能在同一台计算机上)的基础上使用DPAPI。
  • Windows还具有Credential Manager API,但它不适合存储较大的Blob:https://docs.microsoft.com/en-us/windows/desktop/secauthn/kinds-of-credentials
  • 在macOS上,您需要使用钥匙串API:https://developer.apple.com/documentation/security/keychain_services
  • 在Linux上,没有系统提供的秘密存储机制(https://dzone.com/articles/storing-secrets-in-linux),但是大多数方法似乎将秘密写入磁盘,然后在文件上设置chmod以防止其他用户访问。您还可以使用自定义密码加密文件,程序运行时用户必须输入该密码。
    • 与Windows一样,您仍应将此数据保存在用户的主目录(~/)和 not 共享的/tmp目录下。 Linux上针对特定于应用程序的数据的约定是使用隐藏的(点缀前缀)主子目录,例如~/.yourCompany/yourProduct或仅~/.yourProduct