gpt4 book ai didi

android - 如何让 AWS Cognito 登录/注销与 Android 上的 AWS API Gateway 一起正常工作?

转载 作者:行者123 更新时间:2023-11-29 16:42:54 25 4
gpt4 key购买 nike

我正在编写一个简单的 Android 应用程序,目前提供以下功能:

  1. 使用电子邮件和密码注册/登录 AWS Cognito后端
  2. 注销(针对相同的 Cognito 后端)
  3. AWS API Gateway 上调用 protected Web API

我正在构建我自己的非常简单的登录/注销 UI,而不是使用 AWS Cognito UI 库:

Login and logged-in screens

登录屏幕(左);登录屏幕(右)

Web API 应在用户登录时返回 200(和正文),在用户注销时返回 403 错误。服务器设置似乎都是正确的,并且 iOS 上的等效应用程序按照描述运行。

Android上的问题如下:

  • 当我启动应用程序时,不登录并调用 API:我收到 403 错误(预期)。
  • 当我登录并再次调用 API 时:我仍然收到 403 错误(意外)。
  • 当我关闭应用程序时,从最近的应用程序列表中滑动它,然后重新打开它:我仍然登录(预期)
  • 现在,当我调用 API 时:我收到 200 响应(预期)。

如果我注销,现在会发生同样的情况:注销后我仍然收到 200 响应,直到我终止应用程序并重新启动它。

如何在不回收应用程序的情况下让 API 网关调用立即尊重我当前的身份验证状态?

我想知道 AWS API Gateway Android 库是否是罪魁祸首,所以我尝试了使用 OkHttp 的替代实现方式但我得到完全相同的结果。我的 Cognito 代码基于 AmazonCognitoYourUserPools demo .

这是导入 AWS 库的 build.gradle 部分:

// AWS Mobile Client
implementation('com.amazonaws:aws-android-sdk-mobile-client:2.6.18@aar') { transitive = true }

// Cognito UserPools for SignIn
implementation 'com.android.support:support-v4:27.1.1'
implementation('com.amazonaws:aws-android-sdk-auth-userpools:2.6.18@aar') { transitive = true }

// AWS API gateway
implementation 'com.amazonaws:aws-android-sdk-apigateway-core:2.6.18'

在此处粘贴大量代码可能无济于事,但我已经为所涉及的主要类创建了要点(删除了日志记录等以使其尽可能小且相关):

ApiCaller.java 中引用的AwsInterceptor 类来自here .

最佳答案

我和我的同事得出的解决方案如下:

登录

登录后,您需要在调用任何 API 网关端点之前重新初始化 AWSMobileClient。这是我在 LoginActivity.java 中的 AuthenticationHandler 的 fragment :

private AuthenticationHandler authenticationHandler = new AuthenticationHandler()
{
@Override
public void onSuccess(final CognitoUserSession userSession,
final CognitoDevice newDevice)
{
// Initialise the client again
AWSMobileClient.getInstance().initialize(LoginActivity.this, new AWSStartupHandler()
{
@Override
public void onComplete(final AWSStartupResult awsStartupResult)
{
switchTo(LoggedInActivity.class);
}
}).execute();
}

// ...
}

注销

注销后,我们发现需要从 IdentityManager 中清除凭据。此 fragment 来 self 的 LoggedInActivity.java:

private void logout()
{
final CognitoUser currentUser = getCurrentUser();
currentUser.signOut();

// Clear the IdentityManager credentials
final IdentityManager idm = new IdentityManager(this, new AWSConfiguration(this));
IdentityManager.setDefaultIdentityManager(idm);
idm.getUnderlyingProvider().clearCredentials();
idm.getUnderlyingProvider().clear();
idm.getUnderlyingProvider().setLogins(null);

switchTo(LoginActivity.class);
}

关于android - 如何让 AWS Cognito 登录/注销与 Android 上的 AWS API Gateway 一起正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49917929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com