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
接通了。在GSuite中使用适当的作用域授权服务帐户客户端ID。
服务帐户适用于正常凭据。它仅不适用于委托凭据。
我尝试过不同的API(作用域)和我们域中的不同用户。
我有一位同事试图从零开始对一个样本进行编码,他得到了同样的东西。
发布于 2018-03-20 01:44:21
我认为您的问题是在调用日历API之前没有授权您的凭据,但是在我自己的实现中有一些不同之处
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()
我还建议在API调用中设置calendarId='primary'
,以便始终返回当前具有委派凭据的用户的主日历。
有关使用ServiceAccountCredentials
进行身份验证的更多信息,请参见以下链接:account.html
https://stackoverflow.com/questions/49374112
复制相似问题