用户鉴权--网络安全

什么是用户鉴权?

用户鉴权,一种用于在通信网络中对试图访问来自服务提供商的服务的用户进行鉴权的方法。用于用户登陆到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存在请求头中,发送给后台。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值