需要用到 jsonwebtoken
这个库,密钥是随便写的,建议项目上线使用 openssl 来生成密钥,有兴趣可以搜索一下。
由于是自己的个人博客,没有注册功能。所以可以在数据库直接写上自己的账号和密码,在登陆生成 token 之后,和用户信息保存在一起。
const jwt = require('jsonwebtoken')
// 密钥
const key = 'secretKey'
// 这里的 data 是用户名,使用用户名来生成唯一的 token
function generateToken(data) {
const token = jwt.sign({
data,
exp: Math.floor(Date.now() / 1000) + (3600 * 24 * 7), // 有效期一周
}, key)
return token
}
在本项目里,只有发布和删除文章需要验证 token,验证有三个步骤
- 是否是有效的 token
- 是否过期
- 是否和数据库中保存的 token 一致
function isVaildToken(db, token) {
return new Promise(resolve => {
let result
try {
result = jwt.verify(token, key)
} catch(e) {
resolve(false)
}
const { exp } = result
const current = Math.floor(Date.now() / 1000)
if (current > exp) {
resolve(false)
}
db.collection(userCollection).findOne({ token }).then(res => {
console.log(res)
if (res) {
resolve(true)
} else {
resolve(false)
}
})
})
}
如果验证正确,则继续进行下一步的操作,如果验证错误,则清除客户端保存的 token,并跳转到登陆页。