У меня проблема с 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): И включите API Chrome Web Store:
Шаг 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();
К сожалению, это вообще не работает, появляется следующая ошибка: (You don't have access to licensing data for App ID: xxxxyyyzzzzz
)
У меня есть следующие доказательства:
- Если я использую токен, полученный из расширения Chrome с помощью
chrome.identity.getAuthToken()
, вызов в порядке - Если я запускаю тот же скриптна странице параметров расширения Chrome я получаю ту же ошибку
- Определенный API Chrome WebStore действительно работает ( получить элементы API)
Я думаю,по какой-то причине API-интерфейсы Chrome WebStore недоступны с использованием токена, созданного вне определенного контекста (т. е. расширение вызова Chrome).
У кого-нибудь есть доказательства этого?Команда гугл ты там :)?