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 会闪烁一秒钟,但我希望它会要求以同一用户或其他用户身份登录。
我做了什么
- 将授权代码直接移至
LoginFragment
以方便 post 此处,得到相同的行为。
- 注意到
AndroidManifest
中的托管 UI Activity 有一行 <data android:scheme="myapp" />
所以我将该值更改为应用程序的实际名称。问题依旧。
- 在文档中注意到 Amplify 版本 1.17.7 及更低版本“在通过网络登录后存在已知的注销问题 UI”。这听起来可能是我的问题,所以我做了
npm i -g @aws-amplify/cli
更新以防万一。我的版本是 5.0.问题仍然存在。
我会 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
的事情让我费了好大劲,所以如果我做错了,我很乐意听到解释或建议。否则我将在允许时将其标记为已接受。
希望这可能对处于我位置的其他人有所帮助。
我一直致力于在 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 会闪烁一秒钟,但我希望它会要求以同一用户或其他用户身份登录。
我做了什么
- 将授权代码直接移至
LoginFragment
以方便 post 此处,得到相同的行为。 - 注意到
AndroidManifest
中的托管 UI Activity 有一行<data android:scheme="myapp" />
所以我将该值更改为应用程序的实际名称。问题依旧。 - 在文档中注意到 Amplify 版本 1.17.7 及更低版本“在通过网络登录后存在已知的注销问题 UI”。这听起来可能是我的问题,所以我做了
npm i -g @aws-amplify/cli
更新以防万一。我的版本是 5.0.问题仍然存在。
我会 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
的事情让我费了好大劲,所以如果我做错了,我很乐意听到解释或建议。否则我将在允许时将其标记为已接受。
希望这可能对处于我位置的其他人有所帮助。