前后端的身份认证 - session 认证机制

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情

身份认证

  • 身份认证 (authentication)又称 “身份验证”、“鉴权”

    通过一定的手段,完成对用户身份的确认。日常生活中身份认证随处可见,如高铁的验票乘车,手机密码解锁等等,在 web 开发中,各大网站的手机验证码登录、邮箱密码登录等也属于身份验证

  • 身份认证的目的

    为了确认当前用户的真实性。在互联网项目开发中,如何对用户身份进行身份认证,是一个值得深入探讨的问题。例如,如何才能保证网站或客户端不会错误的将 用户A 的信息显示在用户 B 上

  • 不同开发模式下的身份认证

    对于服务器端渲染和前后端分离这俩种开发模式来说,分别有不同的身份认证方案

    • 服务器端渲染推荐使用 session 认证机制
    • 前后端分离推荐使用 JWT 认证机制

session 认证机制

HTTP 协议的无状态性

HTTP 协议的无状态性,指的是客户端的每次 HTTP 请求都是独立的,连续多个请求之间没有直接的关系,服务器不会主动保留每次 HTTP 请求的状态

例如:收银员能记住当前客户是否是 VIP 会员吗?

Snip20220419_43.png

突破 HTTP 无状态的限制

对于超市来说,为了方便确认用户是否是VIP,超市为每个 VIP 用户发放一张会员卡,只需要用户结算前出示 VIP 卡即可享受会员折扣

扫描二维码关注公众号,回复: 13851322 查看本文章

Snip20220419_44.png

对于客户端和服务器端来说,也可以通过类似会员卡这样的标识来标记客户端的身份。比如客户端1 登录成功了,那么服务器端会给客户端1 返回一个身份标识,这样客户端在之后的请求中要携带这个标识,服务器在收到这个标识时就可以确定这个用户登陆过。在 Web 开发中,这个标识叫做 Cookie


什么是 Cookie

  • Cookie 的概念

    Cookie 是存储在用户浏览器中的一端不超过 4kb 的字符串。它由一个名称(Name)、一个值(Value)和其他几个用于控制 Cookie 有效期、安全性、适用范围的可选属性组成

  • Cookie 的特性

    • 域名独立。不同域名下的 Cookie 各自独立
    • 自动发送。每当客户端发起请求时,会自动把当前域名下所有未过期的 Cookie 一同发送到服务器
    • 过期时限。每个 Cookie 都有有效期
    • 4kb限制。Cookie 不可以超过 4kb

Cookie 在身份认证中的作用

客户端第一次请求服务器的时候,服务器通过响应头的形式,向客户端发送一个身份认证的 Cookie,客户端会自动将 Cookie 保存在浏览器中。随后,当客户端浏览器每次请求服务器的时候,浏览器会自动将身份认证相关的 Cookie 通过请求头的形式发送给服务器,服务器即可验明客户端的身份

Snip20220419_45.png


Cookie 不具有安全性

由于 Cookie 是存储在浏览器中的,而且浏览器也提供了读写 Cookie 的 API,因此,Cookie 很容易被伪造,不具有安全性,因此不建议服务器将重要的隐私数据通过 Cookie 的形式发送给浏览器


提高身份认证的安全性

为了防止客户端伪造会员卡,收银员在拿到客户出示的会员卡之后,可以在收银机上进行刷卡认证,只有收银机确认存在的会员卡,才能被正常使用。这种 “会员卡 + 刷卡认证” 的设计理念,就是 session 认证机制的精髓

Snip20220420_48.png


session 的工作原理

Snip20220420_52.png


在 Express 中使用 session 认证

安装 express-session 中间件

在 Express 项目中,只需要安装 express-session 中间件,即可在项目中使用 session 认证

npm install express-session
复制代码

配置 express-session 中间件

express-session 中间件安装成功后,需要通过 app.user() 来注册 session 中间件

// 1、导入 session 中间件
const session = require('express-session')

// 2、配置 session 中间件
app.use(
    session({
        // secret 属性的值可以为任意字符串
        secret: 'studyNode',
        // 固定写法
        resave: false,
        // 固定写法
        saveUninitialized: true
    })
)
复制代码

向 session 中存数据

当 express-session 中间件配置成功后,即可通过 req.session 来访问和使用 session 对象,从而存储用户的关键信息

app.post('/api/login', (req, res) => {

    // 判断用户提交的登录信息是否正确
    if (req.body.username !== 'admin' || req.body.password !== '000000') {
        return res.send({ status: 1, msg: '登录失败' })
    }

    req.session.user = req.body //将用户信息存储到 session 中
    req.session.islogin = true //将用户登录状态存到 session 中
    
    res.send({ status: 0, msg: '登录成功' })

})

复制代码

向 session 中取数据

req.session 对象上获取之前存储的数据

// 获取用户姓名的接口
app.get('/api/username', (req, res) => {

    // 请从 Session 中获取用户的名称,响应给客户端
    
    //判断用户是否登录
    if(req.session.islogin){
        return res.send({
        status: 1,
        meassage: 'fail'
    })
    
    
    res.send({
        status: 0,
        msg:'success',
        username:req.session.user.username
    })
})                                                      
复制代码

清空 session

调用 req.session.destory() 函数,即可清空服务器保存的 session 信息

app.post('/api/logout', (req, res) => {

    // 清空当前用户端对应的 Session 信息
    req.session.destroy()
    req.send({
        status:0,
        msg:'退出登录成功'
    })
})
复制代码

猜你喜欢

转载自juejin.im/post/7088693568860061726
今日推荐