快速使用node+express+mongodb实现登录验证接口

本文介绍如何使用Node.js、Express框架及Mongoose库快速搭建RESTful API服务,并实现用户注册、登录功能,同时介绍了JWT认证机制及其在Express框架中的应用。

电脑环境安装:node、npm、mongodb

项目环境安装:express、mongoose

npm install express --save
npm install mongoose --save

什么是express ?

Express 是 基于 Node.js 平台,快速、开放、极简的 Web 开发框架。

Express 是一个保持最小规模的灵活的 Node.js Web 应用程序开发框架,为 Web 和移动应用程序提供一组强大的功能。

Express 是最流行的 Node 框架,是许多其它流行 Node 框架 的底层库。

什么是mongoose ?

Mongoose是Nodejs的一个模块,这个模块可以操作MongoDB模块对数据库的操作

Mongooose是一个对象文档模型(ODM)库,它对Node原生的MongoDB模块进一步的优化封装,并提供了更多的功能。

Mongoose,是MongoDB的一个对象模型工具,是基于node-mongodb-native开发的MongoDB的nodejs驱动,也是目前Node.js操作 MongoDB的首选库。

什么是JWT?

JWT 全称 JSON Web Token,是代替传统 session 认证的解决方案。其原理是服务端生成一个包含用户唯一标识的 JSON 对象,颁发给客户端。客户端请求需要权限的接口时,只要把这个 JSON 再原样发回给服务端,服务端通过解析就可识别用户。

JSON 对象通常是这样子:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjYzNGY3MWZhMTU2MDRiZjdkNmVlOTc2NSIsInVzZXJuYW1lIjoieXl5IiwiaWF0IjoxNjY2MjMyMTM0fQ.NcnpkbY6JweWvJ-eDZS0X5lPDl1QI5FKBAeWpgf6CKQ

这个 JSON 对象通过点 . 分成三段,包含了请求头(加密算法)、负载信息(如 userId,过期时间),还有通过服务端密钥生成的签名来保证不被篡改。这种机制使服务端不再需要存储 Token,因此是非常轻量的用户认证方案。并且对于微服务这种需要不用服务间公用 Token 的跨域认证,JWT 是目前的首选。

什么是express-jwt?

express-jwt 是专用于 express 框架下解析 JWT 的中间件。它使用非常简单,而且会自动把 JWT 的 payload 部分赋值于 req.user,方便逻辑部分调用。

项目准备

新建一个文件夹,使用 npm init -y,对项目进行初始化操作,对项目依赖包进行管理。

-y的含义:yes的意思,在 init 的时候省去了敲回车的步骤,直接生成默认的 package.json

使用以下命令,安装本项目所需要的依赖包文件

npm install express --save
npm install mongoose --save

开启服务

1、新建一个 app.js 文件

const express = require('express');
const app = express();

app.get('/api/user', async (req, res) => {
    res.send('hello node.js')
})

app.listen(3000, () => {
    console.log('http://localhost:3000');
})

2、在命令行输入 node app.js,开启后台服务

3、在浏览器访问地址,http://localhost:3000/api/user,出现下图消息,代表后台服务开启成功。

实现简单的GET请求接口

app.get('/api/user', async (req, res) => {
    res.send('hello node.js')
})

实现简单的POST请求接口

app.use(express.json()) // 设置后可以用 req.body 获取 POST 传入 data

app.post('/api/register', async (req, res) => {
    console.log(req.body);
    res.send('ok')
})

连接MongoDB数据库

1、在本电脑上,安装 mongodb 数据库,并开启服务

2、在根目录下新建 data/db.js 文件

// 引入 mongoose 
const mongoose = require('mongoose')

// 连接数据库,自动新建 express_admin 库
mongoose.connect('mongodb://localhost:27017/express_admin', {
    useNewUrlParser: true,
    useUnifiedTopology: true
})

// 建立用户表
const UserSchema = new mongoose.Schema({
  username: {
    type: String,
    unique: true
  },
  password: {
    type: String,
  }
})

// 建立用户数据库模型
const User = mongoose.model('User', UserSchema)

module.exports = { User }

const conn = mongoose.connection;

conn.on("error",error=>{
    console.log("数据库连接失败:" + error);
})
conn.on("open",()=>{
    console.log("数据库连接成功");
})

创建一个post请求,注册一个用户

const express = require('express');
const app = express();
const { User } = require('./data/db');

app.use(express.json()) // 设置后可以用 req.body 获取 POST 传入 data

// server.js
app.post('/api/register', async (req, res) => {
    User.create({
      username: req.body.username,
      password: req.body.password
    })
    res.send('ok')
})

app.listen(3000, () => {
    console.log('http://localhost:3000');
})

模拟用户发起POST请求,注册一个用户

@url=http://localhost:3000/api

POST {{url}}/register
Content-Type: application/json

{
  "username": "llb",
  "password": "123456"
}

数据库会自动创建好,并多了一条用户数据:

 用户登录密码加密

在app.js中添加一个/login的post请求

app.post('/api/login', async (req, res) => {
    const user = await User.findOne({
        username: req.body.username
    })
    
    if(!user) {
        return res.status(422).send({
            message: '用户名不存在'
        })
    }
    // compareSync 解密匹配,返回 boolean 值
    const isPasswordValid = bcrypt.compareSync(
        req.body.password,
        user.password
    )

    if(!isPasswordValid) {
        return res.status(422).send({
            message: '密码不正确'
        })
    }

    res.send({
        user
    })
})

登录jwt认证 token

1.安装jsonwebtoken依赖包

npm install jsonwebtoken --save

2.引入 jsonwebtoken,自定义密钥

const jwt = require('jsonwebtoken')
// 解析token用的密钥
const SECRET = 'token_secret'

3.在登录成功时,创建token

// jwt.sign() 接收两个参数,一个是传入的对象,一个是自定义的密钥
    const token = jwt.sign({ id: String(user._id)}, SECRET)
    res.send({
        user,
        token
    })

4.发送请求测试时,可以看到创建好的token

解密token获取登录用户信息

1.在app.js中添加/profile的get请求

app.get('/api/profile', async (req, res) => {
    const raw = String(req.headers.authorization.split(' ').pop())
    // 解密token获取对应的id
    const { id } = jwt.verify(raw, SECRET)
    const result = await User.findById(id)
    res.send(result)
})

2.模拟"yyy"用户发起一个/profile的get请求

@url=http://localhost:3000/api

get {{url}}/profile
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjYzNGY3MWZhMTU2MDRiZjdkNmVlOTc2NSIsImlhdCI6MTY2NjE2OTUwMH0.1U0rSN0ARzVvdBgRLbFWnmUXOLgkGOjBoyoN76owPgk

3.发起请求测试时,可以看到yyy用户的信息,说明解密成功

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值