Google AppScript(GAS)是否支持O-Auth 2.0隐式授予类型

时间:2018-10-05 18:36:25

标签: authentication google-apps-script oauth-2.0 google-oauth gmail-addons

我正在尝试使用Google Apps脚本创建一个新的Gmail插件,并尝试访问第三方非Google API。为此,我使用O-Auth 2.0隐式授予类型进行身份验证。

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());
}

该脚本正确生成了一个包含我的redirect_uri
的URL 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]

哪个会导致此错误:

因为该网址由#分隔。如果我将#替换为?,那么它将按预期工作。

谁能告诉我如何解决此问题?如果不是,那么我是否必须为此目的授权代码授予流程?

注意:我已经将setParam('response_type', 'token')用于隐式授予类型

2 个答案:

答案 0 :(得分:2)

对于apps-script-oauth2 GitHub repo中的问题,您在Apps脚本中使用OAuth的特定实现(使用该库)不支持隐式授予。鉴于Apps脚本是在服务器(而不是客户端,隐式授予最有用的客户端)中执行的,因此您使用的库也不太可能会扩展以支持它。

答案 1 :(得分:1)

该库当前不支持隐式授予。 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和其他详细信息。 谢谢。 :)