什么是用户鉴权?
用户鉴权,一种用于在通信网络中对试图访问来自服务提供商的服务的用户进行鉴权的方法。用于用户登陆到DSMP或使用数据业务时,业务网关或Portal发送此消息到DSMP,对该用户使用数据业务的合法性和有效性(状态是否为激活)进行检查。
使用场景
我们平时在登录某些页面的时候,会发现当我们去访问有些页面时,如果我们没有登录的话,页面就会自动的去跳转到登录界面,让我们登录。但是由于HTTP协议是无状态的,一次请求只对应一个响应,后续的系统操作,需要重新请求服务器。也就是说服务器无法识别客户端请求属于哪个用户发送的请求。
为了保存用户登录状态,让服务器识别不同是不同用户发送的请求而返回不同响应,于是 就有了Cookie、Cookie+Session、Token等几种鉴权方式用于保存用户的登录状态。
并且使用用户鉴权,还可以保证用户身份的真实性,从而防止CSRF(跨站请求伪造)网络攻击。
Cookie鉴权
在用户第一次登录的时候,服务端会生成一个专属的cookie,并且通过接口响应头返回给客户端,然后浏览器会自动的将cookie存储在浏览器的cookie中。在只有的每次访问的时候,都会将该cookie携带上,服务端会将接受到的cookie与服务器中的cookie进行对比鉴权。所以cookie不能存储重要的数据,只能用来存储不重要的数据。
Cookie+Session鉴权
Session是依赖于Cookie的,出于安全性考虑,不能将重要信息存在Cookie中,于是服务端在接受用户第一次请求的时候,会生成一个Session存储在服务端内存当中,并生成一个sessionid返回客户端。客户端会将其存在浏览器的Cookie中。
在用户之后的接口请求的时候,会自动带上浏览器中存储的sessionId,服务端获取到接口请求头中的sessionId时会与服务器中的sessionId进行比对鉴权。session同样会有一段生命周期,每一段生命周期生成的sessionId都不相同。所以session适用于少量的重要信息存储。
Token鉴权
由于Session是存储到服务端内存当中的,所以不能同时接受大量的数据请求,容易将服务器内存撑爆,所以可以使用token解决。
服务端在接受用户第一次请求的时候,会生成一个token储在服务端硬盘当中,由数据库管理并将加密后的签名token返回客户端。由用户自己保管,在第2次到第N次请求数据的时候,将token放在请求头或是请求体中,发送到服务端进行比对鉴权。
token适用于大量重要信息存储,主要是安全
Token鉴权代码如下:
nodejs后台
// 导入密钥
const {
secretKey
} = require("../config")
//登录
exports.loginApi = (req, res) => {
console.log(req.body);
const userInf = req.body;
const sqlStr = "select * from user where username = ?"
db.query(sqlStr, userInf.username, (err, result) => {
console.log(result);
if (err) return res.cc(err)
if (result.length !== 1) return res.cc("登陆失败")
// 判断用户密码是否正确
const compareResult = bcrypt.compareSync(userInf.password, result[0].password);
if (!compareResult) return res.cc("密码错误,请重新输入!");
let rootStr = "select * from root where username = ?";
let menu = [];
db.query(rootStr, userInf.username, (err, result2) => {
if (err) res.cc("用户信息获取失败");
console.log("======");
console.log(result2);
menu = result2;
// 生成token字符串
const user = {
...result[0],
password: '',
};
const jwt = require('jsonwebtoken');
const tokenStr = jwt.sign(user, secretKey, {
expiresIn: '10h'
})
res.send({
code: 200,
message: '登陆成功',
token: 'Bearer ' + tokenStr,
data: menu
});
})
})
}
// app.js 在此处对用户发送的token进行验证,并且配置需要进行token验证的接口
// 解析token字符串
const { secretKey } = require("./config");
const { expressjwt:jwt } = require('express-jwt');
app.use(jwt({secret: secretKey,algorithms: ["HS256"]}).unless({path: [/^\/api\//]}))
前端需要在每次访问的时候将token存在请求头中,发送给后台。