后端身份验证的几种方式

今天算是把常用后台验证方式全部实现了一遍,写个总结,当你需要后台验证不如了解其他的方式看看改如何选择。

 

第一种 cookie/session

基于服务端的cookie认证方式,这种认证方式比较普遍,服务器收到用户请求,验证用户正身(通常用在登录接口)后,在服务端生成session,并且把cookie通过header头返回给浏览器(客户端),session和cookie对应的关系是这样的

const user = {
     cookie: session
}

当客服端携带 cookie 也就是上面对象的key(cookie)服务器收到cookie的时候查找对应的 value 也就是 上面对象的 session 并读取session里的内容,进行判断用户是哪一位。

优点: 不需要每次请求的时候加入多余的参数,使用比较方便

缺点:关机会丢失(通过redis可以解决),不能够“跨域”请求数据

注意的地方:  必须设置 httpOny ,避免xss读取cookie

 

本来想redis分开写,上面提到了redis,这里说一点,使用redis可以让你的session长时间存储,不会因为关机而失去状态,上面说到不能“跨域请求数据”,比如在 a.com 生成的session 在 b.com 是无法读取的,使用redis可以解决这个问题,如果说cookie有什么污垢的话,如果有千万计的session时候,可能会出现管理上的不方便,其实完全不用担心,在单应用上使用cookie是成本最低的开发决策。

 

 

第二种 token

定义,token就是一段用来代表用户信息的字符串,当用户登录成功后

 

   // 就是一段文本
   token: 'xxxxxxxxxxxxx', // 返回给客户端
   key: 'xxxx' // 用来生成 token的私钥

 

这里的key是私钥 ,token就是返回给客户端的公钥,当服务器接收到 token的时候,使用私钥(key)进行解密,拿到正确的数据。

这里可能有几个疑问

1.token 怎么加密?

这里推荐使用 sha 256

2. token 存在哪里?

服务端只进行解密,加密,不存在任何介质上面

3. token 如何设置过期处理?

看下面的代码

 

// node.js  sha 256

const jwt = require('jsonwebtoken'); // 引用加密模块

app.get('/api/sign',(req,res) => { // 生成加密信息
    // user 用户信息  iat 一分钟之后失效 sfadjfnasdfnsjkdnkjansdifasiodfnncoashdfo // 这是你的私钥
    const token = jwt.sign({ user: '123', iat: Math.floor(Date.now() / 1000) + 30},'sfadjfnasdfnsjkdnkjansdifasiodfnncoashdfo');
    res.send(token)  // 返回给客户端 
})


app.get('/api/verify',(req,res) => {  // 验证 token
    let token = req.query.token
    if (token == '') {
        res.send('token呢?')
    }
    jwt.verify(token, 'sfadjfnasdfnsjkdnkjansdifasiodfnncoashdfo',function (err, decoded) {
        if (err) {
            throw err
        } else {
            if (decoded.iat < Math.floor(Date.now() / 1000)){
                res.send('密匙已经过期了')
            } else {
                res.send('通过校验' + decoded)
            }
        }
    });
})

 

 

优点: 可以任意“跨站”共享数据,加密不可逆

缺点:请求时每次需要带上token比较繁琐,token管理不善丢失后无法挽救除非更换私钥,用服务器的cpu换来服务器的空间。

注意的地方:  私钥很重要,私钥很重要,私钥很重要!

 

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注