在redis上的node.js中构建无密码的身份验证
#javascript #node #redis #身份验证

软件开发的最重要,最普遍的方面之一是如何授予应用程序中各种服务的访问,多年来,已经开发了许多认证模型,并具有各种利弊。没有任何缺陷,实际上没有一个完美的验证系统。不可能拥有一个非常安全和方便的系统,同时使用。我们越倾向于“安全”方面,大多数用户的用户体验就越困难,并且已经开发了各种模型来找到平衡。
更可行的是在各种用例中找到更重要的内容并相应地应用。

就像其他各种安全系统一样,其起源可追溯到罗马帝国,因此可以根据此Wikipedia page

将密码追溯到相同的根源

密码自引入以来已经发生了很大的发展,多年来,许多加密模型是为了遏制各种密码攻击。有时,即使密码加密模型也不是足够安全的,实际上,大多数密码泄露是由人类错误造成的,从纯文本中存储密码的公司,使用弱密码或只是粗心或只是粗心或太信任他们的密码。

事实是,只要密码存在,所有这些都将继续是一个问题。

最安全的密码根本不是密码,因为如果存在,可以破解。

如果我们可以完全消除密码并处理所有相关问题怎么办?

Image description

在本文中,我们将开发基于Redis建立的无密码身份验证系统,上面讨论的所有问题都可以成为过去。

请注意,我并不是说这将是最安全的系统,但是至少我们可以确定,如果没有上面列出的所有相关问题,我们的系统仍将得到保护。

为什么要重新询问这样的应用程序?出于简单的原因,传统数据库很慢,REDIS超快。我们不希望我们的用户等待太久,然后他们才能访问我们的系统,因为密码已扰乱,对吗?所以让我们去。

先决条件

要与本教程一起遵循,您需要在计算机上安装以下内容:
node.js
NPM
代码编辑器(VSCODE)
Postman/Web浏览器
Mailgun Account

Redisinsight-如果您已经有一个,请在计算机here上安装一个。

最后,您需要为您的Redis Cloud数据库拥有一个Redis Enterprise帐户。如果您已经没有那个只是前往他们的website创建一个免费帐户。

入门

首先,我们将安装此应用程序所需的依赖项,因此打开您的终端并执行以下命令

cd desktop && mkdir passwordless-authentication && cd passwordless-authentication

初始化目录以创建一个package.json文件

npm init -y

安装依赖项

让我们通过运行以下命令来安装我们将使用的各种软件包用于开发本应用程序:

npm i express dotenv redis-om jsonwebtoken nodemailer

最后,让S安装Nodemon作为DEV依赖性,通过运行以下命令来帮助我们的开发流程:

npm i -D nodemon

现在,我们使用Express创建一个简单的Node.js服务器,以确保所有内容都已正确设置。为此,请在您的项目的根部创建一个名为srcâ的新目录,并在内部创建一个名为index.js的新文件,然后将代码粘贴到文件中。

在您的软件包的脚本部分中。

"start": "nodemon index.js"

现在,通过在终端中运行npm start`启动服务器。您应该在下面登录到终端的屏幕截图附近看到一些东西。

Image description

现在我们确定服务器已正确设置,我们需要做的下一步就是设置REDIS数据库来处理我们的事件数据的存储。

REDIS Enterprise设置

要设置REDIS数据库,请登录到Redis Enterprise帐户here。如果您没有创建一个帐户,但只需前往Redis website并创建一个免费帐户。您应该在注册页面上使用免费的信用优惠券来探索Redis以外的免费产品。

在您的Redis Enterprise仪表板上,单击 新订阅按钮,选择'固定计划,然后选择100MB的存储空间选项。您可以选择自己选择的任何云提供商,但是为了本教程,让我们使用默认值(AWS),然后确保您的设置是下面屏幕截图的复制品。

Image description

不用担心,由于您应用了 200美元的优惠券,因此您不会为选择的计划收取费用。我们需要该计划来激活Redis DB的数据持久性,因为拥有一个事件管理平台会很奇怪,每次您回到它时,它总是空的。

但是,只要您仍然持怀疑态度,您可以选择免费的(30MB)选项,只有数据将不会持续存在,但是您仍然可以使用该选项与本教程一起跟随本教程。

Image description

现在在您的订阅仪表板上,单击“新数据库”按钮。给您的数据库一个名称,然后在“类型”部分下选择REDIS选项,以专门选择REDIS模块,在我们的情况下是Redisearch和Redisjson。

确保您还选择了选择的数据持久性选项,但是在这种情况下,我们将使用每小时运行的快照选项。完成数据库时,请单击“激活数据库”按钮。之后,您应该看到类似于下面的数据库配置屏幕。

Image description

可视化数据

现在我们已经正确设置了数据库,我们需要一些东西来可视化存储在redis db中的数据,这就是RedisInsight的所在地。现在启动您的RedisinSight并单击添加redis database' 按钮,然后在您的Redis Enterprise DB Connection字符串中复制并粘贴。

Image description

在您的Redis Enterprise DB配置页面上,它被称为 公共端点 。然后,在同一DB配置页面上,您会看到默认的用户名和密码,复制并将其粘贴到Redisinsght连接对话框中,然后单击添加Redis数据库按钮以连接到Redis Enterprise DB。您应该在下一页上查看DB摘要,该摘要将是空的,因为Redis数据库中当前没有数据。

Image description

从应用程序连接您的redis db

接下来要做的是从事件管理器应用程序内部设置与我们的redis数据库的连接。为此,在“ SRC”中创建一个名为DB的新目录,并在新创建的DB目录中创建一个名为“ index.js” 的新文件。将以下代码复制并粘贴到文件中。

{%嵌入https://gist.github.com/iMichaelOwolabi/ab7e7144aa3ea5e6033e7cdd22a2ee70%}

构建无密码身份验证

现在已经设置了所有构建块,让我们潜入没有密码的情况下构建我们的身份验证系统。

我们要做的第一件事是为身份验证目的建模我们的实体。我们将允许用户能够使用其电子邮件或用户名登录,以便这样做,让我们在SRC目录中创建一个目录并将其命名为存储库。在新创建的存储库中,创建一个名为 user.js 的文件,然后粘贴到下面的代码中。

{%嵌入https://gist.github.com/iMichaelOwolabi/c7dbc25e6706236e00c958edf0699068%}

在这里,我们已经对身份验证数据进行了建模,并使用主要是字符串的正确数据类型分配了各个字段。您会注意到,在日期字段中,我们有一个新属性“可排序”,这与SQL中的订单类似,它使我们可以订购查询结果。在这种情况下,我们可以获取所有用户并将其从最近创建的最少用户订购。

我们通过从我们的架构上调用"createIndex()"方法在用户模型上创建索引。此次要索引是重新搜索最大的功能。我们的搜索性能与我们的索引的良好成正比。

我们将在SRC文件夹中创建一个新目录,并将其命名路由。在路由目录中,让S创建一个新文件,称为“ authrouter.js” 和以下代码中的粘贴:

{%嵌入https://gist.github.com/iMichaelOwolabi/0494dfab097b457855915367595b54d0%}

此路由器文件是我们对应用程序的所有端点的定义,并且负责将请求路由到右控制器函数以执行。

您会注意到,我们将一些控制器功能和中间件导入到AuthRouter文件中,因此,让我们继续进行构建。这里的这些auth方法是我们以前从未见过的任何新方法,唯一的区别是,我们使用的是直接从磁盘上写和阅读的传统关系或文档DB,而是将超级快速的Redis用作我们的数据库又使我们的用户身份验证过程快速。

因此,在SRC目录内创建一个名为Controller的新文件夹。在新创建的目录中,创建一个名为“ authcontroller.js”的新文件并将以下代码粘贴到其中。

{%嵌入https://gist.github.com/iMichaelOwolabi/06cd1053d7e653ba920f0da725ac6e07%}

在上面的代码中,您可以看到一些类似SQL的查询结构,这使整个内容非常友好,这是Redis-om使其成为可能的,这是Redis的新redis客户端

现在,让我们整理出我们在Auth Controller文件中使用的因模块。

即使我们的目的是在此应用程序中消除我们的身份验证过程中的密码,我们仍然需要使其安全,但我们冒着允许整个Internet访问资源的风险。因此,让我们在SRC目录内创建一个名为utils的新目录。在utils文件夹中,创建两个新文件,即“ jwthelper.js” “ emailtransporter.js”

在jwthelper文件副本中,并将以下代码粘贴到其中。

{%嵌入https://gist.github.com/iMichaelOwolabi/94d5a7282fe813b5bcffe970a35b93bc%}

我们对用户进行身份验证的方法仅涉及将登录凭据发送给用户电子邮件,该电子邮件是一种手段验证,即使用户使用密码可以访问其受保护的内容,我们仍然可以确保他们请要求以这种方式访问​​的方式使系统仍然安全。

设置电子邮件服务

要发送电子邮件,我们需要用户使用电子邮件服务提供商,为了本文,我们将使用Mailgun。为了能够发送免费电子邮件,我们需要添加经过验证的收件人,因此请登录您的Mailgun帐户,然后单击从侧边栏中发送的“从下拉列表”列表中单击“域”。

Image description

您应该看到MailGun提供的默认域。现在单击域,您应该查看可以在哪里添加电子邮件列表以进行验证。

Image description

添加您将发送消息到测试目的的电子邮件,并通过接受发送到添加电子邮件帐户的电子邮件中的条款来验证邮件。类似于我们下面的东西。

现在我们设置了电子邮件服务,让我们将其插入应用程序,因此将以下代码复制并粘贴到“ emailtransporter”文件中。

{%嵌入https://gist.github.com/iMichaelOwolabi/4da4997767773f314914dbdefbd5c4db%}

我们越来越接近应用程序的末尾。让我们保护我们的一些终点免于未经授权的用户访问。在名为“中间件”的SRC目录中创建一个新文件夹,然后在名为“ index.js”的新文件夹中创建一个新文件,然后将代码粘贴到文件中。

{%嵌入https://gist.github.com/iMichaelOwolabi/5aa9ac993e3104aa7673143c135111c0%}

完全带来它

现在,我们已经完成了构建应用程序的各个部分,我们需要找到一种方法来确保服务器了解我们的路线index.js文件位于项目的根部。只需复制以下代码并将index.js文件的内容替换为

最后在项目的根部创建一个新文件,名为“。env”
ENV文件是我们将用来存储应用程序中使用的秘密值的用途,以便它们不接触到公众。在Env文件中,复制并粘贴以下内容,然后相应地填充值。

`
端口=
redis_db_url =
redis_db_user =
redis_db_pass =
TokenexpirationTime =
jwtsecret =

mailgun_smtp_hostname =
smtp_port =
mailgun_smtp_username =
mailgun_smtp_password =
`

我们已经成功地在Node.js中成功构建了一个无密码的身份验证系统。

通过从项目目录中运行以下命令来启动服务器

npm start

现在让我们测试我们的实现。打开邮递员并创建一个用户帐户,登录和验证。

创建一个用户帐户

Image description

Image description

登录屏幕截图

Image description

Image description

恭喜您做到这一点。在评论部分中分享您的想法。

可以在此Github Repository中找到完整的代码。

这篇文章与Redis合作。

如果您喜欢与我们合作,就像我们喜欢与您合作并想继续为我们写作,我们现在正在接受更多博客的应用程序。您可以应用here