Meu ambiente e recursos do meu aplicativo/projeto: Angular 19 e .Net Backend, obtenção de dados de vídeos do YouTube e recurso de login e registro com http_interceptors.
Meu problema ou meu problema: minha API de consulta para o YouTube não está funcionando se eu estiver usando http_interceptors em main.ts. É assim que eu testo: eu comento os http_interceptors, então minha API de consulta está funcionando como deveria.
meu http_interceptor em main.ts:
{
provide: HTTP_INTERCEPTORS,
useClass: JwtInterceptor,
multi: true
},
meu erro ao obter HTTP e assinatura do Youtube:
{
"headers": {
"normalizedNames": {
},
"lazyUpdate": null
},
"status": 401,
"statusText": "OK",
"url": "https://www.googleapis.com/youtube/v3/playlistItems?key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&part=snippet&maxResults=12&playlistId=PLPvjlyTckx7OhGYE9JZw9Q1MYP_n-u-8V",
"ok": false,
"name": "HttpErrorResponse",
"message": "Http failure response for https://www.googleapis.com/youtube/v3/playlistItems?key=xxxxxxxxxxxxxxxxxxxxxxxx&part=snippet&maxResults=12&playlistId=PLPvjlyTckx7OhGYE9JZw9Q1MYP_n-u-8V: 401 OK",
"error": {
"error": {
"code": 401,
"message": "Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
"errors": [
{
"message": "Invalid Credentials",
"domain": "global",
"reason": "authError",
"location": "Authorization",
"locationType": "header"
}
],
"status": "UNAUTHENTICATED"
}
}
}
meu código JwtInterceptor no componente:
export class JwtInterceptor implements HttpInterceptor {
private accountService = inject(AccountService);
intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {
this.accountService.user$.pipe(take(1)).subscribe({
next: user => {
if (user) {
// Clone from the coming request and add Authorization header to that
request = request.clone({
setHeaders: {
Authorization: `Bearer ${user.jwt}`
}
});
}
}
})
return next.handle(request);
}
}
Minha pergunta é: como faço para desabilitar o interceptador quando tento acessar ou obter dados do YouTube?
Obrigado.
Você pode aproveitar
HttpBackend
, que é chamado após a lógica do interceptor durante uma chamada de API normal. Assim, as chamadas de API feitas usando-o não são interceptadas pelo interceptor.Referência Stackblitz
Você pode modificar seu interceptador para retornar mais cedo se a solicitação não for direcionada a um domínio que precisa do seu JWT.
Aqui, usei uma regex simples para verificar um único domínio, mas qualquer teste para confirmar se você sabe ou não se a URL de destino requer o JWT funcionaria:
Observação: você pode ter problemas de tempo com seu interceptador porque está retornando após a assinatura, não após a
user$
emissão observável.Você pode retornar um observável composto que atrasará a execução
next.handle()
até queuser$
tenha emitido:Obrigado pela sua resposta. Este é meu código da sua entrada.
A segunda parte me faz consertar mais. Portanto, vou levar um tempo para entender primeiro (não sei switchmap dentro do pipe e return Observable<HttpEvent.
Obrigado.