Подключение к API Google с помощью учетной записи службы и OAuth - PullRequest
1 голос
/ 26 мая 2019

Я использую среду, в которой нет встроенной поддержки клиентской библиотеки GCP.Поэтому я пытаюсь выяснить, как выполнить аутентификацию напрямую с помощью созданного вручную токена JWT.

Здесь я адаптировал задачи, используя тестовую среду nodeJS с jwa для реализации алгоритма.

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

Закрытый ключ берется из JSON-версии файла учетной записи службы.

Когда тест запускается, он обнаруживает очень простую ошибку 400, которая просто говорит «неверный запрос»,Я не уверен, как его устранить.

Может кто-нибудь помочь определить, что я делаю не так?

var assert = require('assert');
const jwa = require('jwa');
const request = require('request-promise');

const pk = require('../auth/tradestate-2-tw').private_key;

const authEndpoint = 'https://www.googleapis.com/oauth2/v4/token';


describe('Connecting to Google API', function() {

    it('should be able to get an auth token for Google Access', async () => {
      assert(pk && pk.length, 'PK exists');
      const header = { alg: "RS256", typ: "JWT" };
      const body = {
        "iss":"salesforce-treasury-wine@tradestate-2.iam.gserviceaccount.com",
        "scope":"https://www.googleapis.com/auth/devstorage.readonly",
        "aud":"https://www.googleapis.com/oauth2/v4/token",
        "exp": new Date().getTime() + 3600 * 1000,
        "iat": new Date().getTime()
      };
      console.log(JSON.stringify(body, null, 2));
      const encodedHeader = Buffer.from(JSON.toString(header)).toString('base64')
      const encodedBody = Buffer.from(JSON.toString(body)).toString('base64');
      const cryptoString = `${encodedHeader}.${encodedBody}`;
      const algo = jwa('RS256');
      const signature = algo.sign(cryptoString, pk);
      const jwt = `${encodedHeader}.${encodedBody}.${signature}`;
      console.log('jwt', jwt);
      const headers = {'Content-Type': 'application/x-www-form-urlencoded'};
      const form = {
        grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
        assertion: jwt
      };
      try { 
        const result = await request.post({url: authEndpoint, form, headers});
        assert(result, 'Reached result');
        console.log('Got result', JSON.stringify(result, null, 2));
      } catch (err) {
        console.log(JSON.stringify(err, null, 2));
        throw (err);
      }

    });
});

1 Ответ

1 голос
/ 26 мая 2019

Используйте JSON.stringify вместо JSON.toString.По ссылке в вашем вопросе:

{"alg": "RS256", "typ": "JWT"}

Это представление Base64url выглядит следующим образом:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9

При использовании кодировки JSON.toString () и base64 вы получите W29iamVjdCBKU09OXQ ==, которая объясняет, что вы не можете ничего сделать из-за недопустимого запроса 400, поскольку вы не можете ничего сделать, так как 400отправив его.

...