快速搭建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 相关文章推荐
基于jquery的blockui插件显示弹出层
Apr 14 Javascript
JQuery魔力之$("tagName")与selector
Mar 05 Javascript
javascript移出节点removeChild()使用介绍
Apr 03 Javascript
基于jQuery 实现bootstrapValidator下的全局验证
Dec 07 Javascript
Ajax跨域实现代码(后台jsp)
Jan 21 Javascript
Javascript中的神器——Promise
Feb 08 Javascript
关于jQuery EasyUI 中刷新Tab选项卡后一个页面变形的解决方法
Mar 02 Javascript
微信小程序开发之入门实例教程篇
Mar 07 Javascript
B/S(Web)实时通讯解决方案分享
Apr 06 Javascript
js实现网页的两个input标签内的数值加减(示例代码)
Aug 15 Javascript
vue侧边栏动态生成下级菜单的方法
Sep 07 Javascript
js 递归json树实现根据子id查父id的方法分析
Nov 08 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中的ini配置原理详解
2014/10/14 PHP
php中spl_autoload详解
2014/10/17 PHP
thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例
2019/07/03 PHP
一些常用的JS功能函数代码
2009/06/23 Javascript
Chrome Form多次提交表单问题的解决方法
2011/05/09 Javascript
JS跨域代码片段
2012/08/30 Javascript
js判断浏览器类型为ie6时不执行
2014/06/15 Javascript
jQuery中hasClass()方法用法实例
2015/01/06 Javascript
js实现随屏幕滚动的带缓冲效果的右下角广告代码
2015/09/04 Javascript
Bootstrap实现响应式导航栏效果
2015/12/28 Javascript
jQuery获取父元素节点、子元素节点及兄弟元素节点的方法
2016/04/14 Javascript
JavaScript代码性能优化总结篇
2016/05/15 Javascript
在html中引入外部js文件,并调用带参函数的方法
2016/10/31 Javascript
JS经典正则表达式笔试题汇总
2016/12/15 Javascript
bootstrap table支持高度百分比的实例代码
2018/02/28 Javascript
vue 中filter的多种用法
2018/04/26 Javascript
javascript sort()对数组中的元素进行排序详解
2019/10/13 Javascript
nodejs使用Sequelize框架操作数据库的实现
2020/10/21 NodeJs
ES6的循环与可迭代对象示例详解
2021/01/31 Javascript
python数字图像处理之高级滤波代码详解
2017/11/23 Python
tensorflow实现对图片的读取的示例代码
2018/02/12 Python
Python continue继续循环用法总结
2018/06/10 Python
python爬虫selenium和phantomJs使用方法解析
2019/08/08 Python
pytorch读取图像数据转成opencv格式实例
2020/06/02 Python
利用python实现平稳时间序列的建模方式
2020/06/03 Python
python如何写个俄罗斯方块
2020/11/06 Python
通过实例解析python and和or使用方法
2020/11/14 Python
pandas抽取行列数据的几种方法
2020/12/13 Python
Notino罗马尼亚网站:购买香水和化妆品
2019/07/20 全球购物
简历中自我评价怎么写
2014/02/12 职场文书
爸爸的花儿落了教学反思
2014/02/20 职场文书
2014年测量员工作总结
2014/12/12 职场文书
故意杀人罪辩护词
2015/05/21 职场文书
卫生主题班会
2015/08/14 职场文书
为什么你写的height:100%不起作用
2021/05/10 HTML / CSS
Pytorch distributed 多卡并行载入模型操作
2021/06/05 Python