Jump to content
  • 0

Google Service Account om in Google Cloud Storage te komen - invalid_grant error, Invalid signature for token


Gaiser

Question

Posted (edited)

Ik ben bezig om met een Service account in Google Cloud in te loggen zodat ik files kan opslaan en ophalen in Google Cloud storage.
Met een normale user account heb ik de Oauth2 werkend, en krijg ik keurig de access tokens en refresh token, maar met een service account werkt het verkrijgen van een access token iets anders, en daar krijg ik een foutmelding die ik niet opgelost krijg en niet goed een ervaring met Filemaker kan vinden. Misschien dat iemand hier er ervaring mee heeft..

Wat ben ik aan het doen:

Ik ben aan de slag gegaan aan de hand van een artikel van Soliant door Michael Havis.

1) Ik heb een Service account gemaakt volgens de documentatie van Google voor Server to Server communicatie.

image.thumb.png.1b98c6e0a4ac17d0cf3d30fa439fa41c.png

 

Deze account heeft een rol met permissies voor het schrijven en lezen van data in storage buckets.

 

De instelling bij de service account IAM:

image.thumb.png.fb5e3461826caa23cd15b47cb6f09f30.png

 

De permissions:

 

image.thumb.png.16f7358c907005de8a272fbd06cfe875.png

 

De Service account heeft de rechten voor de bucket:

 

image.thumb.png.9c4f66ebd6a7502bcceb99c76997dbc8.png

 

2) Ik wil een Access token aanvragen bij Google voor de service account.

Dit zijn de script stappen:

Set Variable [ $header ; Value: JSONSetElement ( "" 	; [ "alg" ; "RS256" ; 1 ] 	; [ "typ" ; "JWT" ; 1 ] ) ]
Set Variable [ $encodedHeader ; Value: Base64ForGoogleJWT ( $header ) ]
# 
Set Variable [ $urlOauth ; Value: "https://oauth2.googleapis.com/token" ]
Set Variable [ $scope ; Value: "https://www.googleapis.com/auth/devstorage.read_write" ]
Set Variable [ $iat ; Value: UNIX_EpochTime ]
Set Variable [ $exp ; Value: UNIX_EpochTime + 3600 ]
Set Variable [ $claimSet ; Value: JSONSetElement ( "" 	; [ "iss" ; SQL_Get_v3 ( SYSTEMPREFERENCES::googleServiceAccountEmail ) ; 1 ] 	; [ "scope" ; $scope ; 1 ] 	; [ "aud" ; $urlOauth ; 1 ] 	; [ "exp" ; $exp ; 1 ] 	; [ "iat" ; $iat ; 1 ] ) ]
Set Variable [ $encodedClaimSet ; Value: Base64ForGoogleJWT ( $claimSet ) ]
# 
Set Variable [ $RSAKey ; Value: "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9....hier_staat_data.....y19zc1CXISk3afT…" ]
Set Variable [ $encodedSignature ; Value: CryptGenerateSignature ( $encodedHeader & "." & $encodedClaimSet  ; "SHA256"  ; $RSAkey  ; ""  ) ]
# 
Set Variable [ $jwtFull ; Value: "assertion=" & $encodedHeader & "." & $encodedClaimSet & "." & $encodedSignature ]
# 
Set Variable [ $curl ; Value: " -X POST /token HTTP/1.1 -H \"Host: oauth2.googleapis.com\" -H \"Content-Type: application/x-www-form-urlencoded\" -D $responseHeaders -d \"grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer\" -d @$jwtFull " ]
Insert from URL [ Select ; With dialog: Off ; Target: $$RESULT ; $urlOauth ; cURL options: $curl ]

UNIX_EpochTime voor $iat en $exp gaat met een simpele custom function voor het berekenen van de Unix timestamp:

Int ( Get ( CurrentTimeUTCMilliseconds ) / 1000) - 62135596800

De header, claim set en signature worden Base64 gecodeerd, en 

Bij de Base64 encoding wordt de =, + en / eruit gehaalt en geen CRLF endings gemaakt. Dit gaat met een custom function (conform artikel van Michael / Soliant:

Let([
string_B64 = Base64EncodeRFC ( 4648 ; data ) ; // Regular base64 encoder
string_B64URL = Substitute ( string_B64

    ; [ "=" ; "" ]
    ; [ "+" ; "-" ]
    ; [ "/" ; "_" ]

    ) //URL safe characters
];

string_B64URL
)

 

De CURL is als volgt:

"
-X POST /token HTTP/1.1
-H \"Host: oauth2.googleapis.com\"
-H \"Content-Type: application/x-www-form-urlencoded\"
-D $responseHeaders
-d \"grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer\"
-d @$jwtFull
"

 

Wat er gebeurt:

Script maakt een JWT.

Stuurt deze aan Google, om een access token te krijgen.Het resultaat is echter niet succesvol.

De foutmelding die ik krijg:

{
  "error": "invalid_grant",
  "error_description": "java.security.SignatureException: Invalid signature for token: eyJhbGci..hier_staat_data...GVhcGlzLmNvbS9hdXRoL2RldnN0b3JhZ2UucmVhZF93cml0ZSJ9.?"
}

Het lijkt niet te liggen aan een fout in de JWT signature. Als ik daar 'express' iets verkeerd doe, krijg ik een andere foutmelding. 

 

Heeft iemand deze eerder gehad: java.security.SignatureException: Invalid signature for token?

Dank!
Gijs

image.png

Edited by Gaiser

3 answers to this question

Recommended Posts

  • 0
Posted

Ik ben iets verder. Het probleem is dat de CryptGenerateSignature functie de calculatie niet kon maken en een vraagteken gaf in de JWT.

Nu ik end line \n in de private key vervang door een Char(13) of Char(10) krijg ik in ieder geval 'signature.data' als resultaat van de functie.

Dat ziet er beter uit. 

Echter nu wil ik dat er daadwerkelijk een string uit komt. Ga ik nu mee bezig om uit te zoeken.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...