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.
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:
Question
Gaiser
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.
Deze account heeft een rol met permissies voor het schrijven en lezen van data in storage buckets.
De instelling bij de service account IAM:
De permissions:
De Service account heeft de rechten voor de bucket:
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
Edited by Gaiser
3 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.