Im working with firebase auth to make a login with google. Im try to make the login and consume the google books api with the Oauth 2.0 token. I did the authentication and the authorization process but the when i consume the api with the token generated, the api return me this error.
{
"error": {
"code": 401,
"message": "Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
"errors": [
{
"message": "Invalid Credentials",
"domain": "global",
"reason": "authError",
"location": "Authorization",
"locationType": "header"
}
],
"status": "UNAUTHENTICATED"
}
}
Heres my flow.
I opened the credential manager to get the credentials of google account.
val googleIdOptions = GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(false)
.setServerClientId(context.getString(R.string.WEB_CLIENT_ID))
.setAutoSelectEnabled(true)
.build()
val credentialRequest = GetCredentialRequest.Builder()
.addCredentialOption(googleIdOption)
.build()
val result = CredentialManager.create(context).getCredential(
request = request,
context = context,
)
Then, i cast my credential to type TYPE_GOOGLE_ID_TOKEN_CREDENTIAL and make my firebase auth with credential.
val credential = result.credential
if (credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
try {
val googleIdTokenCredential = GoogleIdTokenCredential.createFrom(credential.data)
try {
Firebase.auth
.signInWithCredential(GoogleAuthProvider.getCredential(googleIdTokenCredential.idToken, null))
.addOnCompleteListener {
val token = it.result.user?.getIdToken(false)?.result?.token
println(token)
handlerResult(it, firebaseState)
}
} catch (e: ApiException) {
e.printStackTrace()
}
} catch (e: GoogleIdTokenParsingException) {
Log.e(TAG, "Received an invalid google id token response", e)
}
}
Then, continue with the Authorization process to the API.
val authorizationRequest = AuthorizationRequest.Builder()
.setRequestedScopes(listOf(Scope("https://www.googleapis.com/auth/books")))
.build()
Identity.getAuthorizationClient(this)
.authorize(authorizationRequest)
.addOnSuccessListener { authorizationResult ->
if (authorizationResult.hasResolution()) {
// Access needs to be granted by the user
val pendingIntent = authorizationResult.pendingIntent
try {
pendingIntent?.let {
launcher.launch(IntentSenderRequest.Builder(it.intentSender).build())
}
} catch (e: SendIntentException) {
Log.e(
"AutenticationActivity",
"Couldn't start Authorization UI: " + e.localizedMessage
)
}
} else {
// Access already granted, continue with user action
openMainActivity()
}
}
.addOnFailureListener { e -> Log.e("AutenticationActivity", "Failed to authorize", e) }
And finally, launch with retrofit the Books api.
val token = Firebase.auth.currentUser?.getIdToken(false)?.result?.token
token.let {
val myVolumesDTO = services.getMyVolumes(shelf, "Bearer $it")
}
The callback in the Logcat looks like this.
--> GET https://www.googleapis.com/books/v1/mylibrary/bookshelves/4/volumes
Authorization: Bearer eyJhbGciOiJSUzI1NiIs...
--> END GET
I dont know what im doing wrong. Could someone help me?
Thank you.
I have some configurations in the GCC, i set my oauth clients for the android app and configure my oauth consentment page. Add my ApiKey and add the Books API in the Restricted Apis.
Diego Eduardo Guido Ramos is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.