Tengo un servicio angular que verifica si mi cliente tiene una cookie JWT válida solo para http. Como no puedo acceder a esta cookie desde el cliente, necesito llamar al método de servicio en mi Guard para enviar una llamada al servidor y ver si mi usuario está autenticado. El único problema es que no tengo idea de cómo debo obtener una instancia del servicio dentro de Guard.
El código que he escrito hasta ahora:
Mi guardia (o al menos lo que debería hacer):
export class AuthGuard implements CanActivate { canActivate( route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { let isAuthenticated : boolean = false; auth: AuthService = new AuthService() this.auth.getAuthStatus() .subscribe({ res => { if(res.status == 200){ isAuthenticated = true; } } }); return isAuthenticated; } }
mi servicio:
export class AuthService{ constructor(private http: HttpClient) { } getAuthStatus(): Observable<HttpResponse<any>>{ return this.http.post(environment.server + environment.routes.authRoutes.status, "", { withCredentials: true, observe: 'response' }) } }
Sé que de alguna manera necesito obtener una instancia del servicio http, pero no creo que sea una buena idea obtener una nueva instancia cada vez. Me gustaría crear una instancia del servicio una vez y luego usarla, o hacerla estática para que no necesite ninguna instancia. ¿Cuál sería la mejor solución a esto?
Simplemente puede inyectarlo usando el constructor
@Injectable() export class AuthGuard implements CanActivate { constructor( private authService: AuthService, ) {} canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { // use 'this.authService.whatever()' } }
Si desea una instancia única de cualquier servicio que estará disponible en todas partes en su aplicación.
También conocido como servicio Singleton .
Simplemente puede agregar esto a la clase de servicios:
@Injectable({ providedIn: 'root' }) export class MyServiceClass...
Un servicio singleton es un servicio para el que solo existe una instancia en una aplicación.