Поддерживает ли Google AppScript (GAS) неявный тип предоставления O-Auth 2.0

Я пытаюсь создать новую надстройку Gmail с помощью скрипта Google Apps и пытаюсь получить доступ к стороннему API, не относящемуся к Google. Для этого я использую O-Auth 2.0 Implicit Grant-Type для аутентификации.

Вот как выглядит AuthService:

function getOAuthService() {
  return OAuth2.createService('Podio O-Auth')
    .setAuthorizationBaseUrl('Base Url')
    .setTokenUrl('Token Url')
    .setClientId('clientId')
    .setClientSecret('clientSecret')
    .setParam('redirect_uri', 'https://script.google.com/macros/d/' + scriptID + '/usercallback')
    .setScope('GLOBAL')
    .setCallbackFunction('authCallback')
    .setCache(CacheService.getUserCache())
    .setParam('response_type', 'token')
    .setParam('response_mode', 'query')
    .setParam('state', getStateToken('authCallback')) // function to generate the state token on the fly
    .setPropertyStore(PropertiesService.getUserProperties());
}

Скрипт правильно генерирует URL-адрес, который включает мой redirect_uri
Auth принимает запрос, генерирует токен и перенаправляет меня в домен scripts.google.com.

После нажатия scripts.google.com я перенаправляюсь на URL-адрес, который включает мой личный домен, например

https://script.google.com/a/macros/[custom-domain]/d/[script-id]/usercallback#access_token=[token]&expires_in=7200&token_type=Bearer&state=[state]&id_token=[token]

Что приводит к этой ошибке:

потому что URL-адрес фрагментирован на #. Если я заменю # на ?, он будет работать должным образом.

Кто-нибудь может сказать мне, как я могу исправить эту проблему? Если нет, то должен ли я для этой цели предоставить поток кода авторизации?

Примечание: я использовал setParam('response_type', 'token') для неявного типа предоставления


person Prateek Gupta    schedule 05.10.2018    source источник
comment
Вы можете получить дополнительную информацию, если спросите авторов OAuth2 библиотеки, которую вы используете. Можно было бы подумать, что если бы скрипт приложений не поддерживал неявное предоставление, библиотека OAuth2, написанная для скрипта приложений, аналогичным образом не включала бы неявное предоставление.   -  person tehhowch    schedule 06.10.2018
comment
@tehhowch OP сделал и уже получил ответ от авторов. Возможно, он ждет альтернативных ответов.   -  person TheMaster    schedule 06.10.2018


Ответы (2)


По вашему вопросу в apps-script-oauth2 репозитории GitHub, вашей конкретной реализации OAuth в скрипте приложений (использующем эту библиотеку) не поддерживает неявное предоставление. Учитывая, что скрипт приложений выполняется на сервере (а не на клиенте, где неявное предоставление является наиболее полезным), маловероятно, что используемая вами библиотека также будет расширена для его поддержки.

person tehhowch    schedule 06.10.2018

В настоящее время библиотека не поддерживает неявные гранты. Google AppScript поддерживает поток на стороне сервера. Итак, я установил response_type = code, и это работающая служба авторизации выглядит так:

function getOAuthService() {
  return OAuth2.createService('Podio O-Auth')
    .setAuthorizationBaseUrl('Base Url')
    .setTokenUrl('Token Url')
    .setClientId('clientId')
    .setClientSecret('clientSecret')
    .setParam('redirect_uri', 'https://script.google.com/macros/d/' + scriptID + '/usercallback')
    .setScope('GLOBAL')
    .setCallbackFunction('authCallback')
    .setCache(CacheService.getUserCache())
    .setParam('response_type', 'code')
    .setParam('response_mode', 'query')
    .setParam('state', getStateToken('authCallback')) // function to generate the state token on the fly
    .setPropertyStore(PropertiesService.getUserProperties());
}

Сначала он внутренне вызывает autorizatiionBaseUrl и получает код авторизации. И с этим кодом авторизации он снова отправляет почтовый запрос в TokenUrl, чтобы получить auth_token, refresh_token и другие детали. Спасибо. :)

person Prateek Gupta    schedule 31.10.2018