如何从前端获取令牌?
令牌应作为 REST API header 的一部分发送。发送token的方式有很多种,但最适合的是设置一个Authorization Bearer Header。
更多关于授权here
例如:
headers: req.headers.set('Authorization', 'Bearer ' + authToken)
在 NodeJS 中,如果您使用 express,您可以编写中间件来检索令牌:
const jwt = require('jsonwebtoken');
module.exports = (req, res, next) => {
try {
const token = req.headers.authorization.split(' ')[1];
jwt.verify(token, "your_token_secret");
next();
} catch (error) {
res.status(401).json({
message: 'Invalid Token'
});
}
};
如何撤销令牌?
在您的前端应用程序中将令牌存储在localStorage 中所需的时间,并在加载应用程序时检查本地存储令牌是否存在且未过期授权否则再次请求登录,这将生成一个新令牌像这样:
onAppLoad() {
saveAuthData(token_from_backend, date_from_backend);
}
saveAuthData(token: string, expirationDate: Date) {
localStorage.setItem('token', token);
localStorage.setItem('expiration', expirationDate.toISOString());
}
clearAuthData() {
localStorage.removeItem('token');
localStorage.removeItem('expiration');
}
getAuthData() {
const token = localStorage.getItem('token');
const expiration = localStorage.getItem('expiration');
if (!token || !expiration) {
return;
}
return {
token: token,
expirationDate: new Date(expiration)
};
}
如果令牌有效,您也可以自动登录用户而不要求提供登录凭据
autoAuthUser() {
const authInformation = getAuthData();
const now = new Date();
const expiresIn = authInformation.expirationDate.getTime() - now.getTime();
if (expiresIn > 0) {
token = authInformation.token;
isAuthenticated = true;
setAuthTimer(expiresIn / 1000);
}
}
设置计时器以撤销令牌,因为此时令牌应该存在于 localStorage 中,然后删除它或用刷新的令牌替换它
setAuthTimer(duration: number) {
tokenTimer = setTimeout(() => {
this.logout();
}, duration * 1000);
}