首页
Preview

学习如何使用 Passport.js 在 Node 中处理身份验证(2023)

图片来源:Oskar Yildiz on Unsplash

本文将教你如何使用Passport.js为你的Node服务器处理身份验证。本文不涉及前端身份验证。使用本文来配置你的后端身份验证(为每个用户生成令牌并保护路由)。

请记住,如果你在任何步骤上卡住了,你可以参考这个GitHub仓库

本文将教你以下内容:

  • 处理受保护的路由
  • 处理JWT令牌
  • 处理未经授权的响应
  • 创建基本的API
  • 创建模型和架构

简介

什么是Passport.js?

Passport是用于Node.js的身份验证中间件。由于它非常灵活和模块化,因此可以将Passport轻松地插入任何基于Express的Web应用程序中。一套全面的策略支持使用用户名和密码FacebookTwitter更多进行身份验证。了解更多关于Passport的信息请在这里

教程

从头开始创建我们的Node服务器

创建一个名为“app.js”的文件,并放入一个新的目录中:

我们将安装nodemon以便于开发。

然后我们将使用它来运行我们的“app.js”。

$ nodemon app.js

上述命令运行后的预期结果

创建用户模型

创建一个名为“models”的文件夹,并在其中创建“Users.js”文件。这是我们将定义我们的“UsersSchema”的地方。我们将使用JWTCrypto从接收到的password字符串生成hashsalt。稍后这将用于验证用户。

现在你应该有了这个结构

让我们将我们新创建的模型添加到“app.js”中。

在配置Mongoose后,在你的“app.js”文件中添加以下行:

require('./models/Users');

配置Passport

创建一个名为“config”的文件夹,并在其中创建“passport.js”文件:

在此文件中,我们使用我们在“User model”中定义的方法validatePassword。基于结果,我们从Passport的LocalStrategy返回不同的输出。

现在你应该有了这个结构

让我们将“passport.js”连接到我们的“app.js”文件。在所有models之后添加以下行:

require('./config/passport');

Passport的require必须在所有models之后

路由和身份验证选项

创建一个名为“routes”的文件夹,并在其中创建“auth.js”文件。

在此文件中,我们使用函数getTokenFromHeaders来获取从客户端请求标头中发送的JWT令牌。我们还创建了一个带有optionalrequired属性的auth对象。稍后我们将在我们的路由中使用这些属性。在同一个“routes”文件夹中创建一个“index.js”文件:

现在,我们需要在“routes”文件夹内创建一个“api”文件夹,并在其中再创建一个“index.js”文件。

现在,你应该有了如下的文件结构:

现在,让我们创建“users.js”文件,然后在“api/index.js”中引入它。

首先,我们将创建一个可选的认证路由‘/’,该路由将用于新模型的创建(注册)。

router.post('/', auth.optional, (req, res, next) ...

之后,我们将创建另一个可选的认证路由‘/login’。这将用于激活我们的护照配置,并使用电子邮件验证接收到的密码。

router.post('/login', auth.optional, (req, res, next) ...

最后,我们将创建一个必需的认证路由,该路由将用于返回当前登录的用户。只有已登录的用户(将其令牌成功发送到请求标头的用户)才能访问此路由。

router.get('/current', auth.required, (req, res, next) ...

现在,你应该有了如下的文件结构:

让我们将“routes”文件夹添加到“app.js”中。请在我们的护照require下方添加以下行:

app.use(require('./routes'));

路由测试

我将使用Postman向我们的服务器发送请求。

我们的服务器接受以下内容:

{
  "user": {
    "email": String,
    "password": String
  }
}

创建一个POST请求来创建用户

测试内容:

响应:

{
    "user": {
        "_id": "5b0f38772c46910f16a058c5",
        "email": "erdeljac.antonio@gmail.com",
        "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImVyZGVsamFjLmFudG9uaW9AZ21haWwuY29tIiwiaWQiOiI1YjBmMzg3NzJjNDY5MTBmMTZhMDU4YzUiLCJleHAiOjE1MzI5MDgxNTEsImlhdCI6MTUyNzcyNDE1MX0.4TWc1TzY6zToHx_O1Dl2I9Hf9krFTqPkNLHI5U9rn8c"
    }
}

现在,我们将使用此令牌并将其添加到Postman配置中的“Headers”中。

现在,让我们测试我们的仅限认证路由。

创建一个GET请求来返回当前登录的用户

请求URL:

GET http://localhost:8000/api/users/current

响应:

{
    "user": {
        "_id": "5b0f38772c46910f16a058c5",
        "email": "erdeljac.antonio@gmail.com",
        "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImVyZGVsamFjLmFudG9uaW9AZ21haWwuY29tIiwiaWQiOiI1YjBmMzg3NzJjNDY5MTBmMTZhMDU4YzUiLCJleHAiOjE1MzI5MDgzMTgsImlhdCI6MTUyNzcyNDMxOH0.5UnA2mpS-_puPwwxZEb4VxRGFHX6qJ_Fn3pytgGaJT0"
    }
}

让我们尝试在“Headers”中没有令牌的情况下进行此操作。

响应:

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
一个人玩
先找到想要的,然后出发

评论(0)

添加评论