我正在使用 CredentialManager 在 android 上登录 Google,credentialMnager 没有给我 AccessToken 来将其发送到我的服务器以使用 app-secret 和 clinet-idif (credential...) 进行身份验证。
我正在使用 CredentialManager 在 Android 上使用 Google 登录,credentialMnager 没有给我 AccessToken 以将其发送到我的服务器以使用 app-secret 和 clinet-id 进行身份验证
if (credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
try {
val googleIdTokenCredential = GoogleIdTokenCredential
.createFrom(credential.data)
val idToken = googleIdTokenCredential.idToken
val id = googleIdTokenCredential.id
val displayName = googleIdTokenCredential.displayName
val personPhoto = googleIdTokenCredential.profilePictureUri
} catch (e: GoogleIdTokenParsingException) {
Log.d("pikaboo", "Received an invalid google id token response", e)
}
}
任何人都可以帮助我如何使用这种或其他方法获取 AccessToken
您在 Android 中提到的“CredentialManager”不直接提供访问令牌。它用于存储用户凭据,例如 Google ID 令牌,用于用户识别,而不是使用您的应用密钥和客户端 ID 进行服务器端身份验证。
你的代码:
if (credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
try {
val googleIdTokenCredential = GoogleIdTokenCredential.createFrom(credential.data)
val idToken = googleIdTokenCredential.idToken
val id = googleIdTokenCredential.id
val displayName = googleIdTokenCredential.displayName
val personPhoto = googleIdTokenCredential.profilePictureUri
} catch (e: GoogleIdTokenParsingException) {
Log.d("pikaboo", "Received an invalid google id token response", e)
}
}
此代码成功从存储在 CredentialManager 中的 Google ID 令牌中检索用户信息。但是,它未提供访问令牌。
服务器端身份验证的方法:
使用 Google 登录 API:
与 CredentialManager 一起实现 Google Sign-In API。此 API 提供在成功登录后检索访问令牌的方法。以下是一般流程:
使用 Google 登录活动或自定义流程在您的应用中实现 Google 登录。成功登录后,使用 getSignInAccountFromIntent(data) 获取 SignInAccount 对象。使用 getAccount().serverAuthCode 检索访问令牌。将访问令牌连同您的应用密钥和客户端 ID 一起发送到您的服务器进行身份验证。使用 Google ID 令牌进行服务器端身份验证:
虽然 CredentialManager 提供了 Google ID 令牌,但您可以利用它通过服务器上的应用程序密钥和客户端 ID 进行服务器端身份验证。方法如下:
按照上述方法(步骤 1 和 2)实现 Google 登录。使用 CredentialManager 中的 googleIdTokenCredential.idToken 检索 Google ID 令牌。将 ID 令牌连同应用程序密钥和客户端 ID 一起发送到您的服务器。然后,您的服务器可以使用 Google 的身份平台验证 ID 令牌,以对用户进行身份验证,并可能发出自己的访问令牌。资源:
Google Sign-In API:[https://developers.google.com/identity/sign-in/web/sign-in][1]验证 Google ID 令牌:[https://developers.google.com/identity/gsi/web/guides/verify-google-id-token][2]代码示例(使用 Google Sign-In API):
类你的活动:AppCompatActivity(){
// Initialize the Google Sign-In client
private val googleSignInClient by lazy {
GoogleSignIn.getClient(
this,
GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.server_client_id))
.requestEmail()
.build()
)
}
// Create a launcher for starting the sign-in activity
private val signInResultLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
val task = GoogleSignIn.getSignedInAccountFromIntent(result.data)
handleSignInResult(task)
}
// Handle the sign-in result
private fun handleSignInResult(task: Task<GoogleSignInAccount>) {
try {
val account = task.getResult(ApiException::class.java)!!
val accessToken = account.serverAuthCode
// Send access token to your server for authentication
sendAccessTokenToServer(accessToken)
} catch (e: ApiException) {
// Handle sign-in errors
Log.e("SignInActivity", "Google sign-in failed", e)
}
}
// Function to send the access token to your server
private fun sendAccessTokenToServer(accessToken: String) {
// Implement your server communication logic here
// For example, you can use an HTTP client to send a POST request
// with the access token as a parameter
}
// Start the sign-in activity
fun signIn() {
val signInIntent = googleSignInClient.signInIntent
signInResultLauncher.launch(signInIntent)
}
}
请记住用适合您活动的函数调用替换 startActivityForResult。
选择最适合您应用程序需求的方法。如果您需要更多灵活性和对访问令牌的控制,请直接实施 Google Sign-In API。否则,使用 Google ID 令牌和您的应用程序密钥进行服务器端验证也可以。