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 на основе состояния аутентификации.