前言: 简介: {"姓名": "张三","角色": "管理员","到期时间": "2022年7月11日0点0分"} 以后,用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。 使用token: 使用基于 1.前端使用用户名跟密码请求首次登录 2.后服务端收到请求,去验证用户名与密码是否正确 3.验证成功后,服务端会根据用户 4.前端收到 返回的 5.前端每次路由跳转,判断 6.前端每次向服务端请求资源的时候需要在请求头里携带服务端签发的 7.服务端收到请求,然后去验证前端请求里面带着的 8.前端得到 使用第三方模块 jsonwebtoken 创建token字符串 基本步骤:
参数4:可选,函数形式;生成token之后的回调 生成的token前面,必须拼接 参考代码const express = require('express')const cors = require('cors')const app = express();const jwt = require('jsonwebtoken');const expressJwt = require('express-jwt');app.use(cors({ origin: true, credentials: true }))app.use(express.static('public'))app.use(express.urlencoded())// app.use(jwt().unless());// jwt() 用于解析token,并将 token 中保存的数据 赋值给 req.user// unless() 约定某个接口不需要身份认证app.use(expressJwt({secret: '这个名字需要一致', // 生成token时的 钥匙,必须统一algorithms: ['HS256'] // 必填,加密算法,无需了解}).unless({path: ['/login'] // 除了数组中的接口之外,其他都需要认证有token才能访问}));app.post('/login', (req, res) => {console.log('接收到的数据是', req.body)const { name, password } = req.bodyif (password === '123456') {// 创建token// expiresIn:过期时间,单位是秒const tokenStr = jwt.sign({ name: name }, '这个名字需要一致', { expiresIn: 10 });res.json({ msg: '登录成功', token: 'Bearer ' + tokenStr })} else {res.json({ msg: '登录失败' })}})app.get('/test', (req, res) => {res.json({ msg: '测试tokenOk' })})app.use((err, req, res, next) => {if (err.name === 'UnauthorizedError') {// res.status(401).send('invalid token...');res.status(401).send({ status: 1, message: '身份认证失败!' });}})app.listen(3000, () => {console.log(3000);}) 浏览器端:保存后端回传的token保存在localStorage $('#btn_login').click(function(){$.ajax({type:'post',url:'http://localhost:3000/login',data:{name:$('#username').val(),password:$('#password').val()},success(res){console.log(res);+ localStorage.setItem('token', res.token)}})}) 浏览器端:发请求时手动携带token必须放置在Authorization中 $('#btn_testToken').click(function(){$.ajax({type:'get',url:'http://localhost:3000/test',headers: {+ Authorization: localStorage.getItem('token'),},success(res){console.log(res);}})}) 服务器端:实现token认证选择使用 express-jwt 第三方模块进行身份认证。从模块名可以看出,该模块是专门配合express使用的。 下载安装 npm i express-jwt 中间件技术-验证token const expressJwt = require('express-jwt');// app.use(jwt().unless());// jwt() 用于解析token,并将 token 中保存的数据 赋值给 req.user// unless() 约定某个接口不需要身份认证app.use(expressJwt({secret: '创建钥匙的名字一致', // 生成token时的 钥匙,必须统一algorithms: ['HS256'] // 必填,加密算法,无需了解}).unless({path: ['/login'] // 除了个接口,其他都需要认证})); 上述代码完成后,当一个接口请求到了服务器后,它会自动验证请求头中的 Authorization 字段了,并且会自动完成: 如果没有问题: 1、将token中保存的数据赋值给req.user 2、next() 如果有问题,则抛出错误next(错误信息) 补充中间件技术-统一处理错误在所有的路由最后,加入错误处理中间件,来提示token方面的错误。 app.use((err, req, res, next) => {if (err.name === 'UnauthorizedError') {// res.status(401).send('invalid token...');res.status(401).send({ status: 1, message: '身份认证失败!' });}}); |
|