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(范围)和不同的用户。
我有一个同事试图从头开始编写一个样本,他得到了同样的东西。
我认为您的问题是您在调用日历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没有被翻