Как получить события Google-календаря с помощью маркера доступа
Я создал приложение django, которое включает в себя логин google Oauth2.0. Я хочу получить события календаря google для каждого пользователя, когда он входит в систему с помощью Oauth2.0, и я написал следующий код. Я сохранил токен доступа в таблице UserAuth и извлек его, затем использовал его для получения календаря google.
def get_events_server(request):
user = User.objects.get(username=request.user)
creds = UserAuth.objects.get(user=user).google_id_token
credentials = AccessTokenCredentials(creds, "")
http = httplib2.Http()
http = credentials.authorize(http)
service = build('calendar', 'v3', http=http)
return service
Когда я запускаю код, происходит следующая ошибка.
HttpError at /calendar/
<HttpError 403 when requesting https://www.googleapis.com/calendar/v3/calendars/primary/events?timeMin=2021-10-28T04%3A33%3A08.956703Z&timeMax=2021-11-04T04%3A33%3A08.956712Z&singleEvents=true&timeZone=GMT%2B9%3A00&orderBy=startTime&alt=json returned "Request had insufficient authentication scopes.". Details: "[{'message': 'Insufficient Permission', 'domain': 'global', 'reason': 'insufficientPermissions'}]">
Есть ли решение, чтобы пропустить эту проблему?
Вы немного запутались, давайте начнем с разницы между авторизацией и авторизацией.
Аутентификация или Open Id connect - это вход, когда вы позволяете пользователю войти в свой аккаунт google, и вы получаете id-токен обратно и можете получить доступ к информации его профиля, потому что пользователь вошел в систему. Вы проверяете, что пользователь, который находится за машиной, владеет аккаунтом. В своем коде посмотрите id_token, который вы используете Open id connect для аутентификации пользователя.
creds = UserAuth.objects.get(user=user).google_id_token
Для доступа к частным данным пользователя ваше приложение должно быть авторизовано для доступа к этим данным. Авторизация определяется диапазонами, или областью доступа, которая вам необходима. Для использования google calendar api вам понадобится токен доступа с областью, которая даст вам разрешение на доступ к событиям google calendar пользователя
Вам стоит взглянуть на Python quickstart for google calendar там показано, как использовать Oauth2, чтобы ваше приложение запрашивало авторизацию у пользователя для доступа к его данным google calendar.
def main():
"""Shows basic usage of the Google Calendar API.
Prints the start and name of the next 10 events on the user's calendar.
"""
creds = None
# The file token.json stores the user's access and refresh tokens, and is
# created automatically when the authorization flow completes for the first
# time.
if os.path.exists('token.json'):
creds = Credentials.from_authorized_user_file('token.json', SCOPES)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
# Save the credentials for the next run
with open('token.json', 'w') as token:
token.write(creds.to_json())
service = build('calendar', 'v3', credentials=creds)
# Call the Calendar API
now = datetime.datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time
print('Getting the upcoming 10 events')
events_result = service.events().list(calendarId='primary', timeMin=now,
maxResults=10, singleEvents=True,
orderBy='startTime').execute()
events = events_result.get('items', [])