from google.oauth2 import service_account
import googleapiclient.discovery
SCOPES = ['https://www.googleapis.com/auth/calendar']
SERVICE_ACCOUNT_FILE = 'GOOGLE_SECRET.json'
credentials = service_account.Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE, scopes=SCOPES)
delegated_credentials = credentials.with_subject('address@example.com')
google_calendar = googleapiclient.discovery.build('calendar', 'v3', credentials=delegated_credentials)
events = google_calendar.events().list(
calendarId='address@example.com',
maxResults=10
).execute()
上述代码的结果是:
google.auth.exceptions.RefreshError: ('unauthorized_client: Client is unauthorized to retrieve access tokens using this method.', '{\n "error" : "unauthorized_client",\n "error_description" : "Client is unauthorized to retrieve access tokens using this method."\n}')
Domain-wide delegation
开启。服务帐户客户ID已在GSuite中使用适当的范围进行了授权。
该服务帐户可用于普通凭据。它仅不适用于委托凭证。
我在我们的域中尝试了不同的API(作用域)和不同的用户。
我有一个同事尝试从头开始编写示例,他得到了同样的东西。
我认为您的问题是,在调用Calendar
API
之前,您没有对凭据进行授权,但是我在自己的实现中使用了一些区别
使用以下导入语句
from oauth2client.service_account import ServiceAccountCredentials
from apiclient import discovery
使用from_json_keyfile_name
方法
授权凭证,并http
在构建服务时将其作为参数传递
尝试对您的代码进行此修改:
from apiclient import discovery
from oauth2client.service_account import ServiceAccountCredentials
import httplib2
SCOPES = ['https://www.googleapis.com/auth/calendar']
SERVICE_ACCOUNT_FILE = 'GOOGLE_SECRET.json'
credentials = ServiceAccountCredentials.from_json_keyfile_name(
SERVICE_ACCOUNT_FILE, scopes=SCOPES)
# Use the create_delegated() method and authorize the delegated credentials
delegated_credentials = credentials.create_delegated('address@example.com')
delegated_http = delegated_credentials.authorize(httplib2.Http())
google_calendar = discovery.build('calendar', 'v3', http=delegated_http)
events = google_calendar.events().list(
calendarId='address@example.com',
maxResults=10
).execute()
我也建议calendarId='primary'
您在API调用中进行设置,以便始终返回当前为其委派了凭据的用户的主日历。
有关使用进行身份验证的更多信息,ServiceAccountCredentials
请参见以下链接:http
:
//oauth2client.readthedocs.io/en/latest/source/oauth2client.service_account.html
目标是在G-Suite平台中建立一个服务帐户,应用程序可以使用该帐户执行操作,而无需提示用户进行身份验证。 我们遇到的问题与下面的帖子非常相似,但略有不同。 只要我们遵循“模拟”流程,事情就会正常进行。使用模拟,授权规则遵循被模拟的用户。理想情况下,我们希望相应地作用于服务帐户,而不是模拟用户。当我们这样做时,我们经常收到403。 我们已经尽力按照这里的指示去做了: 我们的Java片段与此类似:
我们正在整合谷歌日历和我们的房间预订系统。GSuite域中的用户应该登录我们的预订屏幕并预订房间。到目前为止,我使用了一个具有域范围委托的服务帐户来模拟用户(< code>setSubject()方法,传递被模拟用户的电子邮件地址)。一切都正常,尽管这样我们无法验证我们想要模拟的用户是否成功登录,事件将只是以他作为组织者来创建,因为setSubject()只需要电子邮件正常工作。在IBM Domi
问题内容: 我想访问一些Google API服务: GDrive API 联系API 人物API 而且,我正在努力模拟oauth2模拟服务帐户流程(您知道一个:Google Oauth v2- 服务帐户说明。要进行模拟,您需要在google应用控制台中应用“委派域范围的授权”,请下载相应的pk12文件并在Google控制台项目中激活api。 此刻我总是得到: 这是我的代码: 我还通过stackov
根据留档 GSuite Marketplace应用程序OAuth Web服务器应用程序离线访问 网络服务器应用程序可以由域的管理员通过 OAuth 授予域访问权限。对于其他域用户模拟,可以使用服务帐户。 在我的设置中,我有 > 启用了管理员 Gmail 市场 SDK 市场 API 的 Web 服务器应用。 Web服务器应用程序凭据可用。 提供具有域范围授权和凭据的服务帐户。 对于步骤 获取 Web
我想查询GSuite Admin SDK Directory API,以返回Go中组中的所有用户,并作为GCP服务帐户进行身份验证(该脚本将在Google Compute Engine VM中执行或作为Google Cloud函数执行)。 我使用的服务帐户(我们称之为 )在GSuite中被授予了必要的作用域: 我还有一个GSuite管理帐户(我们称之为 我能够用以下代码返回一个组中的所有用户(基于
我试图实现与谷歌服务号的用户模拟,一直有一段时间的问题,这是我在Java使用的代码: 当我尝试从共享日历中读取事件时,我收到以下身份验证错误: com.google.api.client.auth.oauth2.TokenResponseException: 401未经授权的邮政https://oauth2.googleapis.com/token 如果我不使用模拟,我可以读取事件,但不能邀请与会