使用应用程序默认凭据使用服务帐户进行用户模拟

时间:2017-05-19 11:53:32

标签: google-app-engine go google-oauth2 admin-sdk

我正在尝试在使用Go的App Engine部署中使用具有域范围委派(DwD)的服务帐户。

我已按照使用Google Application Default Credentials使用App Engine的服务帐户的步骤进行操作。

我在我的开发机器上运行了本地代码,但我仍然坚持从我的域中检索实际数据。

我正在使用Admin SDK。在Delegate domain-wide authority to your service account部分下,它说我的“服务帐户需要冒充其中一个用户访问管理SDK目录API”。

我查看了Go使用服务帐户和用户模拟的文档,我也仔细阅读了源代码。它无处指示我可以输入用户的电子邮件地址/身份以进行冒充。

这是我得到的错误:

googleapi: Error 404: Domain not found., notFound

源代码确实显示了一些线索,但在尝试使用Application Default Credentials以外的其他内容时遇到了其他障碍。

有没有人有任何想法?提前谢谢。

2 个答案:

答案 0 :(得分:0)

对于Admin SDK,我需要要求用户(管理员)访问Directory API的权限。这与其他API完全不同,我只是设置用户电子邮件地址来访问指定用户的数据。

我认为这是可以理解的,因为Admin SDK是一个功能更强大的API,影响域而不仅仅是个人用户。

答案 1 :(得分:0)

今天遇到同样的问题,但使用三管齐下的OAuth2并不可行,因为我们不想使用API​​更改目录,而是检查签名用户的组成员身份通过App Engine用户API。

这导致我创建了这个库:https://github.com/iamacarpet/go-gae-dwd-tokensource

它创建一个支持模拟的自定义JWT,使用内置功能使用默认服务帐户对其进行签名,然后将其触发到令牌端点以获取access_token。

它不像获取访问令牌的默认函数那样高效,但在我的测试中,对于组成员身份检查,它是~20ms延迟与~450ms,所以这不是问题。

我已经在GitHub页面上的negroni中间件中包含了一个使用它的示例。