谷歌账户操作,将“使用 Google 账号登录”按钮添加到应用的界面中

将以下依赖项添加到应用模块的 build 脚本中 - 请务必将 替换为 库的最新版本:

dependencies {
    implementation("androidx.credentials:credentials:1.6.0-alpha05")
    implementation("androidx.credentials:credentials-play-services-auth:1.6.0-alpha05")
    implementation("com.google.android.libraries.identity.googleid:googleid:")
}

dependencies {
    implementation "androidx.credentials:credentials:1.6.0-alpha05"
    implementation "androidx.credentials:credentials-play-services-auth:1.6.0-alpha05"
    implementation "com.google.android.libraries.identity.googleid:googleid:"
}

实例化 登录请求

如需开始构建您的实现,请。使用 检索用户的 ID 令牌。

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
    .setFilterByAuthorizedAccounts(true)
    .setServerClientId(WEB_CLIENT_ID)
    .setAutoSelectEnabled(true)
    // nonce string to use when generating a Google ID token
    .setNonce(nonce)
    .build()

首先,通过调用 API 并将 参数设置为 true,检查用户是否有之前曾用于登录您应用的账号。用户可以选择使用哪个可用账号登录。

如果没有可用的已授权 账号,系统应提示用户使用其任何可用账号进行注册。为此,请再次调用该 API 并将 设置为 false,以提示用户。。

为回访用户启用自动登录功能(推荐)

开发者应为使用单个账号注册的用户启用自动登录。这样一来,用户便可在各种设备上获得顺畅的体验,尤其是在设备迁移期间,用户无需重新输入凭据即可快速重新访问自己的账号。对于您的用户,如果他们之前已登录,则无需再进行登录,从而减少不必要的摩擦。

如需启用自动登录,请使用 (true)。只有在满足以下条件时,用户才能自动登录:

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
    .setFilterByAuthorizedAccounts(true)
    .setServerClientId(WEB_CLIENT_ID)
    .setAutoSelectEnabled(true)
    // nonce string to use when generating a Google ID token
    .setNonce(nonce)
    .build()

实现自动登录功能时,请务必正确,以便用户在明确退出应用后始终可以选择合适的账号。

设置随机数以提高安全性

为了提高登录安全性并避免重放攻击,请添加 在每个请求中添加 Nonce。。

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
    .setFilterByAuthorizedAccounts(true)
    .setServerClientId(WEB_CLIENT_ID)
    .setAutoSelectEnabled(true)
    // nonce string to use when generating a Google ID token
    .setNonce(nonce)
    .build()

创建“使用 账号登录”流程

设置“使用 账号登录”流程的步骤如下:

实例化 ,然后使用 添加之前创建的 以检索凭据。将此请求传递给 () 或 (Java) 调用以检索用户的可用凭据。API 成功运行后,提取存放 ial 数据结果的 。 的类型应等于 ial. 的值。使用 ial. 方法将该对象转换为 ial。

如果转换成功,请提取 ial ID,对其进行验证,并在服务器上对凭据进行身份验证。

如果转换失败并显示 ,那么您可能需要更新“使用 账号登录”库的版本。

捕获任何无法识别的自定义凭据类型。

val request: GetCredentialRequest = GetCredentialRequest.Builder()
    .addCredentialOption(googleIdOption)
    .build()
coroutineScope {
    try {
        val result = credentialManager.getCredential(
            request = request,
            context = activityContext,
        )
        handleSignIn(result)
    } catch (e: GetCredentialException) {
        // Handle failure
    }
}

fun handleSignIn(result: GetCredentialResponse) {
    // Handle the successfully returned credential.
    val credential = result.credential
    val responseJson: String
    when (credential) {
        // Passkey credential
        is PublicKeyCredential -> {
            // Share responseJson such as a GetCredentialResponse to your server to validate and
            // authenticate
            responseJson = credential.authenticationResponseJson
        }
        // Password credential
        is PasswordCredential -> {
            // Send ID and password to your server to validate and authenticate.
            val username = credential.id
            val password = credential.password
        }
        // GoogleIdToken credential
        is CustomCredential -> {
            if (credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
                try {
                    // Use googleIdTokenCredential and extract the ID to validate and
                    // authenticate on your server.
                    val googleIdTokenCredential = GoogleIdTokenCredential
                        .createFrom(credential.data)
                    // You can use the members of googleIdTokenCredential directly for UX
                    // purposes, but don't use them to store or control access to user
                    // data. For that you first need to validate the token:
                    // pass googleIdTokenCredential.getIdToken() to the backend server.
                    // see [validation instructions](https://developers.google.com/identity/gsi/web/guides/verify-google-id-token)
                } catch (e: GoogleIdTokenParsingException) {
                    Log.e(TAG, "Received an invalid google id token response", e)
                }
            } else {
                // Catch any unrecognized custom credential type here.
                Log.e(TAG, "Unexpected type of credential")
            }
        }
        else -> {
            // Catch any unrecognized credential type here.
            Log.e(TAG, "Unexpected type of credential")
        }
    }
}

触发“使用 账号登录”按钮流程

如需触发“使用 账号登录”按钮流程,请使用 ption 而非 :

val signInWithGoogleOption: GetSignInWithGoogleOption = GetSignInWithGoogleOption.Builder(
    serverClientId = WEB_CLIENT_ID
).setNonce(nonce)
    .build()

注意: 此 ption 必须是 中的唯一选项。

按照以下代码示例中的说明处理返回的 ial。

fun handleSignInWithGoogleOption(result: GetCredentialResponse) {
    // Handle the successfully returned credential.
    val credential = result.credential
    when (credential) {
        is CustomCredential -> {
            if (credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
                try {
                    // Use googleIdTokenCredential and extract id to validate and
                    // authenticate on your server.
                    val googleIdTokenCredential = GoogleIdTokenCredential
                        .createFrom(credential.data)
                } catch (e: GoogleIdTokenParsingException) {
                    Log.e(TAG, "Received an invalid google id token response", e)
                }
            } else {
                // Catch any unrecognized credential type here.
                Log.e(TAG, "Unexpected type of credential")
            }
        }
        else -> {
            // Catch any unrecognized credential type here.
            Log.e(TAG, "Unexpected type of credential")
        }
    }
}

实例化 登录请求后,按照部分中所述的相似方式启动身份验证流程。

允许新用户注册(推荐)

“使用 账号登录”功能可让用户只需点按几下,即可在您的应用或服务中轻松创建新账号。

如果未找到已保存的凭据( 未返回任何 账号),请提示用户注册。首先,检查 (true) 以查看是否存在任何之前使用的账号。如果未找到任何账号,则提示用户使用 (false) 注册 账号

示例:

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
    .setFilterByAuthorizedAccounts(false)
    .setServerClientId(WEB_CLIENT_ID)
    .build()

实例化 账号注册请求后,启动身份验证流程。如果用户不想使用“使用 账号登录”功能进行注册,请考虑优化应用以支持自动填充。用户创建账号后,请考虑让他们注册通行密钥,作为账号创建的最后一步。

云衔科技是一家专注于企业数字化广告营销解决方案的服务商。公司凭借深厚的行业经验和专业技术能力,致力于为企业客户提供全方位、更高效的数字化广告营销与运营服务。

发表回复