在《从零开始Node.js—12 session与token区别》中介绍了这两种认证方法的原理,今天就来盘一盘具体实现
安装中间件express-session,之后用req.session来存取用户信息
npm install express-session
服务器端代码index.js
// 1.引入express-session库
const session = require('express-session');
// 2.全局注册中间件
// 之后就可以对req.session进行读写了
app.use(session({
secret: 'asyoulike',
resave: false,
saveUninitialized: true,
}))
// 暴露静态网页,点击网页上的按钮发送请求
app.use(express.static('./pages'))
// 3.用户信息写入req.session
req.session.user = req.body;
req.session.login = true;
// 4.读取req.session
// 浏览器发来请求中有cookie,服务器会取出cookie中的sessionID,然后将其对应的值放在req.session中
const user = req.session.user;
// 5.清除该session
req.session.destory();
前端无需额外设置,浏览器会读取响应中的set-cookie,在下次请求中自动携带未过期的cookie,开发者只需要保证前端页面和请求地址同源。
需要安装两个包:
将用户信息加密生成token令牌:jsonwebtoken
将token解析成用户信息:express-jwt
npm install jsonwebtoken
npm install express-jwt
服务端代码index.js
// 1.导入 JWT 相关的两个包,分别是 jsonwebtoken 和 express-jwt
const jwt = require('jsonwebtoken');
const expressJWT = require('express-jwt');
// 2.生成token
const secretKey = 'as you like'
const token = jwt.sign({username: 'xiaomei'}, secretKey, {expiresIn: '1d'});
// 3.解析token
// 注册中间件,除了以api开头的接口都使用此中间件
app.use(expressJWT( {secret: secretKey, algorithms: ['HS526']}).unless({path: [/^\/api\//]}));
// 4.通过req.user解析出来存的信息
console.log(req.user) //{username: 'xiaomei'}
// 5. 捕获身份认证错误
app.use((err, req, res, next) => {
if(err.name === 'UnauthorizedError'){ res.send(status: 1, msg: '身份认证失败,请重新登录')}
})
浏览器首次请求时,post请求的body中要提供用户的信息
浏览器再次请求时,设置请求头中Authorization参数为'Bear '+token