我正在使用适用于Android的最新版本的AWS开发工具包。
implementation 'com.amazonaws:aws-android-sdk-core:2.7.6'
implementation 'com.amazonaws:aws-android-sdk-cognito:2.7.6'
implementation 'com.amazonaws:aws-android-sdk-cognitoidentityprovider:2.7.6'
我的身份验证处理程序大部分来自于示例代码。
// create a handler for the sign-in process
private AuthenticationHandler authenticationHandler = new AuthenticationHandler() {
@Override
public void onSuccess(CognitoUserSession userSession, CognitoDevice newDevice) {
// String idToken = userSession.getIdToken().getJWTToken();
// Map<String, String> logins = new HashMap<>();
// logins.put("cognito-idp.us-east-1.amazonaws.com/" + getString(R.string.user_pool_id), idToken);
// AuthHelper.getInstance().getCredentialsProvider().setLogins(logins);
//
// new RefreshCognitoCredentials().execute();
startActivity(new Intent(LoginActivity.this, MainActivity.class));
finish();
}
@Override
public void getAuthenticationDetails(AuthenticationContinuation authenticationContinuation, String userId) {
String password = inputPassword.getText().toString();
AuthenticationDetails authenticationDetails = new AuthenticationDetails(userId, password, null);
authenticationContinuation.setAuthenticationDetails(authenticationDetails);
authenticationContinuation.continueTask();
}
@Override
public void getMFACode(MultiFactorAuthenticationContinuation continuation) {
}
@Override
public void authenticationChallenge(ChallengeContinuation continuation) {
}
@Override
public void onFailure(Exception exception) {
String error = AuthHelper.formatException(exception);
layoutUsername.setErrorEnabled(true);
layoutUsername.setError(error);
}
};
身份验证可以正常工作。并按需缓存。 在我的启动画面活动中,我可以检查CognitoUser.getCurrentUser()。getUserId()。
现在要注销:
CognitoUser.getCurrentUser().signOut()
现在,如果我关闭应用程序并打开应用程序-CognitoUser.getCurrentUser()。getUserId()仍会返回我以前登录的用户。
几个月前,我以2.2。+作为sdk版本完成了AWS实施,并且此示例按预期工作。
注意*如果我尝试使用CognitoUser.getCurrentUser()。globalSignout()-它会返回“用户未通过身份验证”错误。
如果我有有效的用户/会话,如何检查应用程序启动?我讨厌AWS如何每天都在没有文档或找不到文档的情况下更改事物。
答案 0 :(得分:1)
signOut
从SharedPreferences中清除缓存的令牌。它清除存储在访问,ID和刷新令牌下的数据。但是,LastAuthUser密钥包含用户ID,该用户ID不会由signOut清除。
调用cognitoUserPool.getCurrentUser().getUserId()
时,它将检查SharedPreferences中是否存在LastAuthUser键,因此它会返回userId。我正在调查这个问题。当我可以确认预期的行为时,将更新此答案。
答案 1 :(得分:1)
我在更新用户电子邮件时遇到了这种情况。就我而言,当用户切换回以前使用的电子邮件时,cognito不会更新最后一个经过身份验证的用户的值。
我的解决方案是手动更新共享首选项中的值,其中cognito将更新最后一个经过身份验证的用户:
SharedPreferences.Editor editor = context.getSharedPreferences("CognitoIdentityProviderCache", 0).edit();
String csiLastUserKey = "CognitoIdentityProvider." + cognitoUserPool.getClientId() + ".LastAuthUser";
editor.putString(csiLastUserKey, newEmail);
editor.commit();
这是一个骇人的解决方法,因为我强制执行cognito应该自动执行的操作。
答案 2 :(得分:0)
我几乎有同样的问题。 我的步骤:
1. Sign in as user 1
2. Sing out
3. Sign in as user 2
4. Surprise that user 1 is signed in instead of user 2
因此,决定升级到新的SDK
com.amazonaws:aws-android-sdk-mobile-client:2.13.4
使用
implementation 'com.amazonaws:aws-android-sdk-core:2.13.4'
implementation 'com.amazonaws:aws-android-sdk-cognito:2.13.4'
implementation 'com.amazonaws:aws-android-sdk-cognitoidentityprovider:2.13.4'
但这没有帮助。
与文件CognitoIdentityProviderCache.xml有关的问题位于/data/data/applicationId/shared_prefs/CognitoIdentityProviderCache.xml
注销后未清除CognitoIdentityProviderCache.xml文件。
注销后的文件内容示例:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="CognitoIdentityProvider.app_id.LastAuthUser.encrypted">...</string>
<string name="CognitoIdentityProvider.app_id.LastAuthUser.encrypted.iv">...</string>
<string name="CognitoIdentityProvider.app_id.LastAuthUser.encrypted.keyvaluestoreversion">1</string>
</map>
从文件中删除这3行可解决此问题。
解决方法:
但是文件名可以在下一版本中更改。
与在系统设置->应用-> AwesomeApp中按“清除数据”相同
context.cacheDir.parentFile.deleteRecursively()
您可以在其错误跟踪器上关注我的错误报告