javascript – 如何使用Angular Http Interceptor和RxJS刷新JWT令牌?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 如何使用Angular Http Interceptor和RxJS刷新JWT令牌?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2827字,纯文字阅读大概需要5分钟。
内容图文
![javascript – 如何使用Angular Http Interceptor和RxJS刷新JWT令牌?](/upload/InfoBanner/zyjiaocheng/775/579e782aa91b4bc29d8974bb56d578b4.jpg)
我正在使用两个JWT令牌 – 刷新令牌(7天后过期)和访问令牌(15分钟后过期).它们存储在httpOnly cookie中,可以通过服务器访问.刷新方法签署新令牌并将其存储在cookie上.我需要在每次请求后检查这些令牌是否已过期:
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
constructor(private authService: AuthService, private cookieService: CookieService) { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const expirationToken = this.cookieService.get('tokenexp'); // access token expiration
const expirationTokenRefresh = this.cookieService.get('tokenrefexp'); // refresh expiration
// Refresh Token needs to be checked first
if (Number(expirationTokenRefresh) < Date.now()) {
// new refresh token is stored on cookie
this.authService.refreshTokenRefresh();
// this.authService.refreshToken().subscribe(() => { ... });
}
// next we check Access Token
if (Number(expirationToken) < Date.now()) {
// new access token is stored on cookie
this.authService.refreshToken();
// this.authService.refreshTokenRefresh().subscribe(() => { ... });
}
return next.handle(req.clone({
withCredentials: true
}));
}
}
// auth service
refreshToken() {
return this.http.get(`${BACKEND_URL}/refreshtoken`);
}
refreshTokenRefresh() {
return this.http.get(`${BACKEND_URL}/refreshtokenref`);
}
这是Express后端方法:
//routes
const express = require('express');
const router = express.Router();
router.get('/refreshtoken', user.refreshToken);
router.get('/refreshtokenref', user.refreshTokenRefresh);
// refresh access token method
const jwt = require('jsonwebtoken');
const moment = require('moment');
const User = require('../models/user');
exports.refreshToken = wrap(async(req, res, next) => {
const user = await User.findOne({ refresh_token: req.cookies['tokenref'] });
if (user) {
const newToken = await jwt.sign(
{ email: user.email, userId: user._id, role: user.role },
process.env.JWT_Key,
{ expiresIn: '15m' });
const expiresAt = moment().add(900, 'second');
res.cookie('tokenexp', JSON.stringify(expiresAt.valueOf()), { maxAge: 3000000000, secure: true});
res.cookie('token', newToken, { maxAge: 3000000000, secure: true, httpOnly: true });
res.status(200).json({success: true});
} else {
res.status(401).json({success: false, message: 'Sess?o expirou.'});
}
});
如何使用RxJS Observables使其工作?我可以发送一个请求来刷新令牌,然后发送另一个刷新第二个令牌的请求,最后发送带有更新cookie的原始请求.总之,我可能需要在原始请求之前发送请求.
还有一个问题:在请求一或两个(令牌)之后不应该调用AuthInterceptor.
解决方法:
使用mergeMap顺序检查令牌的有效性.
return of(Number(expirationTokenRefresh) < Date.now()).pipe(
mergeMap(expire => expire
? this.authService.refreshTokenRefresh()
: of(Number(expirationToken) < Date.now())
),
mergeMap(expire => expire
? this.authService.refreshToken()
: of(true)
),
mergeMap(ok => next.handle(req.clone({ withCredentials: true })))
)
内容总结
以上是互联网集市为您收集整理的javascript – 如何使用Angular Http Interceptor和RxJS刷新JWT令牌?全部内容,希望文章能够帮你解决javascript – 如何使用Angular Http Interceptor和RxJS刷新JWT令牌?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。