Как добавить AWS токен Cognito в Angular Http Interceptor - PullRequest
0 голосов
/ 21 января 2020

Я создаю страницу входа для своего приложения с помощью AWS Cognito и Angular 8 . Все работает нормально, пока я не попытаюсь создать функцию getToken(), и получается, что метод getSession() принимает обратный вызов вместо возврата строки .

, которая значит я должен обернуть его внутри Обещания , например, так:

export function getToken() {
  var currentUser = userPool.getCurrentUser();
  if (!currentUser) {
    // redirect to login page
  } else {
    return new Promise((resolve, reject) => {
      currentUser.getSession((err, session) => {
        if (err) {
          reject(err);
        } else if (!session.isValid()) {
          resolve(null);
        } else {
          resolve(session.getIdToken().getJwtToken());
        }
      });
    });
  }
}

А вот мой перехватчик :

@Injectable()
export class AuthenInterceptor implements HttpInterceptor {

    intercept(req: HttpRequest<any>, next: HttpHandler) : Observable<HttpEvent<any>> {

        // Add token to the header.......

        return next.handle(req);
    }
}

Насколько Могу сказать, что возврат Promise здесь не вариант. Так как я могу добавить токен в шапку? Или я должен получить его непосредственно из localStorage?

1 Ответ

1 голос
/ 21 января 2020

Вы можете вернуть Observable в функции intercept. return next.handle(req); возвращает Observable<HttpEvent<any>>.

Вы можете вернуть Observable из getToken() с помощью from:

import { from } from 'rxjs';

export function getToken() {
  var currentUser = userPool.getCurrentUser();
  if (!currentUser) {
    // redirect to login page
  } else {
    return from(
      new Promise((resolve, reject) => {
        currentUser.getSession((err, session) => {
          if (err) {
            reject(err);
          } else if (!session.isValid()) {
            resolve(null);
          } else {
          resolve(session.getIdToken().getJwtToken());
          }
        });
      });
    );
  }
}

И затем использовать его в intercept с mergeMap:

import { mergeMap } from 'rxjs/operators';

return getToken().pipe(
  mergeMap((token) =>
  {
    request = request.clone(
    {
        setHeaders : { ... }
    });

    return next.handle(request);
  })
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...