JWT身份认证机制实现

(1)首先来了解一下session身份认证机制的局限性

 (2)什么是JWT

JWT的全称是JSON Web Token,是目前最流行的跨域认证解决方案

(3)JWT的工作原理(重要!!!)

 (4)JWT的组成部分

 (5)JWT各个组成部分的含义

 (6)JWT的使用方式

扫描二维码关注公众号,回复: 15119654 查看本文章

 (7)Express中JWT的使用

 

 

 下面这个unless是用来指定哪些接口不需要访问权限,比如下面这个就是以/api开头的就不需要访问权限,可以直接进入。

 

 app.js代码:

// 导入express模块
const express = require('express');
// 创建wen服务器
const app = express();
// 导入JWT相关的两个包
// 用户生成jwt的包
const jsonwebtoken = require('jsonwebtoken');
// 用于将客户端发送过来的jwt字符串解析成json对象的包
const expressJWT = require('express-jwt')
// 导入允许跨域资源共享的包
const cors = require('cors');
// 将跨域资源共享的包注册为全局中间件
app.use(cors());
// 解析 POST 提交过来的表单数据
app.use(express.urlencoded({ extended: false }))
// 1.定义secret密钥
const secretkey = 'sy no1---';
// 注册将jwt字符串还原成json对象的中间件 unless后面的部分代表以/api开头的都不需要访问权限
// 只要配置成功了express-jwt这个中间件,就可以把解析出来的用户信息挂载到req.user属性上
app.use(expressJWT({ secret: secretkey, algorithms: ['HS256'], }).unless({ path: [/^\/api\//] }))
    // 登录接口
app.post('/api/login', (req, res) => {
        // 将请求体的数据转换存在userinfo中
        const userinfo = req.body;
        if (userinfo.username !== 'sy' || userinfo.password !== '123456') {
            return res.send({ status: 400, msg: '登录失败' });
        }
        // 生成jwt字符串:jwt.sign()方法接收三个参数,分别是用户信息对象、加密密钥、配置对象(配置当前token的有效期)
        // 记住:千万不要把密码加密到token字符串中
        const tokenstr = jsonwebtoken.sign({ username: userinfo.username }, secretkey, { expiresIn: '30s' })
            // 登录成功的时候调用jwt.sign()方法生成jwt字符串,并通过token属性发送给客户端
        res.send({ status: 200, msg: '登录成功!', token: tokenstr });
    })
// 这是一个有权限的api接口
app.get('/admin/getinfo', (req, res) => {
        res.send({
            status: 200,
            message: '获取用户信息成功!',
            data: req.user //要发送给客户端的信息
        })
    })
    // TODO_06:使用全局错误处理中间件,捕获解析 JWT 失败后产生的错误
app.use((err, req, res, next) => {
    // 这次错误是由 token 解析失败导致的
    if (err.name === 'UnauthorizedError') {
        return res.send({
            status: 401,
            message: '无效的token',
        })
    }
    res.send({
        status: 500,
        message: '未知的错误',
    })
})
app.listen(80, () => {
    console.log('hahaha');
})

开启服务器

首先发起post请求

 

就会得到一个返回的token

 

复制这个token再发起一个get请求,在header中添加authorization属性和值,值就是token,但是要注意前面必须加上Bearer 得到结果如图:其中iat和exp不用关心它,是用来控制token有效期的。

猜你喜欢

转载自blog.csdn.net/qq_43781887/article/details/127322119