Android Amplify Auth注销超时



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

我使用了第二个带有视图模型的活动AuthActivity来处理登录/注销。但是,我想迁移到1活动n碎片系统。视图模型定义了Amplify-auth调用(我知道这很糟糕(,所以我生成了一个使用相同视图模型的LoginFragment。然后,我将HostedUIRedirectActivity添加到AndroidManifest,以从文档中描述的响应处理程序升级。不知道我最初为什么不这么做,但这是我问题的根源。

问题

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

我做了什么

  • 将auth代码直接移动到LoginFragment中,以便于在此处发布,得到了相同的行为
  • 注意到在AndroidManifest的Hosted UI Activity中有一行<data android:scheme="myapp" />,所以我将该值更改为应用程序的实际名称。问题仍然存在
  • 在文献中注意到Amplify版本1.17.7及以下";在通过web UI登录之后具有已知的注销问题";。这听起来可能是我的问题,所以我做了一个npm i -g @aws-amplify/cli来更新,以防万一。我的版本是5.0。问题仍然存在

我将在下面发布我的代码。如果有必要,我可以澄清任何事情或发布更多信息。非常感谢您的任何帮助或建议。谢谢

我的代码

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的活动,我不记得放在那里了。也许Amplify是自动做到的。不管怎样,我删除了活动块并再次进行了测试。登录回调现在被命中,注销很快就会成功。

AndroidManifest的东西在我的脑海中挥之不去,所以如果我做错了,我很乐意听到解释或建议。否则,当我被允许时,我会将其标记为已接受。

希望这能帮助到处于我这个位置的其他人。

最新更新