Estoy tratando de lograr lo siguiente en mis llamadas HTTP
Aquí está el código relevante
// this method invoke when the HTTP interceptor returns 401 status code handle401(request: HttpRequest<any>, next: HttpHandler) { if (!this.refreshTokenInProgress) { this.refreshTokenInProgress = true; this.refreshTokenSubject.next(null); return this.getToken((data: any) => { this.refreshTokenInProgress = false; this.refreshTokenSubject.next(data); request = request.clone({ headers: request.headers.set('Authorization', `Bearer ${data}`) }); return next.handle(request); }) } else { return this.refreshTokenSubject.pipe( filter(token => token != null), take(1), switchMap((accessToken) => { request = request.clone({ headers: request.headers.set('Authorization', `Bearer ${accessToken}`) }); return next.handle(request); }) ); } }Obtener el token de actualización
getToken(cb: any) { let poolData = { UserPoolId: environment.cognitoUserPoolId, // Your user pool id here ClientId: environment.cognitoAppClientId // Your client id here }; let userPool = new CognitoUserPool(poolData); let cognitoUser = userPool.getCurrentUser(); cognitoUser?.getSession((err: any, session: any) => { const refresh_token = session.getRefreshToken(); cognitoUser?.refreshSession(refresh_token, (refErr, refSession) => { const userToken = localStorage.getItem('token'); cb(userToken); }); }) } Mientras ejecuto, obtengo el nuevo token del método getToken , pero el reintento de la misma llamada HTTP no está ocurriendo.
La ejecución de la solicitud HTTP se detiene después de obtener el token de actualización del método getToken .
¿Alguien puede ayudar con este problema?
Suponiendo que desea obtener userToken de getToken() . getToken() debería devolver algo, ahora mismo no está devolviendo nada. Si algunos métodos como getSession o refreshSession son métodos asincrónicos, también se deben esperar.
async handle401(request: HttpRequest<any>, next: HttpHandler) { if (!this.refreshTokenInProgress) { this.refreshTokenInProgress = true; this.refreshTokenSubject.next(null); const token = await this.getToken(); // put "cb" param here, wait for returned token, then continiue this.refreshTokenInProgress = false; this.refreshTokenSubject.next(token); request = request.clone({ headers: request.headers.set('Authorization', `Bearer ${token}`) }); return next.handle(request); } else { return this.refreshTokenSubject.pipe( filter(token => token != null), take(1), switchMap((accessToken) => { request = request.clone({ headers: request.headers.set('Authorization', `Bearer ${accessToken}`) }); return next.handle(request); }) ); } } getToken(cb: any) { let poolData = { UserPoolId: environment.cognitoUserPoolId, // Your user pool id here ClientId: environment.cognitoAppClientId // Your client id here }; let userPool = new CognitoUserPool(poolData); let cognitoUser = userPool.getCurrentUser(); cognitoUser?.getSession((err: any, session: any) => { const refresh_token = session.getRefreshToken(); cognitoUser?.refreshSession(refresh_token, (refErr, refSession) => { const userToken = localStorage.getItem('token'); cb(userToken); return userToken; }); }) }