java - 在 Android 上获取 Cognito 凭证

标签 java android amazon-web-services amazon-cognito

我需要在 Android 中使用 AWS 的 Cognito 对用户进行身份验证,并获取 token 以用于我 future 的请求。后端向我提供了一些信息,但我仍然没有设法以适当的方式使用它,而 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 并更改了 token 。请务必注意,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);
   }

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

Invalid login token. Can't pass in a Cognito token. (Service: AmazonCognitoIdentity; Status Code: 400; Error Code: NotAuthorizedException; Request ID: zzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzz)

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

credentialsProvider.getCredentials();

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

感谢任何帮助。

最佳答案

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

关于java - 在 Android 上获取 Cognito 凭证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47722295/

相关文章:

php - AWS S3 - 无法使用 getObject() 和 PHP 保存文件

java - 为什么我可以从 getClass().getResource() 获取有效的 url,但返回的 url 创建了一个不存在的文件

java - 使用 Java 的 App Engine 数据存储区中的特定条目正在破坏我的应用程序

javascript - 验证后开始方法执行

Java 未将 "\u"写入属性文件

android - 未显示应用程序登录页面 - Android Facebook

java - 在android中获取简单的日期和时间

java - 试图证明二分查找的复杂度是O(log(n))

android - android中具有当前日期的日期选择器

java - 无法使用 Lambda 中的 SQS