首页 > 解决方案 > 自定义 NbAuthStrategy 从异步调用中获取结果

问题描述

我正在创建自己的身份验证方法。我扩展了 NbAuthStrategy 并实现了方法验证,如下所示

@Injectable()
export class MyAuthStrategy extends NbAuthStrategy {
     ...
     authenticate(user: UserData): Observable<NbAuthResult> {
          ...
          this.userService.getUser(userId, function(user: IUser) {
              console.log("called back" + user); ////// ?????
          });
          ...
     }
     ...
}

该方法应该返回一个 Observable 对象。

当我进行内存身份验证时,它工作得很好,没有问题。

当我尝试通过异步调用在 AWS Lambda 上进行身份验证时,问题就出现了。由于响应是异步的,我无法返回 Observable,因此我发现这种身份验证机制仅适用于内存或同步调用。

在异步调用上完成验证时如何进行身份验证?

标签: nebularngx-admin

解决方案


我在这里提供的帮助下得到了他的帮助https://github.com/akveo/nebular/issues/2388

基本上:

  1. 从 AWS Lambda 向用户返回一个 Promise
  2. 将其包装为异步等待方法,以便返回另一个 Promise
  3. 将 Promise 转换为 Observable
  4. 管道/映射 Observable 以返回 Observable 对象

验证(用户:UserData):可观察的< NbAuthResult > {

   const userPromise: Promise<IUser> = this.userPromiseService.getUserPromise(user.schema, user.username);
   const userObservableDeferred3: Observable<NbAuthResult> = defer(() => userPromise)
     .pipe(
        map((res) => {

           return new NbAuthResult(
              true,
              null,
              '/pages/user-account',
             'Welcome',
           );

        }),
     );

   return userObservableDeferred3;
}

async getUserPromise(schema: string, username: string): Promise< IUser > {

  // invoke lambda
  const params = {
    ...
  };
  const result = await (this.getAWSLambda().invoke(params).promise());

  // get resulting user
  const payload = result.Payload;
  const arrayss = JSON.parse(payload);
  const array = JSON.parse(arrayss);
  const item = array[0];
  return < IUser >item;
}

推荐阅读