无法通过IAP授权访问App Engine

时间:2020-06-29 09:46:14

标签: google-app-engine google-apps-script oauth google-cloud-functions identity-aware-proxy

我目前已启动并运行受IAP保护的App Engine,我的最终目标是由Apps Script项目触发此操作。我已经在没有IAP的情况下测试了代码,并且效果很好。但是,启用IAP时,成功授权访问它会遇到困难。

我已经将自己作为受IAP保护的Web App用户(以及Policy Admin)添加到App Engine,但是每当我尝试从GSheets Apps脚本触发时(我是所有者,并且该脚本与正确的GCP项目(以this great explanation为指导),我得到以下信息:

“无效的IAP凭据:JWT受众与该应用程序不匹配('aud'声明(1084708005908-bk66leo0dnkrjsh276f0rgeoq8ns87qu.apps.googleusercontent.com)与预期值不匹配(1084708005908-oqkn6pcj03c2pmdufkh0l2mcontent.apps79.com)。 “

我尝试向我的帐户添加/删除各种权限,以及创建新的Apps脚本并重新添加到项目中,但无济于事。从CLI触发时,我遇到了同样的问题,因此,我可以肯定这是身份验证方面的问题,但是如果有帮助,这是我的Apps脚本代码:

function test() {
  const options = {
    headers: {'Authorization': 'Bearer ' + ScriptApp.getIdentityToken()},
    muteHttpExceptions: true
  }
  var result = UrlFetchApp.fetch('https://APP-ENGINE-URL.appspot.com', options);
  Logger.log(result);
}

清单文件:

{
  "timeZone": "Europe/London",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "oauthScopes": ["openid", "https://www.googleapis.com/auth/script.external_request"]
}

对此有任何帮助,我们深表感谢!以前从未在这里发布过,但是非常绝望,无法在SO上找到任何遇到此确切问题的人。

1 个答案:

答案 0 :(得分:2)

注意事项

解决方案的问题是您使用的是自动生成的OAuth Client for Apps Script的身份。此客户端不适合这种身份验证,here受支持的OAuth客户端的完整列表。

解决方案

为了完成验证,您将需要一个额外的步骤。您将必须创建另一个OAuth客户端,并使用其凭据构建身份令牌。

为了使事情变得容易,我建议使用以下Apps脚本库:https://github.com/gsuitedevs/apps-script-oauth2

链接文档中介绍了初始设置。

重要:创建OAuth客户端时,请注意ClientID和客户端机密。另外,您将需要添加授权重定向URI 。这是使用OAuth2 GAS library时的标准配置,其格式为:https://script.google.com/macros/d/{Your Apps Script ID}/usercallback

现在,您拥有构建身份令牌的所有必要信息。 Github存储库中有一个样板样本,将介绍OAuth2 GAS库的最初编码步骤。

Here是链接。

将此代码复制到您的Apps Script项目中,然后按照注释中的说明进行操作。您将需要添加一个额外的OAuth范围:"https://www.googleapis.com/auth/userinfo.email"

一旦使用OAuth客户端信息设置了所有常量,就应该从Apps脚本编辑器运行run()函数。这将记录您必须在浏览器中打开以授权您的应用程序的URL。一旦授权了该应用程序再次运行run()功能,您将成功访问受IAP保护的应用程序。

参考文献

OAuth2 GAS library

IAP programmatic authentication