【问题标题】:CognitoCachingCredentialsProvider (Android) - how to logout and remove cached credentialsCognitoCachingCredentialsProvider (Android) - 如何注销和删除缓存的凭据
【发布时间】:2015-02-02 06:47:01
【问题描述】:

here 所述,我正在使用开发人员认证技术来实现此类。到目前为止,我已经能够实现这个类并构建一个框架,在该框架中我检查 CognitoCachingCredentialsProvider.getCachedIdentityId() 以查看用户是否已登录(因此不需要通过输入电子邮件和密码重新进行身份验证)。为此,我在一个名为 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 的尝试无效无需再次通过我的身份验证过程。

【问题讨论】:

    标签: amazon-web-services amazon-cognito


    【解决方案1】:

    注销将是一个两步过程,首先您需要从对您的用户进行身份验证的身份提供商(亚马逊、谷歌、Facebook 或您自己的)注销有关如何执行此操作的说明特定于您的提供商。

    在 CognitoIdentity 方面,您需要告诉 CredentialsProvider 清除与您的身份相关的所有状态和缓存。使用 Android SDK,您可以在 CredentialsProvider 上调用 clear()(参见 http://docs.aws.amazon.com/AWSAndroidSDK/latest/javadoc/com/amazonaws/auth/CognitoCredentialsProvider.html

    【讨论】:

    • 好的,第二部分是有道理的。但是,我不确定如何执行第一部分。我需要使我最初创建的开发人员身份令牌无效以使用户登录。知道该怎么做吗?我的服务器端使用的是 PHP SDK
    • 这取决于您用来验证用户身份的提供商?您在使用登录亚马逊吗?谷歌 ? Facebook ?您自己的提供商?如果您使用 Login With Amazon,文档在此处login.amazon.com/android,您需要调用 mAuthManager.clearAuthorizationState()
    • 我自己的提供商。我看到一个名为 unlinkDeveloperIdentity 的方法,但我认为这不是我想要的。
    • 抱歉 - 第二次阅读您的评论 - 我了解您正在使用自己的提供商(开发人员提供的身份) - 您从自己的后端系统注销。你如何做到这一点取决于你的后端系统。他们没有服务器端的后端调用来进行注销
    • 好吧,我很困惑。对于我的身份验证,我从后端向 Cognito 发送了一个令牌,它告诉它要为我的用户提供哪个 IdentityId 和 OpenId 令牌。我不需要使该 OpenId 令牌无效以正确地使她的凭据无效吗?
    猜你喜欢
    • 2015-03-17
    • 2023-03-11
    • 2017-10-15
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多