Amazon web services CognitoCachingCredentialsProvider(Android)-如何注销和删除缓存凭据
如前所述,我正在使用开发人员身份验证技术来实现这个类。到目前为止,我已经能够实现这个类并构建一个框架,在这个框架中,我检查CognitoCachingCredentialsProvider.getCachedEntityId()以查看用户是否已登录(因此不需要通过输入电子邮件和密码来重新验证)。为此,我在一个名为Util的类中使用了一系列静态方法,因为这些方法只需要实例化一次。这就是它看起来的样子:Amazon web services CognitoCachingCredentialsProvider(Android)-如何注销和删除缓存凭据,amazon-web-services,amazon-cognito,Amazon Web Services,Amazon Cognito,如前所述,我正在使用开发人员身份验证技术来实现这个类。到目前为止,我已经能够实现这个类并构建一个框架,在这个框架中,我检查CognitoCachingCredentialsProvider.getCachedEntityId()以查看用户是否已登录(因此不需要通过输入电子邮件和密码来重新验证)。为此,我在一个名为Util的类中使用了一系列静态方法,因为这些方法只需要实例化一次。这就是它看起来的样子: package com.pranskee.boxesapp; import java.util
package com.pranskee.boxesapp;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Context;
import android.util.Log;
import com.amazonaws.auth.AWSAbstractCognitoIdentityProvider;
import com.amazonaws.auth.CognitoCachingCredentialsProvider;
import com.amazonaws.mobileconnectors.cognito.*;
import com.amazonaws.regions.Regions;
public class Util {
private final static String TAG = "Util";
private static final String AWS_ACCOUNT_ID = {acct id};
private static final String COGNITO_POOL_ID = {pool id};
private static final String COGNITO_ROLE_AUTH = {auth arn};
private static final String COGNITO_ROLE_UNAUTH = {unauth arn}
private static CognitoCachingCredentialsProvider sCredProvider;
private static UserIdentityProvider sIdProvider;
private static CognitoSyncManager sSyncManager;
private Util() {
}
public static CognitoCachingCredentialsProvider getCredProvider(
Context context) {
if (sCredProvider == null) {
if (sIdProvider == null) {
CognitoCachingCredentialsProvider tmpProvider = new CognitoCachingCredentialsProvider(
context.getApplicationContext(), AWS_ACCOUNT_ID,
COGNITO_POOL_ID, COGNITO_ROLE_UNAUTH,
COGNITO_ROLE_AUTH, Regions.US_EAST_1);
if (tmpProvider.getCachedIdentityId() != null) {
sCredProvider = tmpProvider;
} else {
sCredProvider = null;
}
} else {
sCredProvider = new CognitoCachingCredentialsProvider(
context.getApplicationContext(), sIdProvider,
COGNITO_ROLE_UNAUTH, COGNITO_ROLE_AUTH);
}
}
return sCredProvider;
}
public static UserIdentityProvider getIdentityProvider(Context context,
String email, String pwd) {
if (sIdProvider == null) {
sIdProvider = new UserIdentityProvider(AWS_ACCOUNT_ID,
COGNITO_POOL_ID, context.getApplicationContext(), email,
pwd);
Map logins = new HashMap();
logins.put({Developer Provider Name}, sIdProvider.getToken());
sIdProvider.setLogins(logins);
}
return sIdProvider;
}
public static boolean isLoggedIn(Context context) {
if (getCredProvider(context) == null) {
return false;
}
return true;
}
private static CognitoSyncManager getSyncManager(Context context) {
if (sSyncManager == null) {
sSyncManager = new CognitoSyncManager(
context.getApplicationContext(), Regions.US_EAST_1,
sCredProvider);
}
return sSyncManager;
}
protected static class UserIdentityProvider extends
AWSAbstractCognitoIdentityProvider {
private Context context;
private String email;
private String password;
public UserIdentityProvider(String accountId, String identityPoolId,
Context c, String em, String pwd) {
super(accountId, identityPoolId);
context = c;
email = em;
password = pwd;
}
@Override
public String refresh() {
try {
ServerCommunicator server = new ServerCommunicator(context);
//this is a server call, which makes the call GetOpenIdTokenForDeveloperIdentityRequest after I authenticate the user and send AWS my user's token
String response = server.initUserLoginAsyncTask()
.execute(email, password).get();
JSONObject responseJSON = new JSONObject(response);
String identityId = responseJSON.getString("id");
String token = responseJSON.getString("token");
this.setToken(token);
this.setIdentityId(identityId);
update(identityId, token);
return token;
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
@Override
public String getProviderName() {
return {Developer Provider Name};
}
}
}
现在,我还想实现注销。我想我需要做的是以某种方式删除缓存的标识Id,但我不确定最好的方法是什么。或者,也许根本不是这样,我需要做一些完全不同的事情。不管是哪种方式,我只想实现允许用户选择“注销”我的应用程序的预期行为,这会导致Cognito忘记该ID已登录到身份池,并使在不再次通过我的身份验证过程的情况下再次建立身份ID的任何尝试无效。注销将是一个两步过程,首先,您需要从认证您的用户的身份提供商(亚马逊、谷歌、Facebook或您自己的)处注销,有关如何执行此操作的说明针对您的提供商
从CognitoIdentity方面,您需要告诉CredentialsProvider清除与您的身份相关的所有状态和缓存。使用Android SDK,您可以在CredentialsProvider上调用clear()(请参阅)OK,第二部分很有意义。但是,我不知道如何执行第一部分。我需要使最初为用户登录而创建的开发人员标识无效。你知道怎么做吗?我的服务器端是否使用PHP SDKIt取决于您用于验证用户身份的提供商?您是否使用亚马逊登录?谷歌?脸谱网?你自己的供应商?如果您使用的是Amazon登录,文档就在这里,您需要调用mAuthManager.clearAuthorizationState()我自己的提供者。我看到了一个名为unlinkDeveloperIdentity的方法,但我不认为这是我想要的。抱歉-再次阅读您的评论-我知道您使用的是您自己的提供商(开发人员提供的标识)-您从您自己的后端系统注销。如何做到这一点取决于后端系统。他们没有服务器端后端调用来进行logoutOK,我很困惑。对于我的auth,我从后端向Cognito发送一个令牌,它告诉它向我的用户提供哪个IdentityId和OpenId令牌。我是否需要使OpenId令牌无效才能正确地使她的凭据无效?