首先,您需要了解 JWT 的原理以及它们如何在服务器和客户端之间传递,以及如何在服务器端匹配秘密 - 这里是 doc
有效负载可以是任意用户数据 - 即:只是一个 usrname 或 id
基本上,您需要一个服务,该服务在成功验证时生成令牌(当用户使用正确的凭据登录时,即:usr & pwd)并创建一个带有令牌的附加标头,以用于对服务器的进一步请求。
// INFO: Function to create headers, add token, to be used in HTTP requests
createAuthenticationHeaders() {
this.loadToken(); // INFO: Get token so it can be attached to headers
// INFO: Headers configuration options
this.options = new RequestOptions({
headers: new Headers({
'Content-Type': 'application/json', // INFO: Format set to JSON
'authorization': this.authToken // INFO: Attach token
})
});
}
// INFO: Function to get token from client local storage
loadToken() {
this.authToken = localStorage.getItem('token');; // Get token and asssign to
variable to be used elsewhere
}
以及一些存储用户状态的功能,即:
// INFO: Function to store user's data in client local storage
storeUserData(token, user) {
localStorage.setItem('token', token); // INFO: Set token in local storage
localStorage.setItem('user', JSON.stringify(user)); // INFO: Set user in local
storage as string
this.authToken = token; // INFO: Assign token to be used elsewhere
this.user = user; // INFO: Set user to be used elsewhere
}
还有一个注销功能来销毁本地存储中的令牌,即:
// INFO: Function for logging out
logout() {
this.authToken = null; // INFO: Set token to null
this.user = null; // INFO: Set user to null
localStorage.clear(); // INFO: Clear local storage
}
如果你使用npm的jsonwebtoken,你可以在生成token的时候设置它的ttl:
const token = jwt.sign({ id: idDB }, "secret", { expiresIn: '24h' });
或任何你想要的 ttl,字符串“secret”指的是与服务器匹配的秘密。
顺便说一句:如果我理解正确,您的第 3 点和第 4 点相互矛盾..
- 用户令牌在 15 分钟后访问令牌过期。
- 如果用户空闲 2 小时,我会从 cookie 或 DB 中删除刷新令牌,否则我会使用刷新令牌更新访问令牌。
如果你正确实现了数字 3 的逻辑,它无论如何都会在 15 分钟内被销毁