我一直在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
的东西在我的脑海中挥之不去,所以如果我做错了,我很乐意听到解释或建议。否则,当我被允许时,我会将其标记为已接受。
希望这能帮助到处于我这个位置的其他人。