身份验证
为什么需要身份验证
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:'验证失败',
})
}
})
})

浙公网安备 33010602011771号