Android 放大身份验证注销超时

Android Amplify Auth Signout Timing Out

我一直致力于在 Kotlin 中学习 Android 的 Amplify Framework。以前,在 SO 社区的帮助下,我能够通过 Cognito Hosted UI 设置身份验证。我可以登录和注销,并查询 DynamoDB 用户 table,很酷。

我正在使用第二个 Activity AuthActivity 和一个视图模型来处理 login/logout。但是,我想迁移到 1 Activity n Fragments 系统。 viewmodel 定义了 Amplify auth 调用(我知道这很糟糕),所以我创建了一个 LoginFragment 来使用相同的 viewmodel。然后,我将 HostedUIRedirectActivity 添加到 AndroidManifest 以从 Response Handler described in the docs 升级。不知道为什么我最初没有这样做,但这是我问题的根源。

问题

更新 AndroidManifest 后,使用 Cognito Hosted UI 的符号 in/out 流产生错误和其他奇怪的行为。 Amplify.Auth.signOut() 调用响应超时错误,我可以在 onError 回调中设置断点来证明这一点。 Amplify.Auth.signInWithWebUI() 似乎可以将我带到 Hosted UI,然后返回 LoginFragment,但不会触发 onSuccess 回调中的任何代码。此外,一旦用户登录并再次单击“登录”按钮,托管 UI 会闪烁一秒钟,但我希望它会要求以同一用户或其他用户身份登录。

我做了什么

我会 post 我的代码如下。如有必要,我可以澄清任何事情或 post。非常感谢任何帮助或建议。谢谢!

我的代码

class LoginFragment : Fragment() {
    private val viewmodel: AuthViewModel by viewModels()

    private lateinit var binding: FragmentLoginBinding

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?,
    ): View {
        // Inflate the layout for this fragment
        binding = FragmentLoginBinding.inflate(inflater)
        binding.authViewModel = viewmodel
        val view = binding.root
        binding.btnSignIn.setOnClickListener { btnLoginOnClick(view) }
        binding.btnSignout.setOnClickListener { btnLogoutOnClick(view) }
        return view
    }

    fun signInWithWebUI(a: Activity) {
        Amplify.Auth.signInWithWebUI(a,
            { Log.i(tag, "loginSuccess") },
            { Log.e(tag, "loginError", it) } )
    }

    fun btnLoginOnClick(view: View) { signInWithWebUI(activity as MainActivity) }

    fun signOut() {
        Amplify.Auth.signOut(
            { Log.i(tag, "logoutSuccess") },
            { Log.e(tag, "logoutError", it) } )
    }

    fun btnLogoutOnClick(view: View) { signOut() }
}

好的,我想我的问题已经解决了。

AndroidManifest 有一个名为 CustomTabsRedirectActivity 的 Activity,我不记得放在那里了。也许 Amplify 会自动做到这一点。无论如何,我删除了 Activity 块并再次测试。现在触发登录回调,瞬间退出成功

AndroidManifest 的事情让我费了好大劲,所以如果我做错了,我很乐意听到解释或建议。否则我将在允许时将其标记为已接受。

希望这可能对处于我位置的其他人有所帮助。