无法通过 IAP 授权访问 App Engine

lbl*_*lnd 5 google-app-engine oauth google-apps-script google-cloud-functions identity-aware-proxy

我目前已启动并运行 App Engine,并受 IAP 保护,我的最终目标是通过 Apps 脚本项目触发它。我已经在没有 IAP 的情况下测试了代码,它工作得很好。但是,当启用 IAP 时,我在成功授权访问它时遇到了困难。

我已将自己作为受 IAP 保护的 Web 应用程序用户(以及策略管理员)添加到 App Engine,但每当我尝试从 GSheets 应用程序脚本(我是所有者并且它与正确的 GCP 项目关联)触发它时(使用这个很好的解释作为指导)我得到以下信息:

“IAP 凭据无效:JWT 受众群体与此应用程序不匹配('aud' 声明 (1084708005908-bk66leo0dnkrjsh276f0rgeoq8ns87qu.apps.googleusercontent.com) 与预期值 (1084708005908-oqkn6pcj03c2pmdufkh0l7mh37f79po2.apps) 不匹配.googleusercontent.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);
}
Run Code Online (Sandbox Code Playgroud)

和清单文件:

{
  "timeZone": "Europe/London",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "oauthScopes": ["openid", "https://www.googleapis.com/auth/script.external_request"]
}
Run Code Online (Sandbox Code Playgroud)

对此的任何帮助都非常感谢!以前从未在这里发布过,但非常绝望,找不到任何人有这个确切的问题。

Ale*_*dro 3

考虑

您的解决方案的问题在于您正在使用自动生成的 Apps 脚本 OAuth 客户端的身份。此客户端不适合这种身份验证,此处是受支持的 OAuth 客户端的完整列表。

解决方案

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

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

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

重要提示:创建 OAuth 客户端时,请记下 ClientID 和客户端密码。另外,您还需要添加授权重定向 URI。这是使用OAuth2 GAS 库时的标准,它具有以下形式:https://script.google.com/macros/d/{Your Apps Script ID}/usercallback

现在您已拥有构建身份令牌所需的所有信息。在 Github 存储库中,有一个样板示例,它将涵盖 OAuth2 GAS 库的第一个编码步骤。

链接在这里。

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

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

参考

OAuth2 GAS 库

IAP 编程身份验证