token的简单使用
程序员文章站
2022-07-14 09:17:05
...
身份验证:
HTTP 是一种没有状态的协议,也就是它并不知道是谁在访问。客户端用户名密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证。
token定义:
token是服务端生成的一串字符串,作为客户端进行请求的一个令牌,第一次登录后,服务器生成一个token并返回给客户端,客户端再次请求时,只需携带token即可,很大程度上减轻了服务器的压力,不用频繁的查询数据库。
思想:
1、客户端使用用户名跟密码请求登录
2、服务端收到请求,去验证用户名与密码
3、验证成功后,服务端会签发一个 Token(加了密的字符串),再把这个 Token 发送给客户端
4、客户端收到 Token 以后可以把它存储起来,可放在 Cookie 或LocalStorage 里
5、客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
6、服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
在服务端不需要存储用户的登录记录,全部发给客户端由客户端自己存,与session相比较为安全
实现过程:
1.安装引入jsonwebtoken
npm i jsonwebtoken -S
const jwt = require('jsonwebtoken');
2.生成token
let token = jwt.sign(payload, secretOrPrivateKey, [options, callback])
*[^payload]: json 还有username,userid
[^secretOrPrivateKey]: 加密规则,字符串,或者私钥path模块
[^options]: 可选配置项 expiresIn为过期时间,以秒为单位
[^callback]: 成功回调, 可选 返回制作后的token,也可同步返回*
app.post('/login',(req,res)=>{
//获取用户名
let username = req.body.username;
//兜库
mongoCt.connect('mongodb://127.0.0.1:27017',(err,client)=>{ //连接数据库
let db = client.db('newbalance');//newbalance为库名
let user = db.collection('vip');//vip为表名
user.find({username:username},{projection:{key:0}}).toArray((err,result)=>{//查询数据库中是否有该信息
if(result.length>0){
//如果查询结果不为0,则数据库有信息,生成token
let token = jwt.sign({
username: username,
user_id: result[0]._id,
}, 'nz1909', {
expiresIn: 60*10 //过期时间 , 秒结算
})
//返回
res.send({
err: 0,
msg: '登录成功',
token: token
})
}else{
res.send({
err: 1,
msg: '登录失败'
})
}
})
})
})
3.校验token
jwt.verify(token, secretOrPublicKey, [options, callback])
[^token] : 制作后的token
[^secretOrPublicKey]: 解密规则,字符串,或者公钥
[^callback:]: 回调 err 错误信息 decode 成功后的信息
app.get('/api/user', (req, res) => {
//1. 获取token
let token = req.query.token || req.body.token || req.headers.token;
//2. 校验token
// jwt.verify(token, secretOrPublicKey, [options, callback])
jwt.verify(token, 'nz1909', (err, decode) => {
if(err){//校验失败了
//返回失败数据
res.send({
err:1,
msg:'未登录,或过期'
})
}else{//校验成功
//3. 获取数据(求库)
//4. 返回成功数据
res.send({
err:0,
msg:'成功',
})
}
})
上一篇: TOKEN的简单使用(JAVA)