我们使用 com.amazonaws:aws-android-sdk-cognitoidentityprovider:2.6.8
SDK进行基于用户名和密码的登录和注册流程 . 按照这里提到的方法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 .
-
我们已经设置了具有应用程序客户端和用户池域的用户池 .
-
将Facebook设置为社交身份提供商 .
-
添加了android回调URL到手机 .
First Approach
我们研究CognitoSyncDemo示例应用程序,它使用联合身份,因此我们不得不丢弃它 . 我们只是在userpool中使用联合 .
Second Approach
我们使用了webview并加载了以下网址 . URL将我直接带到Facebook,经过身份验证后,它会返回重定向URL,其中包含access_token,auth_type,expires in和id_token . 但没有刷新令牌 . 网址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中创建用户会话?
Third Approach
我们尝试使用Cognito Auth Demo https://github.com/awslabs/aws-sdk-android-samples/tree/master/AmazonCognitoAuthDemo . 为此,我们必须添加另一个库 com.amazonaws:aws-android-sdk-cognitoauth
. 点击登录后,它曾经带我们去托管-ui . 在查看类似的IOS项目后,我们在android库项目中进行了调整(com.amazonaws:用于android的aws-android-sdk-cognitoauth) . 我们在URI中添加了identity_provider以进行登录 . 然后我们将我们直接带到Chrome选项卡上的Facebook . 验证后,它在我们的应用程序中设置会话 . 但它有自己的身份验证对象,即AuthSession,但之前我们使用CogintoUserSession进行正常注册 . AuthSession没有用户属性,也不提供任何获取用户详细信息或身份验证处理程序 . 如果我们使用这种方法,那么如何将AuthSession与CognitoUserSession链接并管理应用程序中的用户会话?
Summary
简而言之,我们已经厌倦了AWS样本,它将我们带到了基于Web的托管UI . 我们需要仅使用联合身份提供程序通过Facebook向用户池验证用户身份 . 我们需要在Cognito SDK中维护会话,而不会影响基于用户名和密码的登录流程 . 我们希望在按钮点击时直接在我们的应用程序中打开Facebook或在webview上打开Facebook,仅使用Cognito SDK对应用程序进行身份验证并在应用程序中维护会话 .
1 回答
为了连接到用户池,我已经包含了aws-android-sdk-cognitoidentityprovider . 但是,如果您需要添加社交注册,您还需要添加cognitoauth .
确保cognito sdk版本相同,否则您可能会遇到并发错误 .
根据项目的需要,我需要身份提供者传递到sdk,以便它可以直接导航到我的社交身份提供者页面 . 但是目前的sdk版本' 2.6.24 ' didn' t为我提供了这条规定 . 我从awslab github下载了android-sdk-cognitoauth sdk并包含在我的项目中 . 我改变了Auth.java类中添加的身份提供者变量 .
下一步,我改变了AuthClient.java方法 launchCognitoAuth . 我提出了额外的条件来检查身份提供者是否存在 . 然后我在uri中签名 .
if (pool.getIdentityProvider() != null) { builder.appendQueryParameter(ClientConstants.DOMAIN_QUERY_PARAM_IDENTITY_PROVIDER, pool.getIdentityProvider().toString()); }
总而言之,我发现android和ios项目实现之间存在差异 . 在iOS项目中,aws已经提供了直接添加身份提供者的规定 . 我按照ios项目的流程进行了调整,并调整了android congitio-auth项目 . 已经报告了aws-sdk-android-sample issues的差异 .