为什么需要身份验证
HTTP 是一种没有状态的协议,也就是它并不知道是谁访问。客户端用户名密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再次验证
session验证方式
在服务端不需要存储用户的登录记录,全部发给客户端由客户端自己存(cookie,local)
1、客户端使用用户名跟密码请求登录
2、服务端收到请求,去验证用户名与密码
3、验证成功后,服务端会签发一个 Token(加了密的字符串),再把这个 Token 发送给客户端
4、客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
5、客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
6、服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
token优点
1.服务端无需保存信息,节省资源
2.安全,可以避免CSRF(跨站请求伪造)攻击
3.适用于CDN,因为服务端无需存状态,所以多台服务器时也可响应。
Nodejs身份验证使用方法。
session验证方式可以使用cookie-session中间件。
const cookieSession=require("cookie-session")
app.use(cookieSession({
name:'保存到服务器的session的名字',
keys:[必传参数,代表加密层级],
maxAge:1000 //保留cookie的时间
}))
app.post((req,res)=>{
req.session.key=value
})
验证时
req.session.key 返回true
删除session
delete req.session.key
req.session.key = undefined
let express=require('express'); let cookieSession=require('cookie-session'); let jwt=require('jsonwebtoken'); let app=express(); app.listen(7755,console.log("启动服务")) //session验证 app.use(cookieSession({ name:"anin", keys:['a','b','c','d'], maxAge:1000*60 //单位毫秒,一分钟过期 })) app.get('/session',(req,res,next)=>{ req.session['ke']="0001"; res.send({ err:0, data:"写入成功" }) }) app.get('/secheck',(req,res,next)=>{ if(req.session['ke']){ res.send({ err:0, data:"验证成功" }) }else{ res.send({ err:1, data:"验证失败" }) } }) //删除session //delete req.session.key //req.session.key = undefined //token验证 app.get('/jwt',(req,res,next)=>{ // jwt.sign(payload, secretOrPrivateKey, [options],[callback]) let token = jwt.sign( {username:'anin', _id:'233'}, 'xyyg', { expiresIn: 20 //秒 } ) res.send({ err: 0, msg:'成功', data:'数据', tk:token }) }) app.get('/jwtcheck',(req,res,next)=>{ let token=req.query.tk || req.headers.tk||req.body.tk; //jwt.verify(token, secretOrPublicKey, [options], [callback]) jwt.verify(token, 'xyyg', (err,decode)=>{ console.log('err',err) console.log('decode',decode)//解码后数据 if(!err){ res.send({ err:0, msg:'成功', data:'数据' }) }else{ res.send({ err:1, msg:'验证失败', }) } }) })