在 Android 上获取 Cognito 凭证

Posted

技术标签:

【中文标题】在 Android 上获取 Cognito 凭证【英文标题】:Getting Cognito Credentials on Android 【发布时间】:2018-05-23 04:01:52 【问题描述】:

我需要在 android 中使用 AWS 的 Cognito 对用户进行身份验证,并获取一个令牌以用于我未来的请求。后端向我提供了一些信息,但我仍然没有设法以适当的方式使用它,并且 Cognito 的文档在这方面没有帮助我。我有这个固定信息:

池区域:us-east-1 矿池 ID:us-east-1:xxxxx-xxxxx-xxxxx-xxxx-xxxxxxxx

在登录端点对用户进行身份验证后,我得到以下信息:


   "cognitoId": "us-east-1:yyyy-yyyy-yyyy-yyyy-yyyyyyy",
   "cognitoToken": "hH1Q8bCLh9-pamP6DCrC0-KY4rNtZ115xDedE224CeEanex-CCWh4tWUtJjPc_tU3d6eJ_7Uk23ceTNhCFYT1qnAL_7kAH_lHod4a1GQo29FuTLQSqx4lOFv2Ev3RvYcCzjyLEAA1-EIKBtfSm_YN9y6DHBOzDJ8owLJTxB0JEWvsWfATjug4P8hxCI97RVB2cetrmq4JvZr__bCziUb-7AifPvy4VMW3xLjJ7uyDvogwcx5gJ1rF8Z38_z7kREB1R_CYPRVQuoHzag0j9RoOTNeAYFGO42qgCewTl3Lvm5PUbTIGhCIp6y1RVWAPLEdMWmQ3LVpqJcZKLQRhMmEzOGMyTUiXSwiaXNzIjoiaHR0cHM6Ly9jb2duaXRvLWlkZW50aXR5LmFtYXpvbmF3cy5jb20iLCJleHAiOjE1MTE2NDEzMDksImlhdCI6MTUxMTYyNjkwOX0.QFWGxh_"

省略了 ID,并更改了令牌以保留信息。需要注意的是,Pool ID(应用中的常量)和 cognitoId(后端返回)是不同的。

我有一个像这样初始化的静态凭据提供程序:

credentialsProvider = new CognitoCachingCredentialsProvider(
               getApplicationContext(),    /* get the context for the application */
               IDENTITY_POOL_ID,    /* Identity Pool ID */
               Regions.US_EAST_1           /* Region for your identity pool--US_EAST_1 or EU_WEST_1*/
       );

这是尝试获取 Cognito 身份验证的任务:

private static final class CognitoAuthTask extends AsyncTask<String, Void, String> 
           @Override
           protected String doInBackground(String... strings) 
               String userId = strings[0];
               String token = strings[1];
               String sessionToken = null;
               try 
                   Map<String, String> logins = new HashMap<String, String>();
                   logins.put(userId, token);
                   credentialsProvider.setLogins(logins);
                   AWSSessionCredentials credentials = credentialsProvider.getCredentials();
                   sessionToken = credentials.getSessionToken();
                catch (Exception e) 
                   if (BuildConfig.DEBUG) 
                       e.printStackTrace();
                   
                finally 
                   return sessionToken;
               
           

           @Override
           protected void onPostExecute(String authToken) 
               super.onPostExecute(authToken);
               cognitoAuthToken = authToken;
               if (BuildConfig.DEBUG) 
                   Log.d("Cognito Token", cognitoAuthToken == null ? "null" : cognitoAuthToken);
               
           
       

当我从我的登录端点获得信息时,这就是我调用它的地方(如上所示):

public void authenticateCognito(String userId, String token) 
       new CognitoAuthTask().execute(userId, token);
   

问题是这不起作用,我在这里收到此错误:

登录令牌无效。无法传入 Cognito 令牌。 (服务: 亚马逊认知身份;状态码:400;错误代码: 未授权异常;请求 ID:zzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzz)

错误发生在任务上,在这行代码上:

credentialsProvider.getCredentials();

后端团队提到我需要使用 GetCredentialsForIdentity 方法,但我在 Cognito Android SDK 上找不到类似的东西。

感谢任何帮助。

【问题讨论】:

【参考方案1】:

当调用credentialsProvider.getCredentials(); 时,内部AmazonCognitoIdentityClient 调用GetCredentialsForIdentity 从Cognito 获取新凭据。 如果提供的令牌已过期,服务将返回 Invalid login token 错误。

【讨论】:

【参考方案2】:

您应该使用的类是AmazonCognitoIdentityClient,即实现GetCredentialsForIdentity API 的类。

【讨论】:

您能详细说明一下吗?我正在尝试类似的东西,但这个类似乎已被弃用。 感谢您的回答,这似乎确实是要使用的课程。你能帮我理解如何将我已经掌握的这些信息传递给这个类并以正确的方式使用它吗?

以上是关于在 Android 上获取 Cognito 凭证的主要内容,如果未能解决你的问题,请参考以下文章

AWS cognito 快速将令牌交换为凭证

如何从 Cognito 身份池提供的身份凭证访问用户数据?

Python - 导出 AWS Cognito 用户池 - NoCredentialsError:无法找到凭证

AWS Cognito Swift 凭证提供商“不推荐使用登录:使用 AWSIdentityProviderManager”

aws cognito用户获取id令牌android

如何在android中获取cognito中的其他用户数据