一、在 Firebase创建项目
如下图,点击位置,创建一个项目
二、创建好项目后,新增应用程序创建应用程序
1.我这里是Android,直接选中创建Android应用程序
image.png
2.填写相关数据
image.png
三、启用Google登录
image.png
image.png
三、登录流程官方文档
到这里就配置完成了,Android应用程序会生成一个google-services.json文件
1.导入sdk,查看sdk操作说明就行
image.png
2.登录代码片段
/**
* google登录
*/
private fun googleLogin(){
val googleIdOption = GetGoogleIdOption.Builder()
.setServerClientId(getString(R.string.default_web_client_id))
.setFilterByAuthorizedAccounts(true)
.build()
val request = GetCredentialRequest.Builder()
.addCredentialOption(googleIdOption)
.build()
lifecycleScope.launch {
try {
val result = credentialManager.getCredential(
context = this@LoginActivity,
request = request
)
handleSignIn(result.credential)
} catch (e: GetCredentialException) {
LogUtils.e("print", "Couldn't retrieve user's credentials: ${e.localizedMessage}")
}
}
}
default_web_client_id这个是自动生成的
private fun handleSignIn(credential: Credential) {
if (credential is CustomCredential && credential.type == TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
val googleIdTokenCredential = GoogleIdTokenCredential.createFrom(credential.data)
firebaseAuthWithGoogle(googleIdTokenCredential.idToken)
} else {
LogUtils.w("print", "Credential is not of type Google ID!")
}
}
/**
* 获取Google 登录token
*/
private fun firebaseAuthWithGoogle(idToken: String) {
val credential = GoogleAuthProvider.getCredential(idToken, null)
auth.signInWithCredential(credential)
.addOnCompleteListener(this) { task ->
if (task.isSuccessful) {
val user = auth.currentUser
updateUI(user)
} else {
updateUI(null)
}
}
}
/**
* 更新ui
*/
private fun updateUI(user: FirebaseUser?){
if (user != null){
val googleId = user.providerData.find {
it.providerId == GoogleAuthProvider.PROVIDER_ID
}?.uid
otherLogin(googleId,user.email,LoginBean.TYPE_GOOGLE)
}
}
最后一步获取到firebaseUser,也就是用户数据,到这里算是完成了授权登录,后面的逻辑就是和自己的登录流程有关了
四、遇到的问题
按照官方的代码可能会出现以下错误
Couldn't retrieve user's credentials: During begin sign in, failure response from one tap: 16: [28433] Cannot find a matching credential.
1.可能原因SHA1配置的不正确,或者包名不匹配
2.上面代码中setFilterByAuthorizedAccounts(true)错误,设置了true: 仅允许 用户在当前应用的 OAuth 授权列表中的 Google 账户登录。这里我们应该设置为false