ไปที่คอนโซล

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

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

开始前的准备工作

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

进行 Firebase 身份验证

  1. 按照将 Google 登录集成到您的 Android 应用页面上的步骤,将 Google 登录集成到您的应用中。配置 GoogleSignInOptions 对象时,请调用 requestIdToken

    Java
    Android

    // Configure Google Sign In
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.default_web_client_id))
            .requestEmail()
            .build();

    Kotlin
    Android

    // Configure Google Sign In
    val gso = 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 登录之后,您的登录活动的代码与下面的代码类似:

    Java
    Android

    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);
                // ...
            }
        }
    }

    Kotlin
    Android

    private fun signIn() {
        val signInIntent = googleSignInClient.signInIntent
        startActivityForResult(signInIntent, RC_SIGN_IN)
    }
    public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
    
        // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
        if (requestCode == RC_SIGN_IN) {
            val task = GoogleSignIn.getSignedInAccountFromIntent(data)
            try {
                // Google Sign In was successful, authenticate with Firebase
                val account = task.getResult(ApiException::class.java)
                firebaseAuthWithGoogle(account!!)
            } catch (e: ApiException) {
                // Google Sign In failed, update UI appropriately
                Log.w(TAG, "Google sign in failed", e)
                // ...
            }
        }
    }
  2. 在您的登录 Activity 的 onCreate 方法中,获取 FirebaseAuth 对象的共享实例:

    Java
    Android

    private FirebaseAuth mAuth;// ...
    // Initialize Firebase Auth
    mAuth = FirebaseAuth.getInstance();

    Kotlin
    Android

    private lateinit var auth: FirebaseAuth// ...
    // Initialize Firebase Auth
    auth = FirebaseAuth.getInstance()
  3. 初始化您的 Activity 时,请检查用户当前是否已登录:

    Java
    Android

    @Override
    public void onStart() {
        super.onStart();
        // Check if user is signed in (non-null) and update UI accordingly.
        FirebaseUser currentUser = mAuth.getCurrentUser();
        updateUI(currentUser);
    }

    Kotlin
    Android

    public override fun onStart() {
        super.onStart()
        // Check if user is signed in (non-null) and update UI accordingly.
        val currentUser = auth.currentUser
        updateUI(currentUser)
    }
  4. 在用户成功登录之后,从 GoogleSignInAccount 对象中获取一个 ID 令牌,用其换取 Firebase 凭据,然后使用此 Firebase 凭据进行 Firebase 身份验证:

    Java
    Android

    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);
                        }
    
                        // ...
                    }
                });
    }

    Kotlin
    Android

    private fun firebaseAuthWithGoogle(acct: GoogleSignInAccount) {
        Log.d(TAG, "firebaseAuthWithGoogle:" + acct.id!!)
    
        val credential = GoogleAuthProvider.getCredential(acct.idToken, null)
        auth.signInWithCredential(credential)
                .addOnCompleteListener(this) { task ->
                    if (task.isSuccessful) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "signInWithCredential:success")
                        val user = auth.currentUser
                        updateUI(user)
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "signInWithCredential:failure", task.exception)
                        Snackbar.make(main_layout, "Authentication Failed.", Snackbar.LENGTH_SHORT).show()
                        updateUI(null)
                    }
    
                    // ...
                }
    }
    如果对 signInWithCredential 的调用成功,您便可以使用 getCurrentUser 方法获取用户的帐号数据。

后续步骤

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

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

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

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

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

Java
Android

FirebaseAuth.getInstance().signOut();

Kotlin
Android

FirebaseAuth.getInstance().signOut()