Fix interceptor

pull/4/head
Max Ehrlicher-Schmidt 4 years ago
parent 036a9d27f1
commit 97c7c56587

@ -13,18 +13,6 @@ import { DefaultOptions } from '@apollo/client/core/ApolloClient';
const uri = environment.apiUrl + '/graphql'; // <-- add the URL of the GraphQL server here
const authMiddleware = new ApolloLink((operation, forward) => {
//Add token here TODO: use AuthService to get the Token
operation.setContext({
headers: {
authorization: localStorage.getItem('requestToken') || null,
}
});
return forward(operation).map((data) => {
return data;
});
});
const defaultOptions: DefaultOptions = {
watchQuery: {
fetchPolicy: 'no-cache',
@ -38,7 +26,7 @@ const defaultOptions: DefaultOptions = {
export function createApollo(httpLink: HttpLink): ApolloClientOptions<any> {
return {
link: concat(authMiddleware, httpLink.create({ uri })),
link: httpLink.create({ uri }),
cache: new InMemoryCache({}),
defaultOptions: defaultOptions,
};

@ -8,7 +8,7 @@ import { catchError, filter, take, switchMap } from 'rxjs/operators';
export class TokenInterceptor implements HttpInterceptor {
private isRefreshing = false;
private refreshTokenSubject: BehaviorSubject<any> = new BehaviorSubject<any>(null);
private requestTokenSubject: BehaviorSubject<any> = new BehaviorSubject<any>(null);
constructor(public authService: AuthService) { }
@ -20,7 +20,6 @@ export class TokenInterceptor implements HttpInterceptor {
return next.handle(request).pipe(catchError(error => {
if (error instanceof HttpErrorResponse && error.status === 401) {
console.log("catching error");
return this.handle401Error(request, next);
} else {
return throwError(error);
@ -39,17 +38,17 @@ export class TokenInterceptor implements HttpInterceptor {
private handle401Error(request: HttpRequest<any>, next: HttpHandler) {
if (!this.isRefreshing) {
this.isRefreshing = true;
this.refreshTokenSubject.next(null);
this.requestTokenSubject.next(null);
return this.authService.refreshToken().pipe(
switchMap((token: any) => {
this.isRefreshing = false;
this.refreshTokenSubject.next(token.jwt);
return next.handle(this.addToken(request, token.jwt));
this.requestTokenSubject.next(token.request_token);
return next.handle(this.addToken(request, token.request_token));
}));
} else {
return this.refreshTokenSubject.pipe(
return this.requestTokenSubject.pipe(
filter(token => token != null),
take(1),
switchMap(jwt => {

@ -1,8 +1,8 @@
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { finalize, map, tap } from 'rxjs/operators';
import { catchError, finalize, map, tap } from 'rxjs/operators';
import { environment } from '../../environments/environment';
import { BehaviorSubject } from 'rxjs';
import { BehaviorSubject, of } from 'rxjs';
@Injectable({
providedIn: 'root',
@ -44,23 +44,37 @@ export class AuthService {
logout() {
// remove token from local storage to log user out
return this.http
.post<any>(`${environment.authUrl}/logout`, { request_token: this.getRequestToken() }).pipe(finalize(() => {
.post<any>(`${environment.authUrl}/logout`, {
request_token: this.getRequestToken(),
})
.pipe(
finalize(() => {
this.removeTokens();
this.checkIfUserIsLoggedIn();
}
));
})
);
}
refreshToken() {
return this.http.post<any>(`${environment.authUrl}/new-token`, {
'refresh_token': this.getRefreshToken()
}).pipe(tap((tokens: any) => {
return this.http
.post<any>(`${environment.authUrl}/new-token`, {
refresh_token: this.getRefreshToken(),
})
.pipe(
tap((tokens: any) => {
this.storeTokens(tokens);
}));
})
)
.pipe(
catchError((error: any) => {
if (error.status === 400) {
this.removeTokens();
this.checkIfUserIsLoggedIn();
location.replace('/login');
}
private storeRequestToken(jwt: string) {
localStorage.setItem(this.REQUEST_TOKEN, jwt);
return of();
})
);
}
private storeTokens(tokens: any) {
@ -72,6 +86,4 @@ export class AuthService {
localStorage.removeItem(this.REQUEST_TOKEN);
localStorage.removeItem(this.REFRESH_TOKEN);
}
}

Loading…
Cancel
Save