今天算是把常用后台验证方式全部实现了一遍,写个总结,当你需要后台验证不如了解其他的方式看看改如何选择。
第一种 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换来服务器的空间。
注意的地方: 私钥很重要,私钥很重要,私钥很重要!