在不使用表单的情况下,从 javascript 应用程序从节点服务器获取 JWT 令牌的最佳安全方法是啥?
Posted
技术标签:
【中文标题】在不使用表单的情况下,从 javascript 应用程序从节点服务器获取 JWT 令牌的最佳安全方法是啥?【英文标题】:What is the best secure way to get a JWT token from a node server from a javascript app without using a form?在不使用表单的情况下,从 javascript 应用程序从节点服务器获取 JWT 令牌的最佳安全方法是什么? 【发布时间】:2020-01-24 08:41:32 【问题描述】:就我而言,我有一个React
应用程序(使用Next
)需要使用node
/ express
/ mysql
应用程序提供的API。
我的想法是有一个端点 (/login
) 来提供基于 user
/ password
的 JWT 令牌(检查数据库中的用户并根据用户的 id 创建令牌),然后使用 JWT 令牌来使用 API 端点(这些令牌也存储在 mysql
中)。但为了做到这一点,并且因为没有表单,我必须将凭据(user
和password
)存储在客户端应用程序中,因此任何人都可以读取。我做对了吗?如果没有,还有哪些其他选项可以安全地让客户端 APP 使用 API 端点?
React
和 Node
/ Express
在同一个域上,CORS
是默认设置的,从我读到的内容。此外,HTTPS
已激活。
【问题讨论】:
您可以使用 cookie 来存储您的 jwt 令牌。您需要使用解密 npm 将令牌转换为加密形式,然后出于安全原因和数据库将其作为 cookie 存储在客户端,以便您可以在检查身份验证时使用该令牌。 感谢您的输入,但我的问题不在于如何在客户端存储令牌,而是如何安全地进行首次登录。 如果没有form
,如何输入username
和password
?可以通过http方法调用/login
api
来自 javascript var like const username = 'me'; const password = '123456' 然后通过 HTTP 请求。所以你说的是我不需要发送凭据?
【参考方案1】:
-
生成网络令牌
使用 becrypt npm 进行加密
首次用户登录时以加密形式存储在数据库和客户端的cookie中
如果您的 cookie 令牌与数据库令牌匹配,则在直接访问您的 cookie 并签入您的数据库并让您的用户长时间登录的中间件上创建。像下面的例子
示例项目:https://github.com/karenaprakash/books_review.git
参考这个完整的应用程序
访问此项目。我希望这会对你有所帮助。
【讨论】:
【参考方案2】:基本上,JWT 允许您完全避免使用会话并且不将它们存储在数据库中,JWT 就像您给用户的护照,它指出他的(例如 ID,可能是用户名)、角色和任何其他数据(如果有人看到则不敏感),因此您永远不应该将密码存储在 JWT 中
JWT 的安全性基本上在于没有其他实体可以模仿它(如果您使用强密钥进行签名)并且虽然可以加密您的 JWT,但您不必加密它,只要您不要将敏感数据放入其中。我认为您应该尝试查看 this website 以了解签名如何保护 JWT 的真实性
所以你应该创建/login
API,这将检查你的用户凭据然后给他 JWT(说明他是用户'joe',例如角色'admin')然后你检查并验证这个过滤器中的 JWT 用于对用户进行身份验证和授权以执行您的 web 应用中的操作
要获取 JWT,用户必须在 HTTPS 连接中向您提供他的凭据,这将使连接本身加密,从而保护他的凭据免受窃听或中间人攻击
【讨论】:
感谢您的回答,我的问题是,如果凭据存储在客户端应用程序中的 javascript 变量中,例如 const password = '123456',会怎样。对我来说,这并不安全,因为任何查看 javascript 的人都可以阅读它。以上是关于在不使用表单的情况下,从 javascript 应用程序从节点服务器获取 JWT 令牌的最佳安全方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在不使用提交按钮的情况下触发标准 HTML5 验证(表单)?
如何在不从表单中删除数据的情况下重置 BootstrapValidator? [复制]