图片来源:Oskar Yildiz on Unsplash
本文将教你如何使用Passport.js为你的Node服务器处理身份验证。本文不涉及前端身份验证。使用本文来配置你的后端身份验证(为每个用户生成令牌并保护路由)。
请记住,如果你在任何步骤上卡住了,你可以参考这个GitHub仓库。
本文将教你以下内容:
- 处理受保护的路由
- 处理JWT令牌
- 处理未经授权的响应
- 创建基本的API
- 创建模型和架构
简介
什么是Passport.js?
Passport是用于Node.js的身份验证中间件。由于它非常灵活和模块化,因此可以将Passport轻松地插入任何基于Express的Web应用程序中。一套全面的策略支持使用用户名和密码、Facebook、Twitter和更多进行身份验证。了解更多关于Passport的信息请在这里。
教程
从头开始创建我们的Node服务器
创建一个名为“app.js”的文件,并放入一个新的目录中:
我们将安装nodemon以便于开发。
然后我们将使用它来运行我们的“app.js”。
$ nodemon app.js
上述命令运行后的预期结果
创建用户模型
创建一个名为“models”的文件夹,并在其中创建“Users.js”文件。这是我们将定义我们的“UsersSchema”的地方。我们将使用JWT
和Crypto
从接收到的password
字符串生成hash
和salt
。稍后这将用于验证用户。
现在你应该有了这个结构
让我们将我们新创建的模型添加到“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令牌。我们还创建了一个带有optional
和required
属性的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”中没有令牌的情况下进行此操作。
响应:
评论(0)