我正在使用開發人員驗證的技術來實現此類,如here所述。到目前爲止,我已經能夠實現這個類,並構建一個框架,在該框架中我檢查CognitoCachingCredentialsProvider.getCachedIdentityId()以查看用戶是否已登錄(因此不需要通過輸入電子郵件和密碼來重新進行身份驗證)。爲此,我在一個名爲Util的類中使用了一系列靜態方法,因爲它們只需要實例化一次。這就是它的樣子:CognitoCachingCredentialsProvider(Android) - 如何註銷並刪除緩存的憑據
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的操作失效而無需再次通過我的身份驗證過程。
好的,第二部分是有意義的。但是,我不確定如何執行第一部分。我需要使我最初創建的開發人員身份令牌無效以登錄用戶。任何想法如何做到這一點?我的服務器端使用的是PHP SDK – ethan123 2014-12-04 13:13:23
這取決於您用來驗證用戶的提供商嗎?您是否在使用亞馬遜登錄?谷歌 ? Facebook?你自己的提供者?如果您使用的是使用亞馬遜登錄,該文檔在這裏http://login.amazon.com/android,你需要調用我自己的提供商mAuthManager.clearAuthorizationState() – 2014-12-04 13:16:42
。我看到一個名爲unlinkDeveloperIdentity的方法,但我不認爲這就是我想要的。 – ethan123 2014-12-04 13:18:00