在 Android 上获取 Cognito 凭据
Getting Cognito Credentials on Android
我需要在 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);
}
问题是这不起作用,我在这里收到此错误:
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 上找不到类似的方法。
感谢任何帮助。
您应该使用的 class 是 AmazonCognitoIdentityClient,即实现 GetCredentialsForIdentity
API.
的 class
调用 credentialsProvider.getCredentials();
时,内部 AmazonCognitoIdentityClient
调用 GetCredentialsForIdentity 从 Cognito 获取新的凭据。
如果提供的令牌已过期,服务将返回 Invalid login token
错误。
我需要在 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);
}
问题是这不起作用,我在这里收到此错误:
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 上找不到类似的方法。
感谢任何帮助。
您应该使用的 class 是 AmazonCognitoIdentityClient,即实现 GetCredentialsForIdentity
API.
调用 credentialsProvider.getCredentials();
时,内部 AmazonCognitoIdentityClient
调用 GetCredentialsForIdentity 从 Cognito 获取新的凭据。
如果提供的令牌已过期,服务将返回 Invalid login token
错误。