2014-12-04 67 views
1

我正在使用開發人員驗證的技術來實現此類,如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的操作失效而無需再次通過我的身份驗證過程。

回答

2

註銷將是一個兩步驟的過程,首先你需要從認證你的用戶(亞馬遜,谷歌,Facebook或你自己的)的身份提供商註銷說明如何做到這一點特定於你的提供商。

從CognitoIdentity方面,您需要告訴CredentialsProvider清除與您的身份關聯的所有狀態和緩存。使用Android SDK,您可以在CredentialsProvider上調用clear()(請參閱http://docs.aws.amazon.com/AWSAndroidSDK/latest/javadoc/com/amazonaws/auth/CognitoCredentialsProvider.html

+0

好的,第二部分是有意義的。但是,我不確定如何執行第一部分。我需要使我最初創建的開發人員身份令牌無效以登錄用戶。任何想法如何做到這一點?我的服務器端使用的是PHP SDK – ethan123 2014-12-04 13:13:23

+0

這取決於您用來驗證用戶的提供商嗎?您是否在使用亞馬遜登錄?谷歌 ? Facebook?你自己的提供者?如果您使用的是使用亞馬遜登錄,該文檔在這裏http://login.amazon.com/android,你需要調用我自己的提供商mAuthManager.clearAuthorizationState() – 2014-12-04 13:16:42

+0

。我看到一個名爲unlinkDeveloperIdentity的方法,但我不認爲這就是我想要的。 – ethan123 2014-12-04 13:18:00