嘿我正在使用 Firebase 身份验证并启用 Google登录功能。
谷歌登录运行良好,我获得了所有信息。但是,当我想将用户保存在Firebase用户列表中时,getIdToken()
为空:
private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
//here the acct.getIdToken() is null
AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
firebaseAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (!task.isSuccessful()) {
Toast.makeText(SignIn.this, "Authentication failed.", Toast.LENGTH_SHORT).show();
}
// [START_EXCLUDE]
progressDialog.hide();
// [END_EXCLUDE]
}
});
}
答案 0 :(得分:6)
您可能忘记在GoogleSignInOptions对象
上使用requestIdToken()了试一试:
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
答案 1 :(得分:4)
您的Google OAuth客户端凭据应该适用于Web应用程序,而非Android。您的Google登录选项应该类似于下面的代码(它是C#,但非常接近Java源代码):
var gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DefaultSignIn)
.RequestIdToken("OAuth Client Id goes here")
.Build();
它应该工作。
答案 2 :(得分:0)
您需要在活动中覆盖onActivityResult
方法。添加以下代码:
if (requestCode == RC_SIGN_IN) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if (result.isSuccess()) {
GoogleSignInAccount account = result.getSignInAccount();
firebaseAuthWithGoogle(account);
}
}
这就是handleSignInResult
方法的样子:
private void handleSignInResult(GoogleSignInResult result) {
if (result.isSuccess()) {
GoogleSignInAccount googleSignInAccount = result.getSignInAccount();
if (googleSignInAccount != null) {
String userId = googleSignInAccount.getId();
}
updateUI(true);
} else {
updateUI(false);
}
}
您还需要在Firebase
帐户中Authentication
- &gt;启用此功能SIGN-IN METHOD
- &gt; the provider
。您需要启用正在使用的版本,Email/Password
,Google
等等。
您还需要将compile 'com.google.firebase:firebase-auth:10.2.0'
放入build.gradle
文件中。
在AndroidManifest中,您必须设置以下2个权限:<uses-permission android:name="android.permission.INTERNET"/>' and '<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
您还需要设置SHA1。 Here你可以看看如何做到。最后,不要忘记将google-services.json再次放在正确的位置。
这就是firebaseAuthWithGoogle
方法的样子:
private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
System.out.println("firebaseAuthWithGoogle:" + acct.getId());
AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
auth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
System.out.println("signInWithCredential:onComplete:" + task.isSuccessful());
if (!task.isSuccessful()) {
System.out.println("signInWithCredential" + task.getException());
Toast.makeText(MainActivity.this, "Authentication failed.",Toast.LENGTH_SHORT).show();
}
}
});
}
非常重要的是,不要忘记在onStart
方法中添加此代码:
@Override
public void onStart() {
super.onStart();
OptionalPendingResult<GoogleSignInResult> optionalPendingResult = Auth.GoogleSignInApi.silentSignIn(googleApiClient);
if (optionalPendingResult.isDone()) {
GoogleSignInResult googleSignInResult = optionalPendingResult.get();
handleSignInResult(googleSignInResult);
} else {
optionalPendingResult.setResultCallback(new ResultCallback<GoogleSignInResult>() {
@Override
public void onResult(@NonNull GoogleSignInResult googleSignInResult) {
handleSignInResult(googleSignInResult);
}
});
}
auth.addAuthStateListener(authListener);
}
希望它有所帮助!
答案 3 :(得分:0)
现在您需要配置项目以在项目中添加google signIn的功能,这里是链接 enter link description here
答案 4 :(得分:-1)
@Alex感谢您的回答。很糟糕,我像你说的那样做了:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQ_CODE){
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
handleResult(result);
}
}
//and here the handleResult methode
private void handleResult(GoogleSignInResult result){
if (result.isSuccess()){
// Google Sign In was successful, authenticate with Firebase
GoogleSignInAccount account = result.getSignInAccount();
String name = account.getDisplayName();
String email = account.getEmail();
googleProfilName.setText(name);
googleProfilEmail.setText(email);
if (account.getPhotoUrl() != null) {
String img_url = account.getPhotoUrl().toString();
Glide.with(this).load(img_url).into(profilPic);
}
firebaseAuthWithGoogle(account);
updateUI(true);
}
else{
updateUI(false);
}
}
答案 5 :(得分:-1)
好了我的更新代码:
private void signInGoogle(){
Intent intent = Auth.GoogleSignInApi.getSignInIntent(googleSignInApi);
startActivityForResult(intent, REQ_CODE);
}
...
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if (requestCode == REQ_CODE){
GoogleSignInAccount account = result.getSignInAccount();
handleResult(result);
}
}
...
private void handleResult(GoogleSignInResult result){
if (result.isSuccess()){
// Google Sign In was successful, authenticate with Firebase
GoogleSignInAccount account = result.getSignInAccount();
String name = account.getDisplayName();
String email = account.getEmail();
googleProfilName.setText(name);
googleProfilEmail.setText(email);
if (account.getPhotoUrl() != null) {
String img_url = account.getPhotoUrl().toString();
Glide.with(this).load(img_url).into(profilPic);
}
String idTest = account.getId();
firebaseAuthWithGoogle(account);
updateUI(true);
}
else{
updateUI(false);
}
}
...
private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
firebaseAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
System.out.println("signInWithCredential:onComplete:" + task.isSuccessful());
if (!task.isSuccessful()) {
System.out.println("signInWithCredential" + task.getException());
Toast.makeText(SignIn.this, "Authentication failed.",Toast.LENGTH_SHORT).show();
}
}
});
}