I'm trying to use the value I collect from the Authorization Header in an authGuard.
The Service that manages the login successfully logs the value I expect.
import { HttpClient, HttpResponse } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable, tap } from 'rxjs';
import { environment } from 'src/environments/environment';
@Injectable()
export class AuthenticateService {
private base = '/authenticate';
authorizationHeader: string | null = null;
constructor(private http: HttpClient) { }
login(loginRequest: any): Observable<any> {
return this.http.post(environment.APIEndpoint + this.base + '/login', loginRequest, { observe: 'response' })
.pipe(
tap((response: HttpResponse<any>) => {
this.authorizationHeader = response.headers.get('Authorization');
console.log('Service' + this.authorizationHeader);
})
);
}
getAuthorizationHeader(): string | null {
return this.authorizationHeader;
}
}
But trying to access authorizationHeader from the authGuard function like this:
import { CanActivateFn, Router } from '@angular/router';
import { AuthenticateService } from '../authenticate/authenticate.service';
import { inject } from '@angular/core';
export const authGuard: CanActivateFn = (route, state) => {
const authorization = inject(AuthenticateService).getAuthorizationHeader();
console.log('authGuard - ', authorization);
const router = inject(Router)
switch (authorization) {
case 'ADMIN':
return true;
case 'USER':
router.navigate(['/not-found']);
return false;
case null:
default:
router.navigate(['/authenticate']);
return false;
}
};
will result in authorization being null. As far as I know, that is because inject() creates a new instance of the class.
I tried setting authorizationHeader as signal(), like I saw on this post:
authorizationHeader = signal('');
login(loginRequest: any): Observable<any> {
return this.http.post(environment.APIEndpoint + this.base + '/login', loginRequest, { observe: 'response' })
.pipe(
tap((response: HttpResponse<any>) => {
const authorizationHeader = response.headers.get('Authorization');
if (authorizationHeader !== null) {
this.authorizationHeader.set(authorizationHeader);
console.log('Service - ')
}
})
);
}
hence retrieving the variable from authGuard like this:
const authorization = inject(AuthenticateService).authorizationHeader();
but it didn't work.
It's very likely you added
AuthenticateServicetoprovidersmore than once, which will create multiple instances.I would recommend you let Angular do the providing for you, add
providedInThis way you should have only one instance.
Don't forget to remove
AuthenticateServicefrom allproviderslist.