如何将 AWS Cognito 令牌添加到 Angular Http 拦截器

How to add AWS Cognito token to the Angular Http Interceptor

我正在使用 AWS CognitoAngular 8 为我的应用程序构建登录页面。一切正常,直到我尝试创建 getToken() 函数,事实证明 getSession() 方法接受 callback 而不是返回 string.

这意味着我必须将它包装在 Promise 中,如下所示:

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 不是一个选项。那么如何将令牌添加到 header?或者我应该直接从 localStorage 获取它?

您可以在 intercept 函数中 return 一个 Observablereturn next.handle(req); 是 return 一个 Observable<HttpEvent<any>>

您可以 return 来自 getToken()Observablefrom:

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());
          }
        });
      });
    );
  }
}

然后在 interceptmergeMap 中使用它:

import { mergeMap } from 'rxjs/operators';

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

    return next.handle(request);
  })
)