Android端通过Google登录后如何正确获取用户的Firebase UID?
错误原因分析
- 你的谷歌登录配置存在核心错误:
GoogleSignInOptions初始化时,requestIdToken传入的是带双引号的"R.string.default_client_id",这会导致你传入的是固定字符串而非项目中实际配置的客户端ID,最终拿到的idToken无效,Firebase认证实际未成功,getCurrentUser()返回null,调用getUid()就会触发空指针报错。 GoogleSignIn.getLastSignedInAccount(getContext()).getId拿到的是谷歌账号自身的ID,和Firebase Auth系统生成的用户UID本来就不是同一值,自然不符合你的需求。
修复步骤
1. 修正谷歌登录配置
将GoogleSignInOptions初始化代码修改为:
signInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) // 去掉双引号,通过getString获取实际的客户端ID值 .requestIdToken(getString(R.string.default_client_id)) .requestEmail() .build();
如果你的项目中R.string.default_client_id没有对应值,直接填入Firebase控制台「项目设置-通用-您的应用-Web API密钥」下方的Web客户端ID即可。
2. 正确获取Firebase UID
Firebase用户UID只能从认证成功后的FirebaseUser对象中获取,正确的获取方式有两种:
- 在认证成功回调中直接获取:在
signInWithCredential的onComplete回调中,确认task.isSuccessful()后直接拿取,此时的用户对象一定有效:
mAuth.signInWithCredential(credential) .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { FirebaseUser user = mAuth.getCurrentUser(); // 此处直接获取即可得到正确UID String uid = user.getUid(); startActivity(new Intent(MainActivity.this,NavActivity.class)); updateUI(user); } else { updateUI(null); } } });
- 在其他页面获取:先判断
FirebaseUser是否非空再调用getUid(),如果需要监听登录状态可以使用AuthStateListener:
String uid = ""; FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser(); if(currentUser != null){ uid = currentUser.getUid(); }
注意事项
- 确保你项目根目录下的
google-services.json是最新从Firebase控制台下载的,已经正确配置了谷歌登录相关的客户端信息 - 不要在
signInWithCredential回调触发前调用getCurrentUser(),此时认证流程还未完成,拿到的用户对象大概率为空
内容的提问来源于stack exchange,提问作者Diset
相关产品推荐
相关产品推荐

