Получение действительного токена доступа Google для доступа к API Chrome Web Store извне Chrome Extension - PullRequest
0 голосов
/ 01 декабря 2018

У меня проблема с APis Google OAuth и Chrome.

Некоторый контекст , прежде чем начинать с технических вещей.

У меня есть популярное расширение Chrome, котороеобеспечивает внутриигровые покупки: при покупке предмета расширение становится «профессиональным», поэтому пределы использования расширяются.В прошлом году аудитория попросила меня сделать портирование на Firefox (благодаря недавно появившимся WebExtentions API ), и я начал поставлять обе версии.Версия Firefox не поддерживает покупку в приложении в данный момент, но люди начинают просить об этом (давайте подумаем, что версия FF является альфа-версией, поэтому не все функции гарантированно поддерживаются).

Проблема . Тем не менее, я не хочу внедрять вторичный платежный сервис с использованием API Google Pay или других подобных API, и мне бы хотелось, чтобы, если пользователь совершает покупку в приложении в Chrome, этопоставляется также на FF.

Надежда Решение : Я думал, что было бы легко использовать API Google Chrome Web Store .Создавая пользователя, авторизующего свою учетную запись Google из надстройки FF, я мог понять, был ли он платящим или нет, таким образом, включив или отключив «профессиональные» ограничения.

Вот шаги, которые я сделал.

Шаг 1 - Создайте новое приложение в облачной консоли Google (у меня уже есть приложение, используемое в расширении Chrome): Google Cloud Console ConfigurationИ включите API Chrome Web Store: Chrome Web Store APIs enablement

Шаг 2 - перейдите на консоль Firefox JS (внутри страницы параметровнадстройка, поэтому у меня включены все API-интерфейсы WebExtensions), и вызываю метод для получения действительного токена (код быстрый и грязный, не улучшен и записан просто как POC):

var scopes = ['https://www.googleapis.com/auth/plus.login',
   'https://www.googleapis.com/auth/chromewebstore.readonly'];
var url = 'https://accounts.google.com/o/oauth2/v2/auth?'
+ 'client_id=xxxxxxxx.apps.googleusercontent.com'
+ '&response_type=token'
+ '&scope='
    +encodeURIComponent(scopes.join(' '))
+ '&redirect_uri='
    +encodeURIComponent(browser.identity.getRedirectURL());
browser.identity.launchWebAuthFlow(
  {interactive: true, url: url})
  .then(function(result){
    console.log(result);
  })
  .catch(function(err){
    console.log(err);
  });

Используя функцию browser.identity.launchWebAuthFlow(), я получил действительный токен из возвращаемого результата (в строке запроса параметра access_token ).

Теперь я без проблем вызываю API-интерфейсы Chrome WebStore с помощью простого кода:

//access token
var token = 'previous_access_token';
//Google Chrome immutable Ext. ID from the store
var GOOGLE_CHROME_EXTENSION_ID = 'XXXXYYYYZZZ....'; 
//endpoint to get all purchased items (see https://developer.chrome.com/webstore/webstore_api/payments#resource)
var CWS_LICENSE_API_URL = 'https://www.googleapis.com/chromewebstore/v1.1/items/';
var req = new XMLHttpRequest();
req.open('GET', CWS_LICENSE_API_URL+ GOOGLE_CHROME_EXTENSION_ID + '/payments');
req.setRequestHeader('Authorization', 'Bearer ' + token);
req.onreadystatechange = function() {
  if (req.readyState == 4) {
    var license = JSON.parse(req.responseText);
    console.log(license);
  }
}
req.send();

К сожалению, это вообще не работает, появляется следующая ошибка: Chrome WebStore API access error (You don't have access to licensing data for App ID: xxxxyyyzzzzz)

У меня есть следующие доказательства:

  1. Если я использую токен, полученный из расширения Chrome с помощью chrome.identity.getAuthToken(), вызов в порядке
  2. Если я запускаю тот же скриптна странице параметров расширения Chrome я получаю ту же ошибку
  3. Определенный API Chrome WebStore действительно работает ( получить элементы API)

Я думаю,по какой-то причине API-интерфейсы Chrome WebStore недоступны с использованием токена, созданного вне определенного контекста (т. е. расширение вызова Chrome).

У кого-нибудь есть доказательства этого?Команда гугл ты там :)?

...