gpt4 book ai didi

javascript - 如何使用 Angular Http 拦截器和 RxJS 刷新 JWT token ?

转载 作者:太空狗 更新时间:2023-10-29 17:58:18 24 4
gpt4 key购买 nike

我正在使用两个 JWT token - Refresh Token(7 天后过期)和 Access Token(15 分钟后过期)。它们存储在 httpOnly cookies 中,可以通过服务器访问。刷新方法签署新 token 并将其存储在 cookie 上。我需要在每次这样的请求后检查这些 token 是否过期:

@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 让它工作?我可能会发送一个刷新 token 的请求,然后发送另一个刷新第二个 token 的请求,最后发送带有更新 cookie 的原始请求。总之,我可能需要在我最初的请求之前发送请求。还有一个问题:AuthInterceptor 不应在请求一两个( token )后调用。

最佳答案

使用mergeMap顺序检查token的合法性。

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 拦截器和 RxJS 刷新 JWT token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52769426/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com