Node.js 用户名和密码认证

2024-03-18

我目前正在使用构建一个网络应用程序Node.js and Express.js.

我正在寻找一种方法,在我的主目录中使用用户名和密码进行简单的服务器端身份验证app.js正在监听的文件post请求于http://www.domain.com/login:

app.js

app.post('/login', function(req, res) {
  // some server-side code for a username and password
}

在客户端,我有一个带有用户名和密码的简单登录表单。该表单将发布到服务器:

索引.html

<form method="post" action="/login">
<input type="text" id="user" name="user" />
<input type="password" id="pass" name="pass" />
<button type="submit">Login</button>
</form>

我希望实现这一目标without使用任何ExpressJS插件。

Edit:所以我的问题是,如何在 ExpressJS 和 NodeJS 中实现简单的用户名和密码身份验证?


通过使用 ExpressJS 会话,您可以保存会话 cookie。您需要 cookieParser 和会话存储。但是,如果您不想扩展此 ExpressJS 功能(这是我从您的消息中了解到的),您应该使用令牌或秘密临时字符串来管理您自己的会话。

尽管我强烈建议您使用 ExpressJS 会话,但在没有 ExpressJS cookie 的情况下您应该这样做。

  • 每次登录时,创建一个唯一的令牌并将其存储以供将来查找。
  • 对于每个请求,从客户端发送该令牌并在服务器上检查它。如果令牌无效,则重定向到登录

这是登录代码示例:

app.post("/login", function(req, res) {
    if(req.body.username && req.body.password) {
        // check username and password
        if(authenticated) {
            // create a token and store it with the current date (if you want it to expire)
            var token = generateAndStoreRandomString(req.body.username);
            res.redirect("http://your.domain/path?token=" + token);
            return;
        }
        // Do something if username or password wrong
    }
    // Do something if no username or password
});

现在,根据每个请求:

app.get("somePath", function(req, res) {
    if(!req.query.token) {
        res.redirect("http://your.domain/login");
        return;
    }
    // Check token in database, if it exists and it hasn't expired
    if(!authenticated) {
        res.redirect("http://your.domain/login");
        return;
    }
    // The user is authenticated. Do the actions required by "somePath"
});

尝试让进程每隔一段时间清理一次过期的令牌,因为它们最终会累积起来。如果你想使用 ExpressJS cookieParser 和会话存储,有很多文章和示例。如果您遇到这些问题,请发布另一个问题。

我将重复一遍,尝试使用 Express JS 会话。如果您使用 http 而不是 https,此方法很容易被黑客攻击。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js 用户名和密码认证 的相关文章

随机推荐

  • 如何更有效地从spark重命名hdfs中的文件?

    我有 450K JSON 我想根据某些规则在 hdfs 中重命名它们 为了简单起见 我只添加一个后缀 finished给他们每个人 A 成功地做到了这一点 代码如下 import org apache hadoop fs val hdfs
  • android studio 重建错误:无法找到要构建的 Gradle 任务,为什么?

    i have an android studio project with manifest file the problem is when i sync the gradle it gives the error below Gradl
  • C++ - 全局静态对象和局部静态对象的构造函数调用不同吗?

    这里有一个同样的问题 静态局部对象的构造函数到底什么时候被调用 https stackoverflow com questions 3063027 when exactly is constructor of static local ob
  • Nuxt 生成动态路由路径

    我正在使用 wp api 创建一个网站 我的所有页面都在里面 pages slug 如果我的页面 slug 是 site com about pages about Nuxt将生成这样的html 但是 如果我的路径是 site com co
  • 8.4 中的 tcl 8.6 封装

    在 Tcl Tk 8 6 中有一个称为笔记本的 Ttk 功能 我想将其实现到我的程序中 但是 我需要该包才能利用此功能 我必须使用 8 4 因为我们使用的 dll 之一仅与 8 4 版本兼容 我感到沮丧的根源 我已经下载了 Tcl 8 6
  • url 中的空手道框架符号编码

    我有这个 Background url http localhost 15672 api exchanges 2F my exchange Scenario Given path publish 这里的问题是 url 被解析为 http l
  • HikariCP:为 Oracle 11g 设置 maxLifetime 时应考虑哪些数据库级别超时

    在 HikariCP 的文档中提到 我们强烈建议设置此值 并且它应该比任何数据库级连接超时至少少 30 秒 Oracle 11g 2 数据库应考虑哪些数据库级连接超时 我怎样才能找到这些超时 要执行的查询 简短回答 无 默认情况下 作为记录
  • 如何在 C++ 中从指向向量的指针访问向量的内容?

    我有一个指向向量的指针 现在 如何通过指针读取向量的内容 解决方案有很多 我总结了一些 int main int nArgs char vArgs vector
  • Chrome 扩展 API webRequest 不能很好地响应

    所以我正在尝试 Chrome API webRequest 根据要求 一切正常 但在响应时 我遇到了问题 我的测试非常简单 function func obj var resHeaders obj responseHeaders for v
  • 如何删除 MongoDB 中的此弃用警告以及为什么会发生这种情况?

    我只是想创建一个 API 并在 app js 文件中连接到它 但每次运行 app js 时都会收到此弃用警告 我已经检查了 mongoose 和 MongoDB 中的所有弃用警告 但我找不到任何与我的相匹配的警告 我收到的警告是 node
  • 将对象列表中的对象项替换为另一个项

    我的变量中有一个项目对象this rows 有一个来自服务器的实时项目与里面的项目相同this rows对象集合 如何用新值替换项目 这是一个例子 let rows id 11 active no id 22 active yes id 3
  • FirebaseCrashlytics:设置请求失败

    我几乎完成了 Android 应用程序的构建 但我想添加 Firebase Crashlytics 我总是添加这个并且安装它从来没有遇到过问题 但现在不同了 我收到以下错误 2021 05 24 20 41 42 807 11296 113
  • Ubuntu 16.10 x64 上的 Laravel 5.3 的 Cron 作业

    我正在运行 Digital Ocean 的 Ubuntu 16 10 x64 并在服务器上部署了 php Framework Laravel 5 3 28 在大多数情况下 一切都正常工作 但是我试图让 crontab 调用 artisan
  • Hudson 经验 - 构建矩阵项目

    有人尝试过该功能并有一些反馈吗 或者有人知道一些有用的示例来查找吗 几个月前我尝试过这个功能 但我不再使用它 只是因为我不需要它 而不是因为它不是一个好功能 基本上 您定义 n 个轴 每个轴都是一个具有多个值的属性 让我们举个例子 您定义了
  • 是否可以使用 AJAX 将图像文件上传到 Domino 服务器?

    是否可以使用 AJAX 将图像文件上传到 Domino 服务器 我正在尝试从 Android 手机上传照片 我可以将图像数据发送回 Domino 中的富文本字段 但我不知道如何将其渲染为多米诺表单上的图像 理想情况下 我想通过 ajax 发
  • 公共记录类型的构造函数?

    假设我想要一个记录类型 例如 type CounterValues Values int list IsCorrupt bool 问题是 我想创建一个构造函数 将传递的整数列表转换为一个没有负值的新列表 它们将被 0 替换 并且仅当在构造时
  • 无法将 NULL 值插入 AspNetUsers 表“Discriminator”列

    代码首次迁移后 使用寄存器添加用户失败 并显示 无法将 NULL 值插入表 aspnet BSF2013 20130918101120 dbo AspNetUsers 列 Discriminator 列不允许为空 创建用户代码是项目模板生成
  • 如何在计时器到期时关闭 InfoBox.Popup?

    我在 Outlook 2013 中从其他帖子中拼凑出了这个测试过程 它应该显示一个弹出框 然后在 3 秒后关闭 它永远不会关闭 Sub MessageBoxTimer Dim AckTime As Integer InfoBox As Ob
  • JLabel 超链接可在正确的 URL 处打开浏览器

    我需要使用 Java Swing 创建一个可单击的标签 并且能够打开桌面上的默认浏览器并将其重定向到特定的 url 我的代码能够打开浏览器 但无法将其重定向到正确的网址 加载默认主页 我的测试代码 import java awt impor
  • Node.js 用户名和密码认证

    我目前正在使用构建一个网络应用程序Node js and Express js 我正在寻找一种方法 在我的主目录中使用用户名和密码进行简单的服务器端身份验证app js正在监听的文件post请求于http www domain com lo