跳转到内容
返回

关于JWT认证

开头

工作流程

小插曲

加密的代码实现

...
const express = require('express')
const router = express.Router()
const bcrypt = require('bcrypt')

// 保存注册信息
let users=[]

// 生成salt的等级
const saltRounds = 10
// 注册
router.post('/register', (req, res, next) => {
    /**
        body={
            name:'shuaxin',
            psw:'shuaxin'
        }
    */
    // 接受前端数据
    let obj = req.body
    // 生成salt
    const salt = bcrypt.genSaltSync(saltRounds)
    // 利用salt对密码进行hash生成加密字符串
    const hash = bcrypt.hashSync(obj.psw, salt)
    // 然后保存该条数据等操作
    users.push({
        name:obj.name,
        psw:hash
    })
    // 返回提示
    res.json({
        msg: 'register succ'
    })
})
// 登陆
router.post('/login', (req, res, next) => {
    let obj = req.body
    // 查找对应的账号 然后校对密码是否一致
    for (let index in users) {
        if (users[index].name === obj.name) {
            // 校对结果为Boolean
            // 参数列表(用户输入的面,存储的加密后的密码)
            let result = bcrypt.compareSync(obj.psw, users[index].psw)
            if (result) {
                res.json({
                    code: 1,
                    msg: '登陆成功',
                    token
                })
            } else {
                res.json({
                    code: -1,
                    msg: '检查账号密码是否匹配'
                })
            }
            break
        }
    }
})
...

生成token代码实现

...
// 引入模块
const jwt = require('jsonwebtoken')
// 设置私钥
const sk = 'shuaxin'
...
// 登陆
router.post('/login', (req, res, next) => {
    let obj = req.body
    for (let index in users) {
        if (users[index].name === obj.name) {
            let result = bcrypt.compareSync(obj.psw, users[index].psw)
            // 生成token  参数:(要加密的内容,秘钥,时间(s为单位))
            let token = jwt.sign(users[index], sk, { expiresIn: 10 });
            if (result) {
                res.json({
                    code: 1,
                    msg: '登陆成功',
                    token
                })
            } else {
                res.json({
                    code: -1,
                    msg: '检查账号密码是否匹配'
                })
            }
            break
        }
    }
})
...
...
// 引入模块
const jwt = require('jsonwebtoken')
// 设置私钥
const sk = 'shuaxin'
...
router.post('/testToken', (req, res, next) => {
    let obj = req.body
    // 过期后会抛异常
    try {
        // 校验token 结果为Boolean
        // 参数列表(token,私钥)
        var decoded = jwt.verify(obj.token, sk);
        if (decoded) {
            res.json({
                code: 1,
                msg: '有效的token'
            })
        } else {
            res.json({
                code: -1,
                msg: 'token无效'
            })
        }
    } catch (error) {
        res.json({
            code: -1,
            msg: 'token过期'
        })
    }
})

其他笔记

关于JWT的优缺点

优缺点都是对比出来的,和常用的session进行对比,由于实践有限,session没用过,总结是搜索引擎搜索后,罗列的自己能理解的

JWT优点

JWT缺点

参考文章 JWT优缺点 JWT详解



上一篇
关于对象
下一篇
关于预请求