快速搭建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 工具库 Cloudgamer JavaScript Library v0.1 发布
Oct 29 Javascript
jQuery EasyUI API 中文文档 - Menu菜单
Oct 03 Javascript
JavaScript入门之事件、cookie、定时等
Oct 21 Javascript
jquery text()方法取标签中的文本
Jul 25 Javascript
js中实现字符串和数组的相互转化详解
Jan 24 Javascript
jQuery实现元素拖拽并cookie保存顺序的方法
Feb 20 Javascript
js实现淡入淡出轮播切换功能
Jan 13 Javascript
LayerClose弹窗关闭刷新方法
Aug 17 Javascript
vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】
Nov 08 Javascript
开源一个微信小程序仪表盘组件过程解析
Jul 30 Javascript
vue中的使用token的方法示例
Mar 10 Javascript
JS removeAttribute()方法实现删除元素的某个属性
Jan 11 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和XSS跨站攻击的防范
2007/04/17 PHP
PHP 数字左侧自动补0
2008/03/31 PHP
PHP 字符串长度判断效率更高的方法
2014/03/02 PHP
分享一段PHP制作的中文拼音首字母工具类
2014/12/11 PHP
php实现将数据做成json的格式给前端使用
2018/08/21 PHP
jquery实现的随机多彩tag标签随机颜色和字号大小效果
2014/03/27 Javascript
IE中getElementsByName()对有些元素无效的解决方案
2014/09/28 Javascript
分享9个最好用的JavaScript开发工具和代码编辑器
2015/03/24 Javascript
JS实现仿微博可关闭弹出层效果
2015/09/21 Javascript
JS实现上下左右对称的九九乘法表
2016/02/22 Javascript
jQuery实现图片加载完成后改变图片大小的方法
2016/03/29 Javascript
微信小程序 loading(加载中提示框)实例
2016/10/28 Javascript
从零学习node.js之搭建http服务器(二)
2017/02/21 Javascript
jQuery实现鼠标经过显示动画边框特效
2017/03/24 jQuery
Javascript 详解封装from表单数据为json串进行ajax提交
2017/03/29 Javascript
Angular.js中ng-include用法及多标签页面的实现方式详解
2017/05/07 Javascript
详解Vue-cli webpack移动端自动化构建rem问题
2018/04/07 Javascript
Vue中mintui的field实现blur和focus事件的方法
2018/08/25 Javascript
layui的表单提交以及验证和修改弹框的实例
2019/09/09 Javascript
分享JS表单验证源码(带错误提示及密码等级)
2020/01/05 Javascript
vue学习之Vue-Router用法实例分析
2020/01/06 Javascript
vue中重定向redirect:‘/index‘,不显示问题、跳转出错的完美解决
2020/09/28 Javascript
JS绘图Flot如何实现动态可刷新曲线图
2020/10/16 Javascript
jQuery实现动态操作table行
2020/11/23 jQuery
[55:03]LGD vs EG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python提示No module named images的解决方法
2014/09/29 Python
Python中自定义函数的教程
2015/04/27 Python
详解python中executemany和序列的使用方法
2017/08/12 Python
关于keras.layers.Conv1D的kernel_size参数使用介绍
2020/05/22 Python
amazeui页面分析之登录页面的示例代码
2020/08/25 HTML / CSS
英国在线照明超市:Castlegate Lights
2019/10/30 全球购物
什么是静态路由,其特点是什么?什么是动态路由,其特点是什么?
2013/07/26 面试题
机关领导干部作风整顿整改措施
2014/09/19 职场文书
庆国庆国旗下讲话稿2014
2014/09/21 职场文书
门面房租房协议书
2014/12/01 职场文书
小学大队长竞选稿
2015/11/20 职场文书