AWS усиливает набор currentSession и currentAuthenticatedUser с помощью Ionic Auth Connect

Настраивать

Я разрабатываю ионное приложение, которое использует AWS Amplify в качестве бэкэнда. Мы хотим использовать следующие сервисы, используя оба типа аутентификации «AMAZON_COGNITO_USER_POOLS» и «API_KEY»:

  • Amplify API для взаимодействия с API Gateway
  • GraphQL API с codegen

Для аутентификации мы используем Ionic Auth Connect с пользовательским интерфейсом Cognito. Следуя документам, мы смогли настроить вход и регистрацию с возможностью получения токена Id, Refresh и Access.

Проблема

Проблема с этой настройкой заключается в том, что amplify не может распознавать вошедших в систему пользователей, и мы не получаем текущую пользовательскую ошибку при попытке взаимодействовать с Amplify API и GraphQL.

Проверив документы amplify и auth connect, я не нашел четкого способа установить текущего пользователя вручную.

Я попытался установить токены вручную с помощью Amplify.configure и с помощью перехватчика аутентификации, но это не сработало, потому что Amplify имеет некоторую логику проверки в SDK, которая блокирует запрос.

Есть ли способ установить пользовательский сеанс для усиления без необходимости вручную создавать вызовы API и GraphQL?

1 ответ

Предполагая, что вы используете следующую настройку для своего класса авторизации: Из официальных документов

      import { Injectable, NgZone } from '@angular/core';
import { IonicAuth } from '@ionic-enterprise/auth';
import { Platform } from '@ionic/angular';
import { BehaviorSubject, Observable } from 'rxjs';
import { nativeIonicAuthOptions, webIonicAuthOptions } from '../../environments/environment';

@Injectable({
  providedIn: 'root'
})
export class AuthenticationService extends IonicAuth {
  private authenticationChange: BehaviorSubject<boolean> = new BehaviorSubject(false);
  public authenticationChange$: Observable<boolean>;

  constructor(platform: Platform, private ngZone: NgZone) {
    super(platform.is('hybrid') ? nativeIonicAuthOptions : webIonicAuthOptions);
    this.authenticationChange$ = this.authenticationChange.asObservable();
    this.isAuthenticated().then((authenticated) => { this.onAuthChange(authenticated); });
  }

  public async onLoginSuccess(): Promise<void> {
    this.onAuthChange(true);
  }

  public async onLogout(): Promise<void> {
    this.onAuthChange(false);
  }

  private async onAuthChange(isAuthenticated: boolean): Promise<void> {
    this.ngZone.run(() => {
      this.authenticationChange.next(isAuthenticated);
    });
  }
}

Вы можете использоватьamazon-cognito-identity-jsи установить вручнуюCognitoUserSessionкак показано ниже:

Установите amazon-cognito-identity-js

Создайте новый метод, который будет обрабатывать настройку сеанса пользователя:

        private async setAmplifyUser(): Promise<void> {
    const idToken = await this.getIdToken();
    const accessToken = await this.getAccessToken();
    const authResponse = await this.getAuthResponse();
    const refreshToken = await this.getRefreshToken();

    const userPool = new CognitoUserPool({
      UserPoolId: `YOUR_USER_POOL_ID `,
      ClientId: `YOUR_APP_CLIENT_ID `,
    });

    const cognitoIdToken = new CognitoIdToken({
      IdToken: authResponse.id_token,
    });

    const cognitoAccessToken = new CognitoAccessToken({
      AccessToken: accessToken,
    });

    const cognitoRefreshToken = new CognitoRefreshToken({
      RefreshToken: refreshToken,
    });

    const username = idToken['cognito:username']; 

    const user = new CognitoUser({
      Username: username,
      Pool: userPool,
    });

    user.setSignInUserSession(
      new CognitoUserSession({
        AccessToken: cognitoAccessToken,
        IdToken: cognitoIdToken,
        RefreshToken: cognitoRefreshToken,
      })
    );
  }

Чтобы сеанс Cognito синхронизировался с сеансом auth connect, вам нужно позвонитьsetAmplifyUserвнутри

Чтобы подтвердить, что ваш сеанс установлен, вы можете попробовать вызвать эти методы:

      Auth.currentAuthenticatedUser().then((res) => {
  console.log('currentAuthenticatedUser', res);
});

Auth.currentSession().then((res) => {
  console.log('currentSession', res);
});

Дополнительное примечание об использовании нескольких режимов аутентификации: внутри конструктора AppModule вы можете подписаться наonAuthChangeи переключите aws_appsync_authenticationType на основе состояния аутентификации.

Другие вопросы по тегам