【问题标题】:How to add AWS Cognito token to the Angular Http Interceptor如何将 AWS Cognito 令牌添加到 Angular Http 拦截器
【发布时间】:2020-05-07 06:16:30
【问题描述】:

我正在使用 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 不是一种选择。那么如何将令牌添加到标题中?还是应该直接从 localStorage 中获取?

【问题讨论】:

    标签: angular promise amazon-cognito angular-http-interceptors


    【解决方案1】:

    您可以在intercept 函数中返回Observablereturn next.handle(req); 正在返回 Observable&lt;HttpEvent&lt;any&gt;&gt;

    您可以使用fromgetToken() 返回Observable

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

    【讨论】:

    • 我不知道 Promise 可以转换为 Observable,但是请使用新版本的rxjs 为您的答案添加一些代码。没有fromPromise() 了,mergeMap() 必须用pipe() 包裹
    猜你喜欢
    • 2017-12-31
    • 2018-06-12
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    相关资源
    最近更新 更多