Google 服务帐户无法模拟 GSuite 用户
Google service account can't impersonate GSuite user
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
-
授权凭据并在构建服务时将其作为 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'
以便您始终 return 您当前已为其委派凭据的用户的主日历。
有关使用 ServiceAccountCredentials
进行身份验证的更多信息,请参阅以下 link:http://oauth2client.readthedocs.io/en/latest/source/oauth2client.service_account.html
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
授权凭据并在构建服务时将其作为
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'
以便您始终 return 您当前已为其委派凭据的用户的主日历。
有关使用 ServiceAccountCredentials
进行身份验证的更多信息,请参阅以下 link:http://oauth2client.readthedocs.io/en/latest/source/oauth2client.service_account.html