微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何格式化自定义令牌以进行Firestore身份验证?

如何解决如何格式化自定义令牌以进行Firestore身份验证?

我使用以下方法登录Google-

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调用中互换它们。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。