当前位置: 首页 > 知识库问答 >
问题:

谷歌服务号不能冒充谷歌办公套件用户

孔礼骞
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}')

域范围的委派已打开。服务帐户客户端 ID 在 GSuite 中使用适当的作用域进行授权。

服务帐户适用于普通凭据。它只适用于委托凭证。

我在我们的域中尝试了不同的API(范围)和不同的用户。

我有一个同事试图从头开始编写一个样本,他得到了同样的东西。

共有1个答案

段干华晖
2023-03-14

我认为您的问题是您在调用日历API之前没有授权您的凭据,但您有几个差异,我在自己的实现中使用

>

  • 使用以下导入语句

    from oauth2client.service_account import ServiceAccountCredentials
    from apiclient import discovery
    

    使用< code > from _ JSON _ keyfile _ name 方法

    在构建服务时授权凭据并将其作为超文本传输协议参数传递

    尝试对您的代码进行此修改:

    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()
    

    我还建议在 API 调用中设置 calendarId=“主要”,以便始终返回当前为其委派凭据的用户的主日历。

    有关使用服务帐户凭据进行身份验证的详细信息,请参阅以下链接:http://oauth2client.readthedocs.io/en/latest/source/oauth2client.service_account.html

  •  类似资料:
    • 获取Marketplace应用程序的服务帐户授权时遇到问题 在发布我们的应用程序的过程中,我们需要两种类型的同意: 管理员代表所有用户(“https://www.googleapis.com/auth/userinfo.email、https://www.googleapis.com/auth/userinfo.profile”)对 SSO 的目录范围同意。 https://www.googlea

    • 我想访问一些谷歌api服务: < li>GDrive API < li >联系API < li >人员API 我正在使用oauth2模拟服务帐户流(您知道的:Google Oauth v2-服务帐户描述)。为了实现不健全化,您需要在Google应用程序控制台中应用“授权域范围权限”,下载相应的pk12文件,并在Google控制台项目中激活api。 目前我总是得到: 这是我的代码: 我还在stack

    • 我试图使用Spring Security(5.3.3. RELEASE)在Spring Boot应用程序中处理SAML2身份验证。Spring Boot应用程序是SP,谷歌办公套件将是IDP。 在我的Mavenpom.xml文件中,我有: 在我的代码中,我有: 问题是,我需要一个签名密钥,但行抛出一个异常,因为您必须将一个传递到该构造函数中,以便将其用于类型。但是,如果我使用该凭据进行验证,应用程

    • 我们有一个要求,我们应该提供能力上传文件多达100 GB的大小。当前的流程是将文件从客户端位置/本地系统放到应用服务器。然后,应用服务器将文件推送到Google Drive server中的服务帐户。我想知道是否有办法将文件从本地系统直接推送到Google Drive中的服务帐户。这将帮助我们不必在应用服务器中存储如此大的文件。有人对此有什么建议吗?

    • 当我在我的服务器上用wget、curl或python爬行谷歌搜索引擎时,我遇到了一个非常奇怪的问题。Google将我重定向到以[ipv4 | ipv6]开头的地址。谷歌。fr/抱歉/索引重定向。。。最后发送503错误,服务不可用。。。 有时抓取工作正常,有时不是在白天,我尝试了几乎所有可能的方法:强制ipv4/ipv6而不是主机名、引用者、用户代理、vpn、. com/. fr/、代理和tor,.

    • 最终解决方案 我只是个白痴。增加版本后的真正问题是,我已经应用了插件而不是在文件末尾。检查这个主题,我之前搜索得很糟糕 原始问题 我从来都不明白Gradle是怎么工作的,很抱歉问了一些愚蠢的问题。 我正面临一个问题,我不知道问题出在哪里,也不知道现在该怎么办。我有GCM的应用程序,一切都很好,直到我们添加了第二语言的应用程序。 然后我得到一个错误,即< code>google_app_id没有被翻