快速搭建Node.js(Express)用户注册、登录以及授权的方法


Posted in Javascript onMay 09, 2019

项目准备

  1. 建立一个文件夹,这里叫 EXPRESS-AUTH
  2. npm init -y

启动服务

  1. 新建一个server.js 或者 app.js
  2. npm i express
  3. 开启端口,启动服务
// server.js
// 引入 express
const express = require('express')
// 创建服务器应用程序
const app = express()

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

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

在命令行运行 nodemon .\server.js 命令启动服务

注:nodemon 命令需要全局安装 nodemon( npm install --global nodemon ), 在浏览器访问/user时如下,则说明开启成功

快速搭建Node.js(Express)用户注册、登录以及授权的方法

实现简单的 GET 请求接口

创建处理 get 请求的接口

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

在vscode商店中下载 REST Client

快速搭建Node.js(Express)用户注册、登录以及授权的方法

新建一个 test.http 文件测试接口,点击 Send Request 发送请求

// test.http
@url=http://localhost:3001/api

### 
get {{url}}/user

快速搭建Node.js(Express)用户注册、登录以及授权的方法

如上图,get 请求成功

操作 MongoDB 数据库

连接数据库

  1. 安装 mongodb 数据库
  2. 在需要启动的盘符根目录下新建 data/db 文件夹
  3. 在命令行对应的盘符下输入 mongod 命令,即可开启服务
  4. 有需要可以下载NoSQLBooster for MongoDB软件

建立数据库模型

  • npm i mongoose
  • 新建 model.js 操作数据库
// 引入 mongoose 
const mongoose = require('mongoose')

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

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

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

module.exports = { User }

简单的 POST 请求

创建处理 POST 请求的接口

// server.js
app.post('/api/register', async (req, res) => {
 console.log(req.body);
 res.send('ok')
})
app.use(express.json()) // 设置后可以用 req.body 获取 POST 传入 data

设置 /api/register

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

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

注册用户

// server.js
app.post('/api/register', async (req, res) => {
 // console.log(req.body);
 const user = await User.create({
 username: req.body.username,
 password: req.body.password
 })
 res.send(user)
})

数据库里多了一条用户数据:

快速搭建Node.js(Express)用户注册、登录以及授权的方法

密码 bcrypt 加密

  • npm i bcrypt
  • 在 model.js 中设置密码入库前加密,这里的 hashSync方法接受两个参数,val 表示传入的 password,10表示加密的等级,等级越高,所需转化的时长越长

快速搭建Node.js(Express)用户注册、登录以及授权的方法

用户登录密码解密

在 server.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: '用户名不存在'
 })
 }
 // bcrypt.compareSync 解密匹配,返回 boolean 值
 const isPasswordValid = require('bcrypt').compareSync(
 req.body.password,
 user.password
 )
 if (!isPasswordValid) {
 return res.status(422).send({
  message: '密码无效'
 })
 }
 res.send({
 user
 })
})

登录添加 token

安装 jsonwebtoken npm i jsonwebtoken
引入 jsonwebtoken,自定义密钥

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

在登录成功时创建 token

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

这样我们在发送请求时,就能看到创建的 token

快速搭建Node.js(Express)用户注册、登录以及授权的方法

解密 token获取登录用户

先在 server.js 处理 token

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

发送请求,这里的请求头是复制之前测试用的 token

### 个人信息
get {{url}}/profile
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjVjZDI5YjFlMTIwOGEzNDBjODRhNDcwMCIsImlhdCI6MTU1NzM2ODM5M30.hCavY5T6MEvMx9jNebInPAeCT5ge1qkxPEI6ETdKR2U

服务端返回如下图,则说明解析成功

快速搭建Node.js(Express)用户注册、登录以及授权的方法

配套完整代码和注释见 Github

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript 兼容firefox的一些问题
May 21 Javascript
jQuery each()方法的使用方法
Mar 18 Javascript
5个javascript的数字格式化函数分享
Dec 07 Javascript
js无刷新操作table的行和列
Mar 27 Javascript
JS中Location使用详解
May 12 Javascript
js生成验证码并直接在前端判断
May 15 Javascript
JavaScript学习笔记之数组随机排序
Mar 23 Javascript
jquery easyui validatebox remote的使用详解
Nov 09 Javascript
微信小程序-滚动消息通知的实例代码
Aug 03 Javascript
JS async 函数的含义和用法实例总结
Apr 08 Javascript
javascript设计模式 ? 中介者模式原理与用法实例分析
Apr 20 Javascript
详解JavaScript中的Object.is()与"==="运算符总结
Jun 17 Javascript
uni-app之APP和小程序微信授权方法
May 09 #Javascript
详解使用uni-app开发微信小程序之登录模块
May 09 #Javascript
D3.js的基础部分之数组的处理数组的排序和求值(v3版本)
May 09 #Javascript
JS原型与继承操作示例
May 09 #Javascript
详解微信小程序回到顶部的两种方式
May 09 #Javascript
jquery登录的异步验证操作示例
May 09 #jQuery
D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)
May 09 #Javascript
You might like
PHP读取MySQL数据代码
2008/06/05 PHP
php 无限级缓存的类的扩展
2009/03/16 PHP
在 Laravel 中动态隐藏 API 字段的方法
2019/10/25 PHP
Sample script that displays all of the users in a given SQL Server DB
2007/06/16 Javascript
idTabs基于JQuery的根据URL参数选择Tab插件
2012/04/11 Javascript
JQuery操作Select的Options的Bug(IE8兼容性视图模式)
2013/04/21 Javascript
jquery实现的用户注册表单提示操作效果代码分享
2015/08/28 Javascript
浅析javascript函数表达式
2016/02/10 Javascript
深入理解jQuery之防止冒泡事件
2016/05/24 Javascript
Bootstrap3 模态框使用实例
2017/02/22 Javascript
原生js实现可拖拽效果
2017/02/28 Javascript
nodejs的路径问题的解决
2018/06/30 NodeJs
angular6根据environments配置文件更改开发所需要的环境的方法
2019/03/06 Javascript
javascript定时器的简单应用示例【控制方块移动】
2019/06/17 Javascript
layui table数据修改的回显方法
2019/09/04 Javascript
基于ts的动态接口数据配置的详解
2019/12/18 Javascript
JS实现分页导航效果
2020/02/19 Javascript
three.js 实现露珠滴落动画效果的示例代码
2021/03/01 Javascript
深入理解Python 代码优化详解
2014/10/27 Python
python集合类型用法分析
2015/04/08 Python
python 安装virtualenv和virtualenvwrapper的方法
2017/01/13 Python
用python实现简单EXCEL数据统计的实例
2017/01/24 Python
如何基于python操作excel并获取内容
2019/12/24 Python
Python类反射机制使用实例解析
2019/12/30 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
2020/01/09 Python
使用Keras实现简单线性回归模型操作
2020/06/12 Python
python 线程的五个状态
2020/09/22 Python
PyTorch中的拷贝与就地操作详解
2020/12/09 Python
LA MER海蓝之谜美国官网:传奇面霜
2016/08/27 全球购物
Avène雅漾美国官方网站:敏感肌肤护理专家
2016/10/24 全球购物
乌克兰品牌化妆品和香水在线商店:Bomond
2020/01/14 全球购物
.NET现在共支持多少种语言
2014/02/26 面试题
英语专业推荐信
2013/11/16 职场文书
职工宿舍管理制度
2015/08/05 职场文书
工伤事故赔偿协议书
2015/08/06 职场文书
阿里云服务器部署mongodb的详细过程
2021/09/04 MongoDB