Ho sbattuto la testa contro un muro per 3 giorni ora cercando di farlo funzionare.Google OAuth 2.0 Server a server: richiesta errata
POST /oauth2/v3/token HTTP/1.1
Host: www.googleapis.com
Content-length: 495
Content-type: application/x-www-form-urlencoded
Authorization: Bearer ya29.cgEcY6meBrvaH6oe0nD_PtsFyMVqskiUYi7iJxapKHeEgPoIw8gMt0BJdIvRn1MfcEgzTS3_gTwI1w
grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI5MDgyOTgxNjA1NTktc2R1bGFpbWhsaGpxOTY5M2s1Z2E4c25pZjhh%0D%0ANzhlZ3BAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0%0D%0AdHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvYW5hbHl0aWNzLnJlYWRvbmx5%0D%0AIiwiYXVkIjoiaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tL28vb2F1dGgyL3Rv%0D%0Aa2VuIiwiZXhwIjoxNDMxNTE0MDUyLCJpYXQiOjE0MzE1MTEwNTJ9.[Cert]
HTTP/1.1 400 Bad Request
Content-length: 67
X-xss-protection: 1; mode=block
X-content-type-options: nosniff
Expires: Wed, 13 May 2015 10:08:00 GMT
Vary: Origin,X-Origin
Server: GSE
Cache-control: private, max-age=0
Date: Wed, 13 May 2015 10:08:00 GMT
X-frame-options: SAMEORIGIN
Content-type: application/json; charset=UTF-8
{
"error_description": "Bad Request",
"error": "invalid_grant"
}
Quindi, sto creando questo in PL/SQL. Oracle 12c. Sono riuscito a ottenere l'intestazione JWT e JWT Claim impostato per produrre un output uguale alla documentazione di google. Quando creo il certificato, penso che il problema si sia verificato.
'ho bisogno del "[----- BEGIN CHIAVE PRIVATA -----" e ----- END CHIAVE PRIVATA ----- \ n] come parte del SHA 256 crittografia. Dovrei fare qualcosa con le "Nuove linee"? \ n Dovrei circondarlo di parentesi?
A che punto dovrei essere la codifica URL?
è il codice nel seguente esempio sufficiente per la cifratura ?: http://jastraub.blogspot.co.uk/2009/07/hmacsha256-in-plsql.html
Ho allegato la funzione qui sotto per vedere se è possibile identificare eventuali problemi?
Grazie per il vostro aiuto!
FUNCTION get_JWT (p_token_id ga_app_user.ID_TOKEN%TYPE)
RETURN VARCHAR2
IS
--Plain text
baseJWTheader VARCHAR2 (20000);
baseclaimSet VARCHAR2 (20000);
baseSigKey VARCHAR2 (20000);
--Seconds
sysSeconds NUMBER;
--Base64 Encoded
JWTheader VARCHAR2 (20000);
claimSet VARCHAR2 (20000);
sigKey VARCHAR2 (20000);
sigContent VARCHAR2 (20000);
--Returned value
output RAW (20000);
BEGIN
SELECT JWT_HEADER, JWT_CLAIM_SET, SIGNATURE
INTO baseJWTheader, baseclaimSet, baseSigKey
FROM dwman.ga_app_user au
WHERE AU.ID_TOKEN = p_token_id;
--DBMS_OUTPUT.PUT_LINE ('Base claim Set ' || baseclaimSet);
JWTheader :=
TRANSLATE (
UTL_RAW.cast_to_varchar2 (
UTL_ENCODE.BASE64_ENCODE (UTL_RAW.CAST_TO_RAW (baseJWTheader))),
'+/',
'-_');
SELECT ( SYSDATE
- TO_DATE ('01-01-1970 00:00:00', 'DD-MM-YYYY HH24:MI:SS'))
* 24
* 60
* 60
INTO sysSeconds
FROM DUAL;
baseclaimSet :=
REPLACE (baseclaimSet, '#EXPIRE#', ROUND (sysSeconds + 3000));
baseclaimSet := REPLACE (baseclaimSet, '#START#', ROUND (sysSeconds));
--DBMS_OUTPUT.PUT_LINE ('Claim Set ' || baseclaimSet);
claimSet := UTL_RAW.cast_to_varchar2 (
UTL_ENCODE.BASE64_ENCODE (UTL_RAW.CAST_TO_RAW (baseclaimSet)));
sigKey := baseSigKey;
sigContent := JWTheader || '.' || claimSet;
--DBMS_OUTPUT.PUT_LINE('Sig Content '||sigContent);
sigContent := REPLACE (sigContent, CHR (10), '');
sigContent := REPLACE (sigContent, CHR (13), '');
/*
FOR V_TR in 1..length(sigContent)
LOOP
DBMS_OUTPUT.PUT_LINE (substr(sigContent,V_TR,1)||'='||to_char(ASCII(substr(sigContent,V_TR,1))));
END LOOP;
*/
sigContent :=
sigContent
|| '.'
|| google_signature (sigContent, sigKey);
RETURN UTL_URL.ESCAPE(sigContent, TRUE, 'UTF-8');
END get_JWT;
Che cosa stai cercando di fare esattamente qui? invalid_grant normalmente significa che qualcosa non va nel tempo. – DaImTo
Grazie per il commento. Sto cercando di connettermi ai dati googleAnalytics per trasferirli in un datawarehouse. Ho seguito il codice indicato qui: https://developers.google.com/identity/protocols/OAuth2ServiceAccount sotto la sezione HTTP/Rest. Sono vicino a scrivere questo processo ETL in Java, invece, ma non pensavo che sarebbe stato altrettanto faticoso. – Fudztown
e lo fai in PL/SQL? o dovrei dire che stai provando a farlo direttamente in PL/SQL? – DaImTo