将以下依赖项添加到应用模块的 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()
实例化 账号注册请求后,启动身份验证流程。如果用户不想使用“使用 账号登录”功能进行注册,请考虑优化应用以支持自动填充。用户创建账号后,请考虑让他们注册通行密钥,作为账号创建的最后一步。
云衔科技是一家专注于企业数字化广告营销解决方案的服务商。公司凭借深厚的行业经验和专业技术能力,致力于为企业客户提供全方位、更高效的数字化广告营销与运营服务。