在 Android 上使用 Google 登录服务进行身份验证

您可以将 Google 登录集成到您的应用中,让您的用户可使用自己的 Google 帐号进行 Firebase 身份验证。

开始前的准备工作

  1. 将 Firebase 添加至您的 Android 项目
  2. 将 Firebase 身份验证和 Google 登录服务的依赖项添加到您的应用级 build.gradle 文件:
    implementation 'com.google.firebase:firebase-auth:16.0.3'
    implementation 'com.google.android.gms:play-services-auth:16.0.0'
    
  3. 如果您尚未将您的应用与 Firebase 项目相关联,请在 Firebase 控制台中进行关联。
  4. 如果您尚未指定自己应用的 SHA-1 指纹,请在 Firebase 控制台的设置页面中进行指定。如需详细了解如何获取您的应用的 SHA-1 指纹,请参阅对客户端进行身份验证
  5. 在 Firebase 控制台中启用 Google 登录服务:
    1. Firebase 控制台中,打开 Authentication(身份验证)部分。
    2. 登录方法标签中,启用 Google 登录方法,然后点击保存

进行 Firebase 身份验证

  1. 按照将 Google 登录集成到您的 Android 应用页面上的步骤,将 Google 登录集成到您的应用中。 当您配置 GoogleSignInOptions 对象时,请调用 requestIdToken
            // Configure Google Sign In
            GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                    .requestIdToken(getString(R.string.default_web_client_id))
                    .requestEmail()
                    .build();
    
    您必须将服务器的客户端 ID 传递给 requestIdToken 方法。要查找 OAuth 2.0 客户端 ID,请按以下步骤操作:
    1. 打开 API 控制台中的“凭据”页面
    2. 其中网络应用类型客户端 ID 就是您的后端服务器的 OAuth 2.0 客户端 ID。
    在您集成 Google 登录之后,您的登录行为的代码与下面的代码类似:
        private void signIn() {
            Intent signInIntent = mGoogleSignInClient.getSignInIntent();
            startActivityForResult(signInIntent, RC_SIGN_IN);
        }
    
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
            // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
            if (requestCode == RC_SIGN_IN) {
                Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
                try {
                    // Google Sign In was successful, authenticate with Firebase
                    GoogleSignInAccount account = task.getResult(ApiException.class);
                    firebaseAuthWithGoogle(account);
                } catch (ApiException e) {
                    // Google Sign In failed, update UI appropriately
                    Log.w(TAG, "Google sign in failed", e);
                    // ...
                }
            }
        }
    
  2. 在您的登录 Activity 的 onCreate 方法中,获取 FirebaseAuth 对象的共享实例:
    private FirebaseAuth mAuth;
    // ...
    mAuth = FirebaseAuth.getInstance();
    
  3. 初始化您的 Activity 时,请检查用户当前是否已登录:
    @Override
    public void onStart() {
        super.onStart();
        // Check if user is signed in (non-null) and update UI accordingly.
        FirebaseUser currentUser = mAuth.getCurrentUser();
        updateUI(currentUser);
    }
    
  4. 在用户成功登录之后,从 GoogleSignInAccount 对象中获取一个 ID 令牌,用其换取 Firebase 凭据,然后使用此 Firebase 凭据进行 Firebase 身份验证:
        private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
            Log.d(TAG, "firebaseAuthWithGoogle:" + acct.getId());
    
            AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
            mAuth.signInWithCredential(credential)
                    .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {
                            if (task.isSuccessful()) {
                                // Sign in success, update UI with the signed-in user's information
                                Log.d(TAG, "signInWithCredential:success");
                                FirebaseUser user = mAuth.getCurrentUser();
                                updateUI(user);
                            } else {
                                // If sign in fails, display a message to the user.
                                Log.w(TAG, "signInWithCredential:failure", task.getException());
                                Snackbar.make(findViewById(R.id.main_layout), "Authentication Failed.", Snackbar.LENGTH_SHORT).show();
                                updateUI(null);
                            }
    
                            // ...
                        }
                    });
        }
    
    如果对 signInWithCredential 的调用成功,您可以使用 getCurrentUser 方法获取用户的帐号数据。

后续步骤

在用户首次登录后,系统会创建一个新的用户帐号,并将其与该用户登录时使用的凭据(即用户名、密码、电话号码或者身份验证提供方信息)相关联。此新帐号存储在您的 Firebase 项目中,无论用户采用何种方式登录,您项目中的每个应用都可以使用此帐号来识别用户。

  • 在您的应用中,您可以从 FirebaseUser 对象获取用户的个人资料基本信息。请参阅管理用户

  • 在您的 Firebase 实时数据库和 Cloud Storage 安全规则中,您可以从 auth 变量获取已登录用户的唯一身份用户 ID,然后用此 ID 来控制用户可以访问哪些数据。

您可以通过将身份验证提供方凭据关联至现有用户帐号,让用户可以使用多个身份验证提供方服务登录您的应用。

要让用户退出帐号,请调用 signOut

FirebaseAuth.getInstance().signOut();

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面