问题描述
override fun onClick(view: View?) {
when (view?.id) {
...
R.id.google_login -> {
val signInIntent: Intent = googleSignInClient.signInIntent
startActivityForResult(signInIntent,GOOGLE_LOGIN_REQUEST_CODE)
}
}
}
override fun onActivityResult(requestCode: Int,resultCode: Int,data: Intent?) {
super.onActivityResult(requestCode,resultCode,data)
if (resultCode != Activity.RESULT_OK || requestCode != GOOGLE_LOGIN_REQUEST_CODE) return
val task: Task<GoogleSignInAccount> = GoogleSignIn.getSignedInAccountFromIntent(data)
val account = task.getResult(ApiException::class.java)
saveAccountData(account)
}
private fun saveAccountData(account: GoogleSignInAccount?) {
if (account == null) {
Toast.makeText(requireContext(),getString(R.string.login_fragment_null_account_error),Toast.LENGTH_SHORT).show()
return
}
if (account.email == null) {
Toast.makeText(requireContext(),getString(R.string.login_fragment_selected_account_has_no_email_error),Toast.LENGTH_LONG).show()
return
}
// This method saves the data in my Firestore DB
viewmodel.registerUser(account).observeOnce(requireActivity(),Observer { error ->
error?.let { message ->
Toast.makeText(requireContext(),message,Toast.LENGTH_SHORT).show()
return@Observer
}
saveAccountToPrefs(account)
navController.navigate(LoginFragmentDirections.actionLoginFragmentToTermsAndConditionsFragment(account.givenname!!))
})
}
private fun saveAccountToPrefs(account: GoogleSignInAccount) {
profileSharedPrefs.edit {
putString(USER_REGISTERED_ID,account.email)
putString(USER_disPLAY_NAME,account.displayName)
putString(USER_TOKEN,account.id)
putBoolean(DID_USER_REGISTER,true)
}
}
问题在于,我的数据库有以下不良规定-
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read,write: if true
}
}
}
,我想添加简单的身份验证,如下所示-
// Allow read/write access on all documents to any user signed in to the application
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read,write: if request.auth != null;
}
}
}
因此,当我使用ID(用户的电子邮件)尝试像此处配置自定义令牌时,总是会收到错误消息-
private fun authAndNavigate(directions : NavDirections) {
auth.signInWithCustomToken(profileSharedPrefs.getString(USER_TOKEN,"")!!)
.addOnCompleteListener { task ->
if (task.isSuccessful) {
Toast.makeText(requireContext(),auth.currentUser.toString(),Toast.LENGTH_LONG).show()
navController.navigate(directions)
} else {
Toast.makeText(requireContext(),"Authentication Failed,please restart app",Toast.LENGTH_LONG).show()
return@addOnCompleteListener
}
}
.addOnFailureListener { exception ->
exception.localizedMessage?.let { message ->
Toast.makeText(requireContext(),Toast.LENGTH_LONG).show()
}
}
}
我得到的错误是-
自定义令牌格式不正确。请检查文档。 [无效的断言格式。需要3个点分隔的段。 ]
我找不到如何以一种有效的方式来格式化我的ID(即电子邮件)的示例,该方法首先可以工作,并且不会引发错误,其次可以使用要在项目中实现的规则。
解决方法
从Google登录中获得的是OAuth凭据,您可以通过将这些凭据传递到signInWithCredential
来使用Firebase登录,如signing in with Firebase with Google auth credentials上本文档中的步骤4所示。
您的代码调用signInWithCustomToken
,该代码期望自定义JWT由您在自己的受信任环境中运行的代码生成,如minting custom tokens上的文档所示。
虽然两种类型的令牌都可以用于通过Firebase进行身份验证,但是您不能在API调用中互换它们。