Я использую Node.js и Express для работы с JWT Auth.Прежде всего, каждый раз, когда пользователь создается и проверяется, я храню коллекцию refresh token
внутри User
:
const refreshToken = await jwt.sign({ userId: decoded.user }, process.env.JWT_Refresh_Key);
const user = await User.updateOne({ _id: mongoose.Types.ObjectId(decoded.user) }, { refresh_token: refreshToken, status: true });
Токен доступа JWT генерируется после успешного входа в систему (срок действия истекает через 15 минут):
const token = await jwt.sign(
{ email: user.email, userId: user._id, role: user.role },
process.env.JWT_Key,
{ expiresIn: '15m' });
res.status(200).json({success: true, token: token});
Затем access token
сохраняется в localStorage
для обработки Angular Http Interceptor и методами аутентификации.Через 15 минут token
будет недействительным для обработки запросов, поэтому мне нужно использовать refresh token
, хранящийся в базе данных.
Метод обновления вызывается на AuthService.ts
:
export class AuthService {
constructor(private http: HttpClient){}
refreshToken(token: string) {
this.http.post<{token: string, expiresIn: number, name: string}>(`${BACKEND_URL}/refreshtoken`, {token: token})
.subscribe((data) => {
const expiresAt = moment().add(data.expiresIn, 'second');
localStorage.setItem('token', data.token);
localStorage.setItem('expiration', JSON.stringify(expiresAt.valueOf()));
});
}
}
//route
router.post('/refreshtoken', user.refreshToken);
//controller user.js
exports.refreshToken = async(req, res, next) => {
// I need to store and call 'old_refreshtoken' where??
const user = await User.findOne({ refresh_token: old_refreshtoken });
if (user) {
const newToken = await jwt.sign(
{ email: user.email, userId: user._id, role: user.role },
process.env.JWT_Key,
{ expiresIn: '15m' });
res.status(200).json({success: true, token: newToken, expiresIn: 900, name: user.name});
} else {
res.status(401).json({success: false, message: 'Autenticação falhou.'});
}
};
Как я могу использовать refresh token
(базу данных) для генерации нового access token
?Я не уверен, как хранить refresh token
на стороне клиента (Angular) для сравнения с refresh token
, хранящимся в базе данных.