import { Observable, of, throwError as observableThrowError } from 'rxjs'
import { catchError, switchMap } from 'rxjs/operators'
-import { HTTP_INTERCEPTORS, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpErrorResponse } from '@angular/common/http'
+import { HTTP_INTERCEPTORS, HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http'
import { Injectable, Injector } from '@angular/core'
-import { AuthService } from '@app/core/auth/auth.service'
import { Router } from '@angular/router'
-import { HttpStatusCode } from '@shared/core-utils/miscs/http-error-codes'
+import { AuthService } from '@app/core/auth/auth.service'
+import { HttpStatusCode } from '@shared/models'
+import { OAuth2ErrorCode, PeerTubeProblemDocument } from '@shared/models/server'
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
return next.handle(authReq)
.pipe(
catchError((err: HttpErrorResponse) => {
- if (err.status === HttpStatusCode.UNAUTHORIZED_401 && err.error && err.error.code === 'invalid_token') {
- return this.handleTokenExpired(req, next)
- }
+ const error = err.error as PeerTubeProblemDocument
+ const isOTPMissingError = this.authService.isOTPMissingError(err)
+
+ if (!isOTPMissingError) {
+ if (err.status === HttpStatusCode.UNAUTHORIZED_401 && error && error.code === OAuth2ErrorCode.INVALID_TOKEN) {
+ return this.handleTokenExpired(req, next)
+ }
- if (err.status === HttpStatusCode.UNAUTHORIZED_401) {
- return this.handleNotAuthenticated(err)
+ if (err.status === HttpStatusCode.UNAUTHORIZED_401) {
+ return this.handleNotAuthenticated(err)
+ }
}
- return observableThrowError(err)
+ return observableThrowError(() => err)
})
)
}
return req.clone({ headers: req.headers.set('Authorization', authHeaderValue) })
}
- private handleNotAuthenticated (err: HttpErrorResponse, path = '/login'): Observable<any> {
- this.router.navigateByUrl(path)
+ private handleNotAuthenticated (err: HttpErrorResponse): Observable<any> {
+ this.router.navigate([ '/401' ], { state: { obj: err }, skipLocationChange: true })
return of(err.message)
}
}