2015-07-01 2 views
2

Я включил учетную запись службы из консоли Google API для выполнения two-legged OAuth для совершения звонков в API Google Analytics. Я использую JavaScript и следил за pure JavaScript implementation of JWT and JWS, чтобы сгенерировать подписанный JWT и сделать вызов HTTP/REST для токена, как описано в этом guide. Как только я делаю POST с encodedURL, я получаю ошибку 400 ":" invalid_grant ". «error_description»: «Плохой запрос»Ответ на токен Oauth2 «invalid_grant» с JAPT от GoogleAPI

Я прочитал несколько сообщений, чтобы включить это письмо, а не client_id. Я убедился, что это так, и с тех пор Google обновил свою Документацию.

Любые идеи? Я также отправлю код, если это необходимо, но я в основном следовал за Rothrock в этом link.

Я попробовал подписанный JWT на http://jwt.io/, и он говорит, что это недопустимая подпись. payload и header декодируют правильно. Есть ли способ проверить подпись после кодирования с помощью закрытого ключа, предоставленного консолью Google API?

Вот мой код:

var pHeader = {"alg":"RS256", "typ":"JWT"}; 
    var sHeader = JSON.stringify(pHeader); 
    var pClaim ={}; 
    pClaim.iss = "(ServiceAccount_Email_Address).apps.googleusercontent.com"; 
    pClaim.scope = "https://www.googleapis.com/auth/analytics.readonly"; 
    pClaim.aud = "htps://www.googleapis.com/oauth2/v3/token"; 
    pClaim.exp = KJUR.jws.IntDate.get("now + 1hour"); 
    pClaim.iat = KJUR.jws.IntDate.get("now"); 

    var sClaim = JSON.stringify(pClaim); 

    var key = "-----BEGIN PRIVATE KEY----- Private Key from JSON file ----END PRIVATE KEY-----"; 

    var sJWS = KJUR.jws.JWS.sign('RS256', sHeader, sClaim, key); 
    var urlEncodedData = ''; 
    var urlEncodedDataPairs = []; 
    var token; 
    urlEncodedDataPairs.push("grant_type" + '=' + "urn:ietf:params:oauth:grant-type:jwt-bearer"); 
    urlEncodedDataPairs.push("assertion" + '=' + sJWS); 
    urlEncodedData = urlEncodedDataPairs.join('&').replace(/%20/g,'+'); 

$(function(){ 
    $.ajax({ 
       type: "POST", 
       url: 'https://www.googleapis.com/oauth2/v3/token', 
       data: urlEncodedData, 
       dataType: 'JSON', 
       contentType: 'application/x-www-form-urlencoded', 
       success: function(result){ 
       console.log(JSON.stringify(result)); 
       } 
    }); 
}); 

ответ

1

Я нашел ответ на это некоторое время назад, но хотите разместить его здесь для получения разъяснений. Все в коде выше правильно. Предоставленный ключ SSH содержит несколько символов \n, которые действительны. У моего ключа была линия между -----BEGIN PRIVATE KEY----- и началом фактической строки ключа.

+0

Так что я должен удалить 25 экземпляров «\ n» в закрытом ключе? – Brad

+0

No Brad Вам не нужно их удалять. –