Проблемы с авторизацией с использованием OAuth с помощью StackExchange API и скрипта приложений

Я пытаюсь получить доступ к StackExchange API, используя OAuth в скрипте Google Apps. Я использую эту библиотеку.

Когда я звоню ниже, у меня сначала нет доступа (что и ожидается). URL авторизации, который я регистрирую:

https://stackoverflow.com/oauth?client_id=14205&response_type=code&redirect_uri={URI}&state={STATE}&scope=read_inbox 

Вставив autorizationURL в свой браузер, я получаю страницу, на которой написано:

"Error: Token response not valid JSON: SyntaxError: Unexpected token: a (line 532, file "Service", project "OAuth2")"

Что я запускаю из скрипта приложений:

function getMentions() {
   var service = getStackExchangeService_();
   Logger.log(service.hasAccess());
   if (service.hasAccess()) {

     //get token and call API
   }
   else {
   Logger.log("App has no access yet.");

   // open this url to gain authorization from Stack Exchange
   var authorizationUrl = service.getAuthorizationUrl();

   Logger.log("Open the following URL and re-run the script: %s",
     authorizationUrl);
   }
 }

Моя страница Oauth.gs:

function getStackExchangeService_() {
  var CLIENT_ID = PropertiesService.getScriptProperties().getProperty('SE_CLIENT_ID');
  var CLIENT_SECRET = PropertiesService.getScriptProperties().getProperty('SE_CLIENT_SECRET');

  return OAuth2.createService('StackExchange')
  .setAuthorizationBaseUrl('https://stackoverflow.com/oauth')
  .setTokenUrl('https://stackoverflow.com/oauth/access_token')
  .setClientId(CLIENT_ID)
  .setClientSecret(CLIENT_SECRET)
  .setCallbackFunction('authCallbackSE')
  .setPropertyStore(PropertiesService.getUserProperties())
  .setRedirectUri('https://script.google.com/macros/d/{SCRIPT ID}/usercallback')
  .setScope('read_inbox');
}

function authCallbackSE(request) {
  var SEService = getStackExchangeService_();
  var isAuthorized = SEService.handleCallback(request);
  if (isAuthorized) {
    return HtmlService.createHtmlOutput('Success! You can close this tab.');
  } else {
    return HtmlService.createHtmlOutput('Denied. You can close this tab');
  }
}

Неясно, где я ошибаюсь, но я предполагаю, что меня перенаправят на страницу авторизации, когда я введу authorizationURL. Спасибо!


person poyter16    schedule 14.01.2019    source источник
comment
Попробуйте setTokenUrl('https://stackoverflow.com/oauth/access_token/json')   -  person TheMaster    schedule 15.01.2019
comment
Это сработало! Большое спасибо @TheMaster   -  person poyter16    schedule 15.01.2019


Ответы (1)


Проблема:

Stackexchange API по умолчанию отправляет токен доступа как application/x-www-form-urlencoded, а tokenFormat библиотеки OAuth2 по умолчанию ожидает JSON.

Решения:

  • Явно запросите api для JSON, установив для tokenUrl значение https://stackoverflow.com/oauth/access_token/json ИЛИ

  • Явно установите tokenFormat в библиотеке OAuth2 для формирования URL, закодированного с использованием setTokenFormat(TOKEN_FORMAT.FORM_URL_ENCODED)

Использованная литература:

person TheMaster    schedule 15.01.2019