我有一个问题,我的所有JWT管理都没有令牌,但是重新加载时我失去了所有身份验证。
所以我正在尝试获取永久令牌。使用本地存储。但这没用。
我正在尝试检查令牌持续时间是否正确。我认为我的代码是正确的,但不知道错误在哪里。我认为它在auth服务中。但是我不知道为什么。
NodeJS登录代码
exports.login = (req, res, next) => {
Userbo.findOne({ email: req.body.email }).then(
(userbo) => {
if (!userbo) {
return res.status(401).json({
error: new Error('User not found!')
});
}
bcrypt.compare(req.body.password, userbo.password).then(
(valid) => {
if (!valid) {
return res.status(401).json({
error: new Error('Incorrect password!')
});
}
const token = jwt.sign(
{ userId: userbo._id },
'RANDOM_TOKEN_SECRET',
{ expiresIn: 7200 });
res.status(200).json({
userId: userbo._id,
token: token,
role : userbo.role,
expiresIn: 7200,
});
}
).catch(
(error) => {
res.status(500).json({
error: error
});
}
);
}
).catch(
(error) => {
res.status(500).json({
error: error
});
}
);
}
角度身份验证服务
login(email: string, password: string) {
return new Promise((resolve, reject) => {
this.http.post(
'http://localhost:3000/api/authbo/login',
{ email: email, password: password })
.subscribe(
(authData: { token: string, userId: string, role: string, expiresIn: Number }) => {
this.token = authData.token;
this.userId = authData.userId;
localStorage.setItem('id_token', authData.token);
const expiresAt = moment().add(authData.expiresIn.valueOf(), 'second');
localStorage.setItem("expires_at", JSON.stringify(expiresAt.valueOf()));
this.role = authData.role;
this.isAuth$.next(true);
console.log('LOGIN' + this.isAuth$);
resolve();
},
(error) => {
reject(error);
}
);
});
}
logout() {
this.isAuth$.next(false);
this.userId = null;
this.token = null;
this.role = null;
localStorage.removeItem("id_token");
localStorage.removeItem("expires_at");
}
public isLoggedIn() {
return moment().isBefore(this.getExpiration());
}
getExpiration() {
const expiration = localStorage.getItem("expires_at");
const expiresAt = JSON.parse(expiration);
return moment(expiresAt);
}
我不知道令牌创建得好吗?有人可以帮助我吗? :)