2016-05-25 14 views
5

Piszę kod, aby uzyskać token do użycia przez Google w OAuth2. To jest dla konta usługi, więc instrukcje są tutaj:JWT "invalid_grant" w Podpisie w Google OAuth2

https://developers.google.com/identity/protocols/OAuth2ServiceAccount

Wciąż dostaję ten błąd, kiedy opublikować JWT do Google:

{ "error": "invalid_grant", „ERROR_DESCRIPTION ":" Nieprawidłowy podpis JWT. " }

Oto kod:

try{   
    var nowInSeconds : Number = (Date.now()/1000); 
    nowInSeconds = Math.round(nowInSeconds); 
    var fiftyNineMinutesFromNowInSeconds : Number = nowInSeconds + (59 * 60); 


    var claimSet : Object = {}; 
    claimSet.iss = "{{RemovedForPrivacy}}";   
    claimSet.scope = "https://www.googleapis.com/auth/plus.business.manage"; 
    claimSet.aud = "https://www.googleapis.com/oauth2/v4/token"; 
    claimSet.iat = nowInSeconds; 
    claimSet.exp = fiftyNineMinutesFromNowInSeconds; 

    var header : Object = {}; 
    header.alg = "RS256"; 
    header.typ = "JWT"; 

    /* Stringify These */ 
    var claimSetString = JSON.stringify(claimSet); 
    var headerString = JSON.stringify(header); 

    /* Base64 Encode These */ 
    var claimSetBaseSixtyFour = StringUtils.encodeBase64(claimSetString); 
    var headerBaseSixtyFour = StringUtils.encodeBase64(headerString); 

    var privateKey = "{{RemovedForPrivacy}}"; 

    /* Create the signature */ 
    var signature : Signature = Signature(); 
    signature = signature.sign(headerBaseSixtyFour + "." + claimSetBaseSixtyFour, privateKey , "SHA256withRSA"); 

    /* Concatenate the whole JWT */ 
    var JWT = headerBaseSixtyFour + "." + claimSetBaseSixtyFour + "." + signature; 

    /* Set Grant Type */ 
    var grantType = "urn:ietf:params:oauth:grant-type:jwt-bearer" 

    /* Create and encode the body of the token post request */ 
    var assertions : String = "grant_type=" + dw.crypto.Encoding.toURI(grantType) + "&assertion=" + dw.crypto.Encoding.toURI(JWT); 

    /* Connect to Google And Ask for Token */ 
    /* TODO Upload Certs? */ 
    var httpClient : HTTPClient = new HTTPClient(); 
    httpClient.setRequestHeader("content-type", "application/x-www-form-urlencoded; charset=utf-8"); 
    httpClient.timeout = 30000; 
    httpClient.open('POST', "https://www.googleapis.com/oauth2/v4/token"); 
    httpClient.send(assertions); 

    if (httpClient.statusCode == 200) { 
     //nothing 
    } else { 
     pdict.errorMessage = httpClient.errorText; 
    } 

} 
catch(e){ 
    Logger.error("The error with the OAuth Token Generator is --> " + e); 
} 

Czy ktoś wie dlaczego JWT się niepowodzeniem?

Dziękuję bardzo! Brad

+0

Sprawdź, czy klucz prywatny konta usługi jest nadal ważny z konsoli w chmurze –

+0

Czy to maszynopis? Czy możesz oznaczyć pytanie językiem? –

+0

@Brad Czy znalazłeś rozwiązanie? – bibscy

Odpowiedz

2

Problem może być związany z tym, że twoja metoda StringUtils.encodeBase64() prawdopodobnie wykonuje standardowe kodowanie base64.

Jednakże, nie jest wymagane standardowe kodowanie base64, ale the URL- and filename-safe Base64 encoding, z pominięciem znaków dopełniających =.

Jeśli nie masz pod ręką metody użytkową do kodowania base64URL można zweryfikować przez

  • zastępując wszystkie + z -;
  • Zastąpienie wszystkich / z _;
  • usuwając wszystkie =

w swoich ciągów base64 zakodowany.

Czy twój podpis jest również kodowany base64? Musi być, zgodnie z tymi samymi zasadami, które opisano powyżej.

+0

Robby, To jest bardzo pomocne. Szybkie pytanie ... klucz, który pobieram z Google wygląda tak ... ----- BEGIN PRIVATE KEY ----- \ n {Wiązka usuniętych rzeczy} = \ n ---- -END KLAWISZ PRYWATNY ----- \ n Czy przed użyciem klawisza do podpisania usuwam jedno z poniższych? "\ n" lub "----- BEGIN PRIVATE KEY -----" lub "=" przed "----- END PRIVATE KEY ----- \ n" – Brad

+0

Nie musi . –

+0

Dziękuję, proszę pana. To był dokładnie mój problem. Byłem w stanie użyć 'Base64.encodeBase64URLSafeString' z commons-codec. – Stephen

Powiązane problemy