【发布时间】:2017-03-15 07:25:25
【问题描述】:
我想将我的 Google Apps 域中所有用户的签名设置为他们的姓名和职位。 通过我的研究,我发现做到这一点的唯一免费方法是使用 Gmail API。 通过使用https://developers.google.com/admin-sdk/directory/v1/quickstart/js 的快速入门指南,我设法获得了域中所有用户的列表(包含所需的信息、我想要设置签名的电子邮件地址、姓名、职位)。
在 listUsers 函数的末尾,我添加了 loadGmailApi 代码。 加载 api 后,它会运行一个名为 setSignatures 的函数。
function setSignatures() {
var request = gapi.client.gmail.users.settings.sendAs.update({
'userId': email,
'sendAsEmail': email,
'signature': '<strong style="color: rgb(230, 145, 56); font-family: arial, sans-serif; font-size: large;">' + name + '</strong>'
});
request.execute(function(resp) {
console.log(resp);
});
}
当变量“email”是我自己的时,这非常有效,但是当它是其他任何人时,我收到以下错误:403Delegation denied for 'myemail'。我是超级管理员。
我现在发现我需要使用服务帐户。 然后我完全按照本指南How to obtain Google service account access token javascript。 一个区别是授权我使用
gapi.auth.authorize({
而不是
gapi.analytics.auth.authorize({
因为我不需要分析 API。我希望这不会造成问题。我需要目录和 gmail API。 在上面链接中提供的代码的末尾,我像以前一样再次加载DirectoryApi() 并运行代码以再次获取所有用户信息。我什至无法设置签名,因为此时我收到一条错误消息:需要 401 登录。
因此,如果我使用自己的电子邮件尝试此操作,我会收到 403,而当我尝试服务帐户时,我会收到 401。它说需要登录,我该如何登录?我认为服务帐户实际上并没有登录,但我使用 JWT 来制作访问令牌。 我正在授权
gapi.auth.authorize({
'serverAuth': {'access_token': token},
'scope': 'https://www.googleapis.com/auth/admin.directory.user',
'client_id': 'myClientID'
});
我做错了什么?请帮忙。我需要知道如何“登录”或使用服务帐户进行身份验证,以便更新签名。
【问题讨论】:
-
您可能需要检查此document 中的所有要求,以验证您是否已完成执行 Google Apps 域范围授权授权所需的所有操作。 Gmail supports domain-wide delegation,如相关 SO 问题中所述。
-
但请注意,您需要授予该服务帐户对您的工作域的访问权限,并且只有有权访问 Admin API 的用户才能访问 Admin SDK Directory API,因此您的服务帐户需要模拟其中之一用户访问 Admin SDK Directory API。希望这会有所帮助。
标签: javascript gmail-api service-accounts google-directory-api