【发布时间】:2021-09-03 10:47:37
【问题描述】:
我一直致力于在 Kotlin 中学习 Amplify Framework for Android。以前,在 SO 社区的帮助下,我能够通过 Cognito 托管 UI 设置身份验证。我可以登录和注销,并查询 DynamoDB 用户表,很酷。
我正在使用带有视图模型的第二个 Activity AuthActivity 来处理登录/注销。但是,我想迁移到 1 Activity n Fragments 系统。视图模型定义了 Amplify auth 调用(我知道不好),所以我创建了一个使用相同视图模型的LoginFragment。然后,我将HostedUIRedirectActivity 添加到AndroidManifest 以从Response Handler described in the docs 升级。不知道为什么我最初没有这样做,但这是我问题的根源。
问题
更新 AndroidManifest 后,使用 Cognito 托管 UI 的登录/注销流程会产生错误和其他奇怪的行为。 Amplify.Auth.signOut() 调用响应超时错误,我可以在 onError 回调中设置断点来证明这一点。 Amplify.Auth.signInWithWebUI() 似乎可以将我带到托管 UI,然后返回到 LoginFragment,但在 onSuccess 回调中没有遇到任何代码。此外,一旦用户登录并再次单击登录按钮,托管 UI 会闪烁一秒钟,但我希望它要求以同一用户或其他用户身份登录。
我做了什么
- 将身份验证代码直接移动到
LoginFragment以便在此处发布,得到相同的行为。 - 注意到在
AndroidManifest的托管 UI 活动中有一行<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() }
}
【问题讨论】:
标签: android kotlin amazon-cognito aws-amplify