Ошибка аутентификации учетной записи службы для доступа к API Google API (для информации о покупке в приложении)

Мы готовим триггер Firebase для обработки уведомлений разработчиков Android в режиме реального времени, и нам нужно использовать Google Play Developer API, чтобы понять детали подписок пользователей. Таким образом, мы привязали учетную запись службы firebase в Google Play Console, а также предоставили необходимый доступ.

Мы использовали библиотеку google nodejs для googleapis (ссылка на github) и написали фрагмент кода как это:

return google.auth.getClient({
  keyFile: path.join(__dirname, './service-account.json'),
  scope: 'https://www.googleapis.com/auth/androidpublisher'
}) .then((client) => {
  const androidpublisher = google.androidpublisher({
    version: 'v3',
    auth: client
  });
  const params = {
    packageName: ANDROID_PACKAGE_NAME,
    subscriptionId: ANDROID_SUBSCRIPTIONID,
    token: token
  };
  return androidpublisher.purchases.subscriptions.get(params)
  .then(res => {
    console.log(`The response is ${res.data}`);
    return null;
  })
  .catch(error => {
    console.error(error);
  });
});

Но он возвращает нам сообщение об ошибке: «Неверные учетные данные», из-за чего я немного растерялся. Я протестировал использование curl этого API с токеном авторизации, и он также показывает ответ об ошибке 401.

Я не уверен, что мой поток выше правильный, может ли кто-нибудь дать мне какие-либо предложения?


comment
Неверные учетные данные обычно означают, что используемый вами идентификатор клиента не соответствует используемому вами ключу. попробуйте снова загрузить файл serviceaccount.json. Вы уверены, что сервисные аккаунты работают с этим API?   -  person DaImTo    schedule 23.08.2018
comment
@DaImTo Это было первое, что пришло нам на ум в прошлый раз. Мы попытались загрузить снова и даже создали другую учетную запись службы и проверили, но, похоже, проблема не решается.   -  person Yuyun Zhou    schedule 24.08.2018
comment
Вы уверены, что используемый вами код предназначен для сервисного аккаунта, а не для Oauth2? Типы клиентов различаются, как и код для их использования.   -  person DaImTo    schedule 24.08.2018
comment
Да, это для сервисного аккаунта. Итак, этот код находится в firebase, как облачная функция с триггером pubsub, где уведомление pubsub было успешно получено, когда была покупка в приложении, а затем мы получили имя пакета, идентификатор подписки и токен, попытались пройти аутентификацию для запроса Google Play для получения дополнительной информации, и именно здесь он терпит неудачу.   -  person auspicious99    schedule 20.09.2018


Ответы (1)


С JWT от google-auth-library. пример Google

const googleapis = require('googleapis');
const { JWT } = require('google-auth-library');
const serviceAccount = require('./serviceAccountKey.json');

const getAuthorizedClient = () => new JWT({
    email: serviceAccount.client_email,
    key: serviceAccount.private_key,
    scopes: ['https://www.googleapis.com/auth/androidpublisher']
});

const getAndroidpublisher = () => googleapis.google.androidpublisher({
    version: 'v3',
    auth: getAuthorizedClient()
});

const requestProductValidation = data => new Promise((resolve, reject) => {
    getAndroidpublisher().purchases["products"].get(data, (err, response) => {
        if (err) {
            console.log(`The API returned an error: ${err}`);
            resolve({status: "Error"});
        } else {
            const isValid = response && response.data && response.data.purchaseState === 0;
            resolve({status: isValid ? "OK" : "Error"});
        }
    });
});

exports.purchaseValidationAndroid = functions.https.onCall((data, context) => {
    return requestProductValidation(data);
});

data содержит productId, token и packageName

person evgen shein    schedule 20.01.2019
comment
Можете ли вы подробное содержание данных? спасибо - person cmii; 05.12.2019