当前位置: 首页 > 面试题库 >

Google服务帐户无法模拟GSuite用户

冀冯浩
2023-03-14
问题内容
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 如果我不使用模拟,我可以读取事件,但不能邀请与会