JWT认证node+cookie

9/27/2021 #jwt #nodejs

三个包

$ npm install express jsonwebtoken cookie-parser

简单server

const app = require("express")()
const cookieParser = require('cookie-parser')

app.use(cookieParser())
app.get("/", (req, res) => {
  res.send("Hello World")
})

app.listen(3000)

授权

const jwt = require('jsonwebtoken')

app.get("/login", (req, res) => {
    //创建token
    const token = jwt.sign({
        username: "admin"
    }, "SECRET_KEY")
    //设置token的cookie
    res.cookie("token", token, {
        httpOnly: true,
        secure: true
    })
    //登录成功消息
    res.send("登陆成功!")
}))

认证中间件,可以放在需要登录或者认证的route之前

const authentication = (req, res, next) => {
    if (req.cookies.token) {
        // 只有在认证成功以后req.user才存在,方便后面的route引用
        req.user = jwt.verify(token, "SECRET_KEY")
    }
    next()
}

把认证中间件加入,改写上面的app.get("/"......

//可以像这样放在中间,也可以像下面这样放在前面
//app.use(authentication)
app.get("/", authentication, (req, res) => {
    if (req.user){
        res.send(`Hello ${req.user.username}!`)
    } else {
        res.send("Hello World")
    }
})

最后模拟一个需要登陆以后才能进入的页面

app.get("/secret", (req, res) => {
    if (!req.user){
        return res.sendStatus(403)
    }
})

当然这里是最简单的示例,实际应用中要复杂得多