Ionic AWS使用离子身份验证连接放大设置currentSession和currentAuthenticatedUser

x7yiwoj4  于 2022-12-08  发布在  Ionic
关注(0)|答案(1)|浏览(182)

设定

我正在开发一个使用AWS Amplify作为后端的离子应用程序。我们希望使用以下两种身份验证类型“AMAZON_COGNITO_USER_POOLS”和“API_KEY”的服务:

  • 放大API以与API网关交互
  • 带有代码生成的GraphQL API

对于身份验证,我们正在使用带有Cognito托管UI的Ionic Auth Connect。根据文档,我们能够使用检索ID、刷新和访问令牌的功能进行登录和注册。

问题

此设置的问题是,Amplify无法识别登录用户,并且在尝试与Amplify API和GraphQL交互时,我们没有收到当前用户错误。
检查放大和授权连接文档,我发现没有明确的方法来手动设置当前用户。
我尝试使用Amplify.configure和auth拦截器手动设置令牌,但没有成功,因为Amplify在SDK中有一些验证逻辑,会阻止请求。
是否有一种方法可以设置用于放大的用户会话,而无需手动构建API和GraphQL调用?

uyto3xhc

uyto3xhc1#

假设您对身份验证类使用以下设置:From official docs

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的会话保持同步,您需要在onAuthChange内调用setAmplifyUser
若要确认会话已设置,可以尝试调用以下方法:

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

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

有关使用多个身份验证模式的其他注意事项:在AppModule构造函数内部,您可以订阅onAuthChange并根据身份验证状态切换aws_appsync_authenticationType

相关问题