nodejs身份认证机制jwt

jwt和session二者区别

  • session是把身份信息存在服务端的,jwt是存在客户端的
  • session有跨域问题,jwt没有跨域问题

jwt即是jsonwebtoken缩写,jwt有三部分组成Header(头部),payload(有效荷载)、signature(签名)。用“ . ”分割,示例

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiIwMDAwIiwiaWF0IjoxNjY4MTM5NjA0LCJleHAiOjE2NjgxMzk2MzR9.AHk0j0xB8s4BVvaepCxoLhbGPKPcv20pzk5sv9vYE9I

安装(两个包一个是jsonwebtoken加密,一个是express-jwt解密)

npm i jsonwebtoken express-jwt

导入模块

// 导入express模块
const express = require('express')
const jwt = require('jsonwebtoken')
const expressJwt = require("express-jwt")
//解决跨域
const cors = require('cors')
const app = express()

解决跨域问题,及其请求体数据

//调用cors中间件
app.use(cors())
// 使用中间件转换数据
app.use(express.json())
app.use(express.urlencoded({ extended: false }))

使用
全局定义个秘钥

    // 定义秘钥
const secretkey = 'wcg'
//使用解密全局中间件
app.use(
		//unless默认不校验正则的路径
    expressJwt.expressjwt({ secret: secretkey, algorithms: ["HS256"] }).unless({
        path: [/^\/admin\//],
    })
);

路由实现

app.post('/admin/login', (request, response) => {

    if (request.body.username != 'admin' || request.body.password != '0000') {
        return response.send({
            status: 1,
            msg: "登陆失败"
        })
    }

    const userInfo = { username: request.body.username, password: request.body.password }
        //用户信息
        //加密的秘钥
        //配置对象,可以配置token有效期
    const tokenstr = jwt.sign(userInfo, secretkey, { expiresIn: '30s' })
    response.send({
        status: 200,
        msg: "登陆成功",
        token: tokenstr
    })
})
app.get('/api/user', (request, response) => {
    response.send({
        status: 0,
        msg: '登陆成功',
        username: request.auth.username
    })
})

配置错误中间件解析jwt错误

//错误中间件解析错误
app.use((erro, res, req, next) => {
    if (erro.name = 'UnauthorizedError') {
        return req.send({
            status: 401,
            msg: 'token失效'
        })
    }
    return req.send({
        status: 500,
        msg: '未知的错误'
    })
})
app.listen(8899, () => {
    console.log('启动成功')
})

操作模式默认是把服务端生成的token,储存到本地localStorage和sessionStorage中,其次每次客户端请求都要带上这个jwt字符,同时要在字符串前面加上Bearer ,默认写法是储存到头部Authorization这个字段中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值