有一个marketplace requirement如果 Google Apps for Work 域管理员为他们的域安装了我们的应用程序,则此后管理员和他们域中的任何用户在访问我们的应用程序时都不会看到范围授权屏幕。为域安装应用程序的行为应该隐式地为与我们的应用程序关联的服务帐户委派域范围的权限。
为了实现这种行为,我正在尝试做 delegation of authority to a service account代表(又名模拟)当前登录的用户工作。
下面的代码片段展示了我为让它发挥作用所做的各种尝试。唯一可行的方法是在创建 JWT 时将域 super 用户的电子邮件地址作为“子”参数(又名 prn)传递。但是,这实质上将常规运行的工厂域用户的权限提升为 super 用户的权限,这不是预期的效果。
var client = new googleapis.auth.JWT(
'<serviceaccount>@developer.gserviceaccount.com',
'localhost.pem',
null,
["https://www.googleapis.com/auth/admin.directory.user.readonly"],
// null - // 403 not auth
// {'userId' : 'domainsuperuser@email.com'} // 403 not auth
// {'userId' : 'me'} // 403 not auth
// "domainsuperuser@email.com" // works!
// "{domainsuperuser@email.com}" // not a valid email error
// 'me' // invalid impersonation prn email address
);
除了您要冒充的人的电子邮件地址(例如特殊的“我”值)之外,Google 是否会接受任何其他 ID?
感觉我们在这里遇到了先有鸡还是先有蛋的问题。本质上我们不想硬编码电子邮件地址(尤其是管理员电子邮件),所以感觉我们必须进行 API 调用。但是我们不能在不模拟用户的情况下进行 API 调用。
最佳答案
在这种情况下,您不需要使用服务帐户和域范围的委托(delegate)。相反,只需与用户一起完成正常的 OAuth2 流程,批准屏幕将自动跳过。
当管理员安装应用程序并批准您的范围时,他们基本上会自动授予您对域中所有用户访问这些范围的权限。虽然要求用户看不到批准屏幕,但您仍然必须与他们一起完成 OAuth2 流程才能获得 OAuth2 token 。如果您为用户启动 OAuth2 流程,并且不请求域管理员尚未批准的任何范围并且不在 URL 中设置 approval_prompt=force
,那么 OAuth2 批准屏幕将立即重定向到您的重定向 URI,使该过程对用户不可见。
关于google-api - 使用服务帐户和授权委托(delegate)调用 Google API 时模拟当前用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26518700/