nodejs的基本使用(四)身份认证Session,JWT

web开发模式

目前有两个主流:

  1. 服务端渲染
  2. 前后端分离

服务端渲染:服务器发给客户端html页面,在服务器端通过拼接,动态生成。所以客户端不需要使用ajax技术。

优点:前端耗时少,有利于seo

缺点:占用服务器资源,不利于前后分离,开发效率低

前后端分离:依赖于ajax

优点:开发体验好,用户体验好,减轻了服务端的渲染压力。

缺点:不利于网站的seo

身份认证

服务端渲染使用session认证机制

前后分离使用JWT认证机制

Session认证机制

http协议无状态性:就是发送多次请求,服务器不会保留上一次的状态。

现实生活中会员卡身份认证,在web中叫做Cookie,Cookie是存放浏览器的字符串,由名称,值等组成 用于控制Cookie有效期,安全性,使用范围的可选属性组成。session认证不适合跨域认证。

下面使用Session认证:

# 安装
yarn add express-session
// app.js

const express = require('express')
const cors = require('cors')
// 导入session
const session = require('express-session')
// 创建app
const app = express()

// 注册中间件
app.use(express.static('./pages'))
app.use(cors())
app.use(express.json())
app.use(express.urlencoded({ extended: false }))
// 使用session 固定写法
app.use(
  session({
    secret: 'zxc', // 任意字符 密钥
    resave: false,
    saveUninitialized: true
  })
)

// 登录
app.post('/api/login', (req, res) => {
  if (req.body.username !== 'admin' || req.body.password !== '000') {
    return res.send({ status: 1, msg: '登陆失败' })
  }
  // 登陆成功后的用户信息 保存到session中
  req.session.user = req.body //用户信息
  req.session.islogin = true //登陆状态
  res.send({
    statu: 0,
    msg:'登陆成功'
  })
})

// 获取session中的数据
app.get('/api/username', (req, res) => {
  if (!req.session.islogin) {
    return res.send({ status: 1, meg: 'fail' })
  }
  res.send({ status: 0, data: req.session.username })
})

// 退出登录清空session
app.post('/api/logout', (req, res) => {
  req.session.destroy() //只会清空当前用户的session
  res.send({ status: 0, msg: '退出成功' })
})

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

JWT认证机制

jwt工作原理:客户端提交账户密码发送给服务端,服务端验证账号密码通过后会返回给客户端一个token字符串,客户端拿到之后进行本地存储。等再一次登陆时,直接使用本地存储的token字符串进行登录就实现了免密登录。

jwt字符串由 header payload signature组成,payload部分才是真正的用户信息,其他两部分只为了保证token的安全性。

下面是jwt的使用方式:

拿到token后,每次请求服务器都在请求头带上token字段,推荐做法:

// 设置请求头 Authorization字段
Authorization: Bearer <token>

安装

yarn add jsonwebtoken express-jwt

jsonwebtoken:可以生产token字段

express-jwt:用于将jwt字符串解析还原成json对象,当我们配置了之后,那么req.user就是存储的是当前解析token中的数据,就可以使用req.user获取。

// app.js
const express = require('express')
const jwt = require('jsonwebtoken')
const expressJWT = require('express-jwt')
const bodyParser = require('body-parser')
// 创建app
const app = express()
// 注册中间件
app.use(bodyParser.urlencoded({ extended: false }))
const secretKey = 'test-01' //定义secretKey密钥
// 解析token 需要secretKey密钥,algorithms为['HS256'] unless中的path可以指定不需要token验证的接口
app.use(
  // 配置了express-jwt中间件 就可以把解析出来的用户信息挂载到 req.user上
  expressJWT({ secret: secretKey, algorithms: ['HS256'] }).unless({
    path: [/\/api\/login/]
  })
)

// 登录接口
app.post('/api/login', (req, res) => {
  const { username, password } = req.body
  if (username !== 'admin' || password !== '000') {
    return res.send({ status: 1, msg: '登陆失败' })
  }
  // jwt.sign() 生成token
  // 参数一:用户信息对象
  // 参数二:加密的密钥
  // 参数三:配置对象,可以配置token有效期
  // 千万不要把密码加密到字符串中,否则就危险了
  const token = jwt.sign({ username }, secretKey, {
    expiresIn: '30s'
  })
  res.send({
    status: 200,
    msg: '登陆成功',
    token
  })
})
// expressJWT 解析token字符串并获取
app.get('/api/getinfo', (req, res) => {
  console.log(req.user)
  res.send({
    status: 200,
    msg: '获取用户信息成功',
    data: req.user
  })
})

// 捕获token验证错误中间件
app.use((err, req, res, next) => {
  if (err.name === 'UnauthorizedError') {
    return res.send({
      status: 401,
      msg: '无效的token'
    })
  }
  res.send({
    status:500,
    msg:'未知的错误'
  })
})

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Node.js 中实现用户认证身份验证,可以使用以下步骤来完成: 1. 创建一个后端服务:使用 Node.js 创建一个服务器端应用程序,你可以选择使用 Express、Koa 或者其他适合你的框架来构建。 2. 设置用户数据存储:选择一个数据库系统(如 MongoDB、MySQL、PostgreSQL 等)来存储用户数据。创建一个用户模型,包含用户名、密码等字段,并将用户数据存储在数据库中。 3. 注册新用户:实现用户注册逻辑。当用户注册时,你需要验证用户名是否已存在,并对密码进行加密保存。 4. 用户登录验证:实现用户登录逻辑。当用户登录时,你需要验证用户提供的用户名和密码是否与数据库中的匹配。可以使用加密算法对密码进行比较,比如使用 bcrypt 或者 argon2 进行密码哈希和验证。 5. 生成认证令牌:在用户登录成功后,你可以使用 JSON Web Token(JWT)来生成一个认证令牌。将令牌发送给客户端,并在客户端进行存储(例如在浏览器的本地存储或者 Cookie 中)。 6. 路由保护:在需要进行身份验证的路由上添加中间件来保护这些路由。当客户端发送请求时,验证客户端请求中的令牌是否有效。你可以使用 JWT 库来解析和验证令牌的有效性,确保它没有被篡改。 7. 登出功能:提供登出功能,当用户登出时,删除客户端存储的令牌,并在服务器端使令牌失效。 需要注意的是,用户认证身份验证的实现可能会涉及到安全性问题,比如密码加密、防止跨站点请求伪造(CSRF)、限制登录尝试次数等。你应该仔细考虑这些问题,并采取适当的安全措施来保护用户数据和系统安全。 同时,建议使用成熟的身份验证库或框架,如 Passport.js、jsonwebtoken 等,来简化开发过程并提供更好的安全性保障。这些库已经提供了许多常见的身份验证和认证功能,可以帮助你更轻松地实现用户认证身份验证。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值