【发布时间】:2016-03-27 02:56:15
【问题描述】:
我在我的 Google Apps 域上创建了一个服务帐户,启用了域范围的委派,并从我的域的控制面板在服务帐户的客户端 ID 上启用了完整的 gmail 和 pubsub API 范围。
我可以成功地实例化一个 gmail API 客户端并模拟一个域的帐户:
credentials = oauth2client.SignedJwtAssertionCredentials(secret['client_email'], secret['private_key'], ['https://www.googleapis.com/auth/gmail.modify'], sub='accountToImpersonate@domain.com')
http = httplib2.Http()
credentials.authorize(http)
return discovery.build('gmail', 'v1', http=http)
我正在尝试使用以下内容在模拟用户的帐户上设置推送通知 webhook。指定的主题名称有效。
request = {
'labelIds': ['INBOX'],
'topicName': 'projects/projectName/topics/topicName'
}
gmail.users().watch(userId='me', body=request).execute()
我在调用 watch 后收到以下错误:
<HttpError 400 when requesting https://www.googleapis.com/gmail/v1/users/me/watch?alt=json returned "Invalid developer ID">
调用其他 gmail API 方法(列表消息等)成功。
具有域范围委派的服务帐户是否能够在域用户的帐户上启用 gmail 推送通知 webhook?
【问题讨论】:
-
我已经尝试过了,是的,这是可能的。您是否在您的主题中授予了对 gmail 的访问权限?
-
您找到解决方案了吗?我遇到了完全相同的问题,
gmail-api-push@system.gserviceaccount.com确实被授予了我的主题的发布权限。 -
我不确定(还)是否要自己实现这个。但是,如果您首先冒充该用户,然后尝试使用该用户订阅该主题,他们似乎需要访问该主题。可能尝试而不是冒充他们,只使用服务帐户并提供实际的 userId 而不是说 userId="me"... 如
gmail.users().watch(userId='xxxxxxxxx', body=request).execute()
标签: google-api gmail-api google-api-python-client google-oauth