2014-12-04 68 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