Токен на предъявителя Auth0 в службе angular

#angular

#angular

Вопрос:

У меня есть служба angular, которая запускает другой запрос rest к серверной системе. Я хочу добавить аутентификацию на основе auth0 к заголовку http, который определяется константой перед определением класса.

Обслуживание

 const ZUORA_URL = 'https://jangoepelapitest.azure-api.net/gocsso';
const headers = new HttpHeaders({
  'Access-Control-Allow-Origin': '*',
  'Authorization': 'Bearer ***TOKEN***',
  'Content-Type': 'application/json'
});

@Injectable({
  providedIn: 'root'
})
export class ZuoraService {
  constructor(private http: HttpClient) {}

  // INVOICES
  getInvoice(id: String): Observable<any> {
    return this.http.get(ZUORA_URL   '/v1/invoices/'   id   '/files', {
      headers
    });
  }

  reverseInvoice(id: String): Observable<any> {
    console.log('Invoice reversed');
    return this.http.put(ZUORA_URL   '/v1/invoices/'   id   '/reverse', {
      'applyEffectiveDate': '2017-02-20',
      'memoDate': '2017-02-20'
    }, {
      headers
    });
  }
...
}
  

Генерация токена auth0 отлично работает для тестирования, я добавил следующий код в центральный компонент приложения:

КОМПОНЕНТ ПРИЛОЖЕНИЯ

   constructor(public auth: AuthService) {
    auth.handleAuthentication();
  }
  ngOnInit() {
    console.log('AppComponent: OnInit()');
    if (localStorage.getItem('isLoggedIn') === 'true') {
      this.auth.renewTokens();
    }
  }
  

Когда я добавил сгенерированный токен в заголовок (скопируйте / вставьте), авторизация работает нормально. Как добавить сгенерированный токен в структуру заголовка в сервисе?

приветствую Malte

Ответ №1:

Создайте службу для HTTP-перехватчика:

 @Injectable()
export class TokenInterceptor implements HttpInterceptor {

  constructor(public auth: AuthService) {}

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const headers = new HttpHeaders({
    'Access-Control-Allow-Origin': '*',
    'Authorization': 'Bearer ***TOKEN***',
    'Content-Type': 'application/json'
    });

    request = request.clone({
      setHeaders: {
        headers
      }
    });

    return next.handle(request);
  }
}
  

Получите токен из вашей службы OAuth и установите его в указанном выше классе, headers authorization.

И добавьте перехватчик к вашему провайдеру в app.module.ts :

 @NgModule({
  bootstrap: [AppComponent],
  imports: [...],
  providers: [
    {
      provide: HTTP_INTERCEPTORS,
      useClass: TokenInterceptor,
      multi: true
    }
  ]
})
export class AppModule {}
  

Это отправляет токен с каждым HTTP-запросом.

Ответ №2:

Вы могли бы использовать HttpInterceptor, он перехватит запрос перед его отправкой, и вы можете установить заголовок для вашего токена-носителя: https://angular.io/api/common/http/HttpInterceptor

И вы можете получить свой токен из службы или непосредственно из файлов cookie или локального хранилища.