Пользовательский NbAuthStrategy, получающий результат от вызова asyn c - PullRequest
0 голосов
/ 26 мая 2020

Я создаю свой собственный метод аутентификации. Я расширил 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, выполняя вызов asyn c. Поскольку ответ является asyn c, я не могу вернуть Observable, поэтому я считаю, что этот механизм аутентификации работает только для памяти или синхронных вызовов.

Как я могу пройти аутентификацию, когда проверка выполняется на вызове asyn c?

1 Ответ

0 голосов
/ 07 июля 2020

Я получил его работу с помощью предоставленной здесь помощи https://github.com/akveo/nebular/issues/2388

В основном:

  1. вернуть Promise с пользователем из AWS Lambda
  2. оберните его в метод asyn c await, чтобы он возвращал другое обещание
  3. преобразование обещания в наблюдаемое
  4. конвейер / отображение Observable для возврата объекта Observable

аутентифицировать (пользователь: UserData): Observable {

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