在不使用表单的情况下,从 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 中)。但为了做到这一点,并且因为没有表单,我必须将凭据(userpassword)存储在客户端应用程序中,因此任何人都可以读取。我做对了吗?如果没有,还有哪些其他选项可以安全地让客户端 APP 使用 API 端点?

ReactNode / Express 在同一个域上,CORS 是默认设置的,从我读到的内容。此外,HTTPS 已激活。

【问题讨论】:

您可以使用 cookie 来存储您的 jwt 令牌。您需要使用解密 npm 将令牌转换为加密形式,然后出于安全原因和数据库将其作为 cookie 存储在客户端,以便您可以在检查身份验证时使用该令牌。 感谢您的输入,但我的问题不在于如何在客户端存储令牌,而是如何安全地进行首次登录。 如果没有form,如何输入usernamepassword?可以通过http方法调用/loginapi 来自 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 验证(表单)?

如何在不实际使用 <form> 的情况下使用引导表单布局?

如何在不从表单中删除数据的情况下重置 BootstrapValidator? [复制]

如何在不使用 JQuery 的情况下使用 fetch API 以 JSON 格式发布表单数据?

如何获取将在不提交的情况下提交的所有表单值[重复]