7

我们已将com.amazonaws:aws-android-sdk-cognitoidentityprovider:2.6.8SDK 用于基于用户名和密码的登录和注册流程。按照这里提到的方法https://docs.aws.amazon.com/cognito/latest/developerguide/tutorial-integrating-user-pools-android.html。注册和登录过程按要求工作。

对于通过联合身份验证的 Facebook 和 Google,我们不想为此目的使用托管 UI,并且不使用联合身份。我们已经关注了这个链接https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-identity-federation.html

  1. 我们已经使用应用程序客户端和用户池域设置了用户池。
  2. 将 Facebook 设置为社交身份提供者。
  3. 向移动设备添加了 android 回调 URL。

第一种方法

我们查看 CognitoSyncDemo 示例应用程序,它使用联合身份,因此我们不得不丢弃它。我们只是在用户池中使用联邦。

第二种方法

我们使用了 webview 并加载了以下 URL。该 URL 将我直接带到 Facebook,经过身份验证后,它返回给我以使用 access_token、auth_type、expires in 和 id_token 重定向 URL。但没有刷新令牌。网址https://yourdomain.auth.us-east-1.amazoncognito.com/oauth2/authorize?redirect_uri=redirect_app_path&response_type=code&client_id="client_id"&identity_provider=Facebook

但是使用这种方法存在问题。我找不到将访问令牌推送到管理用户会话的 SDK 中的 cognitoUserSession 的方法。因此,每次我注册 Facebook(使用 webview)时,SDK 中都没有会话维护。因此,我再次被重定向到登录视图。如何确保 Facebook 用户通过 cognitoidentityprovider 的身份验证和登录?获取access_token和id_token时如何在SDK中创建用户会话?

第三种方法

我们尝试使用 Cognito Auth 演示https://github.com/awslabs/aws-sdk-android-samples/tree/master/AmazonCognitoAuthDemo。为此,我们必须添加另一个库com.amazonaws:aws-android-sdk-cognitoauth. 单击登录后,它曾经将我们带到hosted-ui。在研究了类似的 IOS 项目后,我们对 android 库项目(com.amazonaws:aws-android-sdk-cognitoauth for android)进行了调整。我们在 URI 中添加了 identity_provider 以进行登录。然后它将我们直接带到 Chrome 选项卡上的 Facebook。身份验证后,它在我们的应用程序中设置会话。但它有自己的身份验证对象,即 AuthSession,但之前我们使用 CogintoUserSession 进行正常注册。AuthSession 没有用户属性,也不提供任何获取用户详细信息或身份验证处理程序。如果我们使用这种方法,那么如何将 AuthSession 与 CognitoUserSession 链接并在应用程序中管理用户会话?

概括

简而言之,我们已经厌倦了 AWS 示例,它正在将我们带到基于 Web 的托管 UI。我们需要仅使用联合身份提供者通过 Facebook 向用户池验证用户身份。我们需要在 Cognito SDK 中维护会话,而不影响我们基于用户名和密码的登录流程。我们希望在单击按钮时直接打开 Facebook 或在应用程序中的 webview 上打开 Facebook,验证用户并仅使用 Cognito SDK 在应用程序中维护会话。

4

1 回答 1

0

To connect to user pool i had included aws-android-sdk-cognitoidentityprovider. But if you need to add social sign up, you need to add cognitoauth as well.

  1. Ensure cognito sdk version are same otherwise you might run into complication error.

  2. As per the need of project, i need identity provider to pass into sdk so it could directly navigate directly to my social identity provider page. But current sdk version '2.6.24' didn't provided me with this provision. I had downloaded the android-sdk-cognitoauth sdk from awslab github and included in my project. I alter Auth.java class added identity provider variable in it.

  3. Next step, i alter AuthClient.java method launchCognitoAuth. I place additional condition to check if identity provider present or not. Then i set it in sign in uri.

    if (pool.getIdentityProvider() != null) { builder.appendQueryParameter(ClientConstants.DOMAIN_QUERY_PARAM_IDENTITY_PROVIDER, pool.getIdentityProvider().toString()); }

  4. After making above alteration, i can configure identity provider through my app in auth.builder(). The hack worked, i directly navigated to my provider page. After authentication, sdk set session it self.

To sum up, I found difference between android and ios project implementation. In iOS project, aws has given provision to add identity provider directly. I followed the flow of ios project and made tweak to android congitio-auth project. The difference has been reported as well to aws-sdk-android-sample issues.

于 2018-07-10T05:36:00.907 回答