2016-05-25 13 views
5

OAuth2でGoogleから使用するトークンを取得しようとするコードを書いています。これは、サービスアカウントのためなので、命令はここにある:Google OAuth2の署名のJWT "invalid_grant"

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

私はGoogleにJWTを投稿するとき、このエラーを取得しておいてください。

{ "エラー": "invalid_grant"、「しましたerror_description ":" JWT署名が無効です。 "ここ}

は、コードは次のとおりです。JWTが失敗する理由

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); 
} 

誰でも知っていますか?

ありがとうございます! Brad

+0

サービスアカウントの秘密鍵がまだクラウドコンソールから有効であることを確認してください –

+0

Typescriptですか?あなたは使用言語で質問にタグを付けることができますか? –

+0

@ブラッドあなたは解決策を見つけましたか? – bibscy

答えて

2

この問題は、StringUtils.encodeBase64()メソッドが標準のbase64エンコードを実行する可能性が高いという事実に関連している可能性があります。

しかし、JWT specによれば、これは使用する必要がある標準のbase64エンコーディングではなく、the URL- and filename-safe Base64 encodingで、=のパディング文字が省略されています。あなたはbase64URLエンコーディングのための便利なユーティリティメソッドを持っていない場合は

、あなたは

  • -ですべて+を交換することにより確認することができます。
  • /_に置き換えます。
  • あなたのbase64でエンコードされた文字列内のすべての=

を取り除きます。

また、あなたの署名もbase64でエンコードされていますか?上記と同じ規則に従う必要があります。

+0

Robby、 これは非常に便利です。簡単な質問...私がGoogleからダウンロードした鍵は、このようなものです... -----開始プライベートキー----- \ n {除外されたものの束} = \ n ---- -ENDプライベートキー----- \ n 私は署名するためにキーを使用する前に、次のいずれかを削除しますか? "\ n"または "-----開始プライベートキー-----"または "="の前に "-----終了プライベートキー----- \ n" – Brad

+0

。 –

+0

ありがとうございます。それはまさに私の問題でした。私はCommons-codecから 'Base64.encodeBase64URLSafeString'を使用することができました。 – Stephen

関連する問題