Google Sign-In: nó là gì, đăng nhập Google và SDK OAuth 2.0

Tác giả: IT Sectr Đã đăng: 2026-04-29 Thời gian đọc: 10 phút

Google Sign-In là SDK của Google thực hiện xác thực người dùng thông qua tài khoản Google trong các ứng dụng di động và web. Công nghệ này dựa trên giao thức OAuth 2.0, cho phép nhận token truy cập vào Google API mà không cần chuyển mật khẩu cho ứng dụng bên thứ ba. Hơn 3 tỷ thiết bị Android hỗ trợ Google Sign-In, khiến nó trở thành phương thức đăng nhập phổ biến nhất trong ứng dụng di động. Theo Google Identity Platform, 2025, tích hợp SDK giảm 60% thời gian đăng ký và tăng tỷ lệ chuyển đổi người dùng.

Điểm chính

  • Google Sign-In — SDK xác thực qua tài khoản Google dựa trên OAuth 2.0
  • OAuth 2.0 — giao thức ủy quyền nơi ứng dụng nhận token truy cập mà không cần mật khẩu người dùng
  • Credential Manager — API Android hiện đại để đăng nhập Google không cần WebView
  • ID Token — JSON Web Token (JWT) chứa dữ liệu nhận dạng người dùng
  • Đa nền tảng — Google Sign-In hoạt động trên Android, iOS, web và desktop

Google Sign-In là gì?

Google Sign-In là dịch vụ đăng nhập một lần (Single Sign-On) do Google cung cấp để xác thực người dùng trong các ứng dụng bên thứ ba. SDK cho phép nhà phát triển tích hợp đăng nhập qua tài khoản Google mà không cần tạo hệ thống đăng ký riêng. Công nghệ này dựa trên giao thức OAuth 2.0 và OpenID Connect, cung cấp thông tin nhận dạng người dùng: tên, email, hình đại diện và mã định danh duy nhất.

Không giống như xác thực truyền thống qua email và mật khẩu, Google Sign-In loại bỏ nhu cầu ghi nhớ mật khẩu và trải qua quy trình đăng ký. Người dùng chọn tài khoản Google trên thiết bị, xác nhận quyền và ứng dụng nhận được token truy cập. Theo Google Identity Platform (2025), các ứng dụng có Google Sign-In cho thấy số lượng đăng ký thành công cao hơn 52% so với biểu mẫu email/mật khẩu.

Google Sign-In hỗ trợ ba kịch bản sử dụng: xác thực người dùng (lấy ID Token), ủy quyền truy cập API Google (lấy Access Token) và xác thực liền mạch (Silent Sign-In) cho người dùng đã được ủy quyền. Mỗi kịch bản yêu cầu một bộ phạm vi (scopes) khác nhau và trả về các loại token khác nhau.

Cách OAuth 2.0 hoạt động trong Google Sign-In

OAuth 2.0 là giao thức ủy quyền cho phép ứng dụng có quyền truy cập hạn chế vào tài nguyên người dùng mà không tiết lộ thông tin xác thực của họ. Trong bối cảnh Google Sign-In, giao thức hoạt động như sau: ứng dụng yêu cầu ủy quyền từ người dùng thông qua Google, nhận mã ủy quyền tạm thời, trao đổi nó lấy token truy cập và sử dụng các token đó để gọi API Google.

Sự khác biệt chính của OAuth 2.0 so với các giao thức trước đó là sự phân tách vai trò giữa chủ sở hữu tài nguyên (người dùng), máy khách (ứng dụng), máy chủ ủy quyền (Google) và máy chủ tài nguyên (API Google). Ứng dụng không bao giờ nhận được mật khẩu của người dùng — chỉ nhận token có thể bị thu hồi. Google Identity Platform sử dụng đặc tả OpenID Connect trên OAuth 2.0, thêm ID Token được chuẩn hóa ở định dạng JWT.

ID Token và Access Token: sự khác biệt

kotlin
// Ví dụ lấy ID Token qua Credential Manager
val googleIdOption = GoogleIdCredentialOption.Builder()
    .setServerClientId(serverClientId)
    .build()

val credentialManager = CredentialManager.create(this)
val request = GetCredentialRequest.Builder()
    .addCredentialOption(googleIdOption)
    .build()

credentialManager.getCredential(request)
    .addOnSuccessListener { result ->
        val credential = result.credential as GoogleIdCredential
        Log.d("SignIn", credential.idToken)
    }

ID Token (JWT) chứa ba phân đoạn: tiêu đề với thuật toán ký, tải trọng với dữ liệu người dùng (sub, email, name, picture) và chữ ký để xác minh. Phía máy chủ của ứng dụng xác minh chữ ký ID Token bằng khóa công khai của Google và trích xuất mã định danh người dùng. Cách tiếp cận này đảm bảo rằng ngay cả khi ứng dụng khách bị xâm phạm, kẻ tấn công cũng không thể giả mạo token nếu không có quyền truy cập vào khóa riêng của Google.

Credential Manager: phương thức đăng nhập mới trên Android

Credential Manager là API Android hiện đại được giới thiệu vào năm 2023, kết hợp tất cả các phương thức xác thực (Google Sign-In, đăng nhập bằng mật khẩu, Passkeys) vào một giao diện người dùng duy nhất. Không giống như GoogleSignInClient cũ, Credential Manager không yêu cầu WebView để đăng nhập — nó sử dụng Bottom Sheet gốc, giúp tăng tốc xác thực và cải thiện trải nghiệm người dùng.

Lợi thế chính của Credential Manager là trải nghiệm người dùng thống nhất cho tất cả các loại thông tin xác thực. Người dùng thấy một hộp thoại duy nhất nơi họ có thể chọn: đăng nhập bằng Google, sử dụng Passkey hoặc nhập mật khẩu. Nhà phát triển không cần quản lý các luồng xác thực khác nhau — Credential Manager trừu tượng hóa tương tác với Google Sign-In, Smart Lock và Passkeys. Google khuyến nghị Credential Manager là cách chính để tích hợp Google Sign-In cho Android 14+.

Tham sốGoogleSignInClient (cũ)Credential Manager
API tối thiểuAndroid 4.4 (API 19)Android 4.4 (API 19)
Giao diệnWebView / BottomSheetBottomSheet gốc
Hỗ trợ PasskeyKhông
Kích thước SDK~500 KB~150 KB
Trạng tháiKhông dùng nữa (2024)Google khuyến nghị

Di chuyển từ GoogleSignInClient sang Credential Manager

Di chuyển từ GoogleSignInClient sang Credential Manager yêu cầu thay đổi logic phía máy khách: thay vì GoogleSignInOptions, sử dụng GoogleIdCredentialOption và thay vì GoogleSignIn.getSignedInAccountFromIntent, xử lý kết quả qua GetCredentialResponse. Phía máy chủ không yêu cầu thay đổi vì ID Token vẫn giữ nguyên định dạng JWT. Theo Google I/O 2024, khoảng 40% ứng dụng trên Google Play đã di chuyển sang Credential Manager.

Thiết lập Google Sign-In trong dự án Android

Tích hợp Google Sign-In trong ứng dụng Android bắt đầu bằng việc cấu hình dự án trong Google Cloud Console. Bước đầu tiên là tạo Client ID OAuth 2.0 cho Android: chỉ định tên gói của ứng dụng và dấu vân tay chứng chỉ SHA-1. Google sử dụng dữ liệu này để xác minh rằng yêu cầu xác thực đến từ ứng dụng của bạn chứ không phải từ máy khách giả mạo.

Sau khi tạo máy khách trong Google Cloud Console, nhà phát triển thêm phụ thuộc Credential Manager vào build.gradle và cấu hình GoogleIdCredentialOption với serverClientId. Quan trọng: serverClientId là Client ID của ứng dụng web từ cùng dự án Google Cloud, được máy chủ sử dụng để xác minh ID Token. Ứng dụng khách không xác minh token — nó chỉ nhận và chuyển tiếp đến máy chủ.

kotlin
// build.gradle (app) dependencies
implementation("androidx.credentials:credentials:1.5.0")
implementation("androidx.credentials:credentials-play-services-auth:1.5.0")
implementation("com.google.android.libraries.identity.googleid:googleid:1.1.0")

// Yêu cầu Google Sign-In qua Credential Manager
suspend fun requestGoogleSignIn(context: Context): String? {
    val credentialManager = CredentialManager.create(context)
    val googleIdOption = GoogleIdCredentialOption.Builder()
        .setServerClientId(BuildConfig.SERVER_CLIENT_ID)
        .setAutoSelectEnabled(true)
        .build()

    val result = credentialManager.getCredential(
        context as Activity,
        GetCredentialRequest.Builder()
            .addCredentialOption(googleIdOption)
            .build()
    )
    return (result.credential as GoogleIdCredential).idToken
}

Sau khi nhận ID Token trên máy khách, ứng dụng gửi nó đến máy chủ của mình để thực hiện xác minh. Máy chủ xác minh chữ ký JWT bằng khóa công khai của Google (có tại https://www.googleapis.com/oauth2/v3/certs), thời gian hết hạn token (exp) và giá trị trường aud — nó phải khớp với serverClientId. Sau khi xác minh, máy chủ tạo phiên riêng của mình, ví dụ: phát hành JWT nội bộ hoặc Session Token.

Google Sign-In trên iOS: thiết lập và tính năng

Tích hợp Google Sign-In trên iOS được thực hiện qua SDK GoogleSignIn-iOS, có sẵn qua CocoaPods hoặc Swift Package Manager. Quy trình thiết lập bao gồm tạo Client ID cho iOS trong Google Cloud Console (chỉ định Bundle Identifier), thêm URL Scheme cho callback và cấu hình AppDelegate để xử lý URL do Google trả về sau khi xác thực.

Sự khác biệt quan trọng của phiên bản iOS Google Sign-In so với Android là cần cấu hình URL Scheme và Info.plist. GoogleSDK sử dụng Universal Links cho callback, nhưng để dự phòng, yêu cầu URL Scheme dạng `com.googleusercontent.apps.[CLIENT_ID]`. Cũng cần cấu hình Keychain Sharing để lưu refresh token giữa các lần khởi động ứng dụng. Theo tài liệu Google Identity, iOS SDK hỗ trợ iOS 15 trở lên.

swift
// Thiết lập Google Sign-In trên iOS
import GoogleSignIn

class SignInManager: ObservableObject {
    func signIn(presenting viewController: UIViewController) {
        GIDSignIn.sharedInstance.signIn(
            withPresenting: viewController
        ) { signInResult, error in
            guard let result = signInResult else {
                print("Sign in failed: \(error)")
                return
            }
            let idToken = result.user.idToken.tokenString
            // Gửi ID Token đến máy chủ
            sendTokenToBackend(idToken)
        }
    }
}

Trên iOS, Google Sign-In hỗ trợ Silent Sign-In cho người dùng đã ủy quyền trước đó. Phương thức restorePreviousSignIn tự động khôi phục phiên nếu refresh token được lưu trong Keychain. Điều này đặc biệt quan trọng đối với các ứng dụng mà người dùng không cần đăng nhập lại mỗi lần khởi động. Theo Google, Silent Sign-In thành công trong 85% trường hợp trên các thiết bị có phiên Google hoạt động.

Xử lý token và bảo mật

Bảo mật của Google Sign-In được xây dựng trên ba cấp độ: xác minh máy khách (chữ ký ứng dụng SHA-1), mã hóa truyền tải (HTTPS/TLS) và chữ ký JWT mật mã. ID Token nhận từ Google được ký bằng thuật toán RS256 (RSA với SHA-256). Phía máy chủ của ứng dụng phải xác minh chữ ký token, thời gian hết hạn và nhà phát hành (iss) — chỉ accounts.google.com.

Access Token là token tạm thời (tồn tại 1 giờ) cung cấp quyền truy cập vào API Google (Google Drive, Google Calendar, YouTube, v.v.). Không giống như ID Token, Access Token không chứa thông tin người dùng — nó là một chuỗi opaque mà máy chủ API Google sử dụng để ủy quyền yêu cầu. Refresh Token là token tồn tại lâu dài cho phép nhận Access Token mới mà không cần người dùng đăng nhập lại. Refresh Token chỉ được phát hành ở lần đăng nhập đầu tiên và người dùng có thể thu hồi nó trong cài đặt tài khoản Google.

kotlin
// Ví dụ xử lý ID Token trên máy chủ (mã giả)
fun verifyGoogleToken(idToken: String): User? {
    val verifier = GoogleIdTokenVerifier.Builder(
        NetHttpTransport(), GsonFactory.getDefaultInstance()
    ).setAudience(listOf(CLIENT_ID))
     .build()

    val token = verifier.verify(idToken) ?: return null
    val payload = token.payload

    return User(
        id = payload.subject,
        email = payload.email,
        name = payload.get("name") as String
    )
}

Refresh Token và quản lý phiên

Khuyến nghị bảo mật: không bao giờ truyền ID Token qua các kênh không an toàn, sử dụng HTTPS cho tất cả yêu cầu đến máy chủ, kiểm tra thời gian hết hạn token (trường exp) và nhà phát hành (iss). Trên máy khách, không lưu trữ token trong SharedPreferences mà không mã hóa — sử dụng EncryptedSharedPreferences hoặc Android Keystore. Google Sign-In không dành cho xác thực máy chủ-máy chủ — hãy sử dụng Service Accounts cho mục đích đó.

Ví dụ mã: tích hợp Google Sign-In trong Kotlin

Ví dụ hoàn chỉnh về tích hợp Google Sign-In trong ứng dụng Android sử dụng Credential Manager và ViewModel. Ứng dụng hiển thị nút đăng nhập, sau khi xác thực gửi ID Token đến máy chủ và hiển thị thông tin người dùng. Mã sử dụng coroutine cho công việc bất đồng bộ với Credential Manager.

kotlin
class SignInViewModel: ViewModel() {
    private val cm = CredentialManager.create(getApplication())

    private val googleOption = GoogleIdCredentialOption.Builder()
        .setServerClientId(BuildConfig.SERVER_CLIENT_ID)
        .build()

    suspend fun signIn(): SignInResult {
        return try {
            val response = cm.getCredential(
                GetCredentialRequest.Builder()
                    .addCredentialOption(googleOption)
                    .build()
            )
            val credential = response.credential as GoogleIdCredential
            SignInResult.Success(credential.idToken)
        } catch (e: GetCredentialCancellationException) {
            SignInResult.Cancelled
        }
    }
}

sealed class SignInResult {
    data class Success(val idToken: String) : SignInResult()
    data class Error(val message: String) : SignInResult()
    data class Cancelled : SignInResult()
}

Sau khi xác thực thành công, ứng dụng nên gửi ID Token đến máy chủ của mình để xác minh và tạo phiên. Khuyến nghị sử dụng HTTPS và truyền token trong phần thân của yêu cầu POST. Máy chủ trả về token phiên riêng của nó, mà máy khách lưu trữ trong EncryptedSharedPreferences. Trong mỗi yêu cầu tiếp theo đến máy chủ, token nội bộ được sử dụng, không phải ID Token Google.

Lỗi tích hợp thường gặp và giải pháp

Lỗi phổ biến đầu tiên là không khớp chứng chỉ SHA-1. Google Cloud Console liên kết Client ID OAuth 2.0 với dấu vân tay chứng chỉ SHA-1. Nếu ứng dụng được xây dựng bằng khóa gỡ lỗi nhưng Client ID được tạo cho khóa phát hành, Google Sign-In sẽ trả về lỗi 12501 (SIGN_IN_FAILED). Giải pháp: thêm cả hai dấu vân tay SHA-1 (gỡ lỗi và phát hành) vào Google Cloud Console hoặc sử dụng một Client ID cho phát triển và một Client ID riêng cho sản xuất.

Vấn đề phổ biến thứ hai là serverClientId không chính xác. Các nhà phát triển thường sử dụng Client ID Android thay vì Client ID ứng dụng web trong tham số serverClientId của Credential Manager. Google yêu cầu chính xác Client ID web để tạo ID Token dành cho xác minh máy chủ. Client ID Android chỉ được sử dụng để nhận dạng ứng dụng trong quá trình xác thực. Đảm bảo serverClientId khớp với ứng dụng web trong Google Cloud Console.

Lỗi thứ ba là bỏ qua xử lý hủy bỏ. Người dùng có thể đóng hộp thoại Google Sign-In mà không hoàn tất xác thực. Credential Manager ném GetCredentialCancellationException cần được xử lý riêng biệt với các lỗi khác. Nhiều nhà phát triển xử lý tất cả ngoại lệ như lỗi, hiển thị cho người dùng thông báo “Đăng nhập thất bại” trong khi người dùng chỉ đơn giản là đã hủy thao tác. Xử lý đúng: khi bị hủy — không hiển thị gì, chỉ quay lại trạng thái ban đầu.

Câu hỏi thường gặp

Tôi nên sử dụng phiên bản Google Sign-In SDK nào vào năm 2026?

Khuyến nghị sử dụng Credential Manager (AndroidX Credentials) cho Android và SDK GIDSignIn qua Swift Package Manager cho iOS. Credential Manager là API hiện đại được Google hỗ trợ, kết hợp Google Sign-In, Passkeys và đăng nhập bằng mật khẩu trong một giao diện duy nhất. GoogleSignInClient cũ (com.google.android.gms:auth) không còn được khuyến nghị sử dụng.

Sự khác biệt giữa ID Token và Access Token trong Google Sign-In là gì?

ID Token là JWT chứa thông tin người dùng (tên, email, ID duy nhất). Nó được sử dụng để xác thực ở phía máy chủ của ứng dụng. Access Token là chuỗi opaque để truy cập API Google (Google Drive, Calendar). ID Token tồn tại 1 giờ, Access Token cũng tồn tại 1 giờ nhưng có thể được làm mới qua Refresh Token.

Tôi có thể sử dụng Google Sign-In mà không cần xác minh máy chủ không?

Về mặt kỹ thuật là có, nhưng không an toàn. Nếu bạn chỉ xác minh ID Token ở phía máy khách, kẻ tấn công có thể dịch ngược ứng dụng và trích xuất logic xác minh. Xác minh phía máy chủ bằng khóa công khai của Google đảm bảo token thực sự được Google phát hành và không bị giả mạo. Đối với ứng dụng không có máy chủ, hãy sử dụng Firebase Authentication.

Tại sao Google Sign-In trả về lỗi 12501?

Lỗi 12501 (SIGN_IN_FAILED) xảy ra khi chứng chỉ SHA-1 của ứng dụng không khớp với chứng chỉ được chỉ định trong Google Cloud Console. Giải pháp: thêm SHA-1 từ chứng chỉ gỡ lỗi (từ Android Studio) và chứng chỉ phát hành vào bảng điều khiển. Cũng kiểm tra xem tên gói trong bảng điều khiển có khớp với build.gradle không. Sau khi thay đổi, có thể mất đến 24 giờ để lan truyền.

Google Sign-In có hoạt động khi không có internet không?

Không, Google Sign-In yêu cầu kết nối internet để giao tiếp với máy chủ Google. Nếu thiết bị ngoại tuyến, hãy sử dụng cơ chế lưu cache phiên: sau khi đăng nhập thành công, lưu token trong EncryptedSharedPreferences và kiểm tra tính hợp lệ của nó ở lần khởi động tiếp theo. Khi không có mạng, hiển thị dữ liệu đã lưu và đề xuất đăng nhập sau.

Tổng kết

  • Google Sign-In — SDK xác thực qua tài khoản Google dựa trên OAuth 2.0 và OpenID Connect
  • OAuth 2.0 — giao thức nơi ứng dụng nhận token truy cập mà không truyền mật khẩu người dùng
  • Credential Manager — API Android hiện đại cho Google Sign-In với BottomSheet gốc và hỗ trợ Passkey
  • ID Token — JWT với dữ liệu người dùng mà máy chủ xác minh bằng khóa công khai của Google
  • Bảo mật dựa trên chữ ký ứng dụng SHA-1, HTTPS và xác minh JWT mật mã
  • Tích hợp iOS yêu cầu URL Scheme, Keychain Sharing và SDK GoogleSignIn qua Swift Package Manager
  • Lỗi thường gặp — không khớp SHA-1, serverClientId sai và bỏ qua CancellationException

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm