Как получить события 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', [])
Вернуться на верх