如何在 Android 上使用 Cognito/UserPool 登录后实施注销

How to implement signOut once signed in with Cognito/UserPool on Android

正在寻求有关实现 signOut() 函数以允许用户退出应用程序的帮助。

我已经实现了在这里找到的代码: https://docs.aws.amazon.com/aws-mobile/latest/developerguide/add-aws-mobile-user-sign-in.html

我能够让 AWS 登录屏幕正常工作,我也可以看到在 Cognito 中创建的新用户,但是当我尝试实现一个注销按钮让我回到之前的意图时,它不断反弹。我四处阅读,发现用户将始终保持登录状态。

下面是我的验证器代码Activity:

import com.amazonaws.mobile.auth.ui.SignInUI;
import com.amazonaws.mobile.client.AWSMobileClient;
import com.amazonaws.mobile.client.AWSStartupHandler;
import com.amazonaws.mobile.client.AWSStartupResult;


public class AuthenticatorActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_authenticator);

        // Add a call to initialize AWSMobileClient
        AWSMobileClient.getInstance().initialize(this, new AWSStartupHandler() {
            @Override
            public void onComplete(AWSStartupResult awsStartupResult) {
                SignInUI signin = (SignInUI) AWSMobileClient.getInstance().getClient(AuthenticatorActivity.this, SignInUI.class);
                signin.login(AuthenticatorActivity.this, MainActivity.class).execute();
            }
        }).execute();
    }
}

用户输入详细信息进行注册然后登录后,显示的下一个 activity/intent 还会显示下面的退出按钮。

下面的代码是我按下退出按钮时的代码(在另一个 Activity 中):

/** called when the user taps the send button */
    public void signOutOfApp(View view) {
        Intent intent = new Intent(this, AuthenticatorActivity.class);
        startActivity(intent);
    }

有人可以帮我建议如何让它工作吗? AuthenticatorActivity 似乎没有任何东西可以表明它在哪里 passing/storing 新用户的详细信息,当我到达下一个 activity/intent 时,我不确定我该如何 call/get 将用户详细信息传递给注销方法。 请在这里帮助指导我!提前致谢!

注销方法可通过 IdentityManager class 使用。以下将让您调用 signOut。由于注销是异步的,您可能需要向 IdentityManager 注册一个回调,以便在用户成功注销时获得回调。

注册回调以获得 sign-in 状态变化的通知:

IdentityManager.getDefaultIdentityManager().addSignInStateChangeListener(new SignInStateChangeListener() {
                @Override
                public void onUserSignedIn() {
                    Log.d(LOG_TAG, "User Signed In");
                }

                @Override
                public void onUserSignedOut() {
                    Log.d(LOG_TAG, "User Signed Out");
                }
});

调用注销:

IdentityManager.getDefaultIdentityManager().signOut();

AWSMobileClient 如何与 IdentityManager 互动?

AWSMobileClient 创建 IdentityManager 对象并将该对象设置为默认对象 IdentityManager。由于 IdentityManager 是单例,因此您可以在应用程序的任何位置使用 IdentityManager.getDefaultIdentityManager()

至于 Kotlin,因为我可以使用 AWS 登录,我应该在我的 nextActivity 和注销中的什么地方添加它 IdentityManager.getDefaultIdentityManager().signOut();

IdentityManager.getDefaultIdentityManager().addSignInStateChangeListener(
    object : SignInStateChangeListener() {
        override fun onUserSignedIn() {
            Log.d(TAG, "User signed in");
        }

        override fun onUserSignedOut() {
            Log.d(TAG, "User signed out");
        }
    }
)