Google 日历 API: 使用户能够使用自己的帐户发出请求

Google Calendar API: enable the user to make request with their own account

我正在使用 django-allauth 在我的应用程序中启用 Google 登录。 我已经配置好一切,登录正常!

但是当我尝试向 Calendar API 发出请求(使用我自己的凭据)时,它会给我:

Request had insufficient scopes

我觉得很奇怪,用户应该可以访问自己的日历!

这是我尝试设置凭据的方式:

google.py

from allauth.socialaccount.models import SocialToken, SocialApp
from google.oauth2.credentials import Credentials
from google.auth.transport.requests import Request

SCOPES = ['https://www.googleapis.com/auth/calendar']

def get_credentials(user):
  token = SocialToken.objects.get(account__user=user, account__provider='google')
  social_app = SocialApp.objects.get(provider='google')
  creds = Credentials(
    token=token.token,
    refresh_token=token.token_secret,
    token_uri='https://oauth2.googleapis.com/token',
    client_id=social_app.client_id,
    client_secret=social_app.secret,
    scopes=SCOPES
  )

  if not creds or not creds.valid:
    if creds and creds.expired and creds.refresh_token:
      creds.refresh(Request())

  return creds

这是我用来发出请求的代码:

def search_calendar(request, event_name):
  user = request.user
  creds = get_credentials(user)

  service = build('calendar', 'v3', credentials=creds)

  now = datetime.datetime.utcnow().isoformat() + 'Z'
  events_result = service.events().list(calendarId=user.email, timeMin=now,
                                      maxResults=10, singleEvents=True,
                                      orderBy='startTime').execute()

  events = events_result.get('items', [])

  if not events:
    return HttpResponseNotFound('No events found!')

  correspondent_event = {}
  print('Looking for an event named %s...' %event_name)
  for e in events:
    try:
      event_matches = re.search(event_name, e['summary'], flags=re.IGNORECASE)
      if event_matches:
        print(request.user.username, 'found %s!' %e['summary'])
        correspondent_event = {
          'name': e['summary'],
          'start': date.iso_to_datetime(e['start'].get('dateTime', e['start'].get('date'))),
          'end': date.iso_to_datetime(e['end'].get('dateTime', e['end'].get('date')))
        }

        break
    except AttributeError:
      pass

  if not correspondent_event:
    print('No correspondent events found!')
    return HttpResponseNotFound('No correspondent events found!')

  return JsonResponse(data={'event': correspondent_event})

请帮忙!

我想通了!

在尝试了一千种不同的方法后,答案变得非常简单!

我只需要在 SOCIALACCOUNT_PROVIDERS 设置中添加我需要的范围:

settings.py

SOCIALACCOUNT_PROVIDERS = {
  'google': {
    'SCOPE': [
      'profile',
      'email',
      'https://www.googleapis.com/auth/calendar.events.readonly'
    ],
    'AUTH_PARAMS': {
      'access_type': 'online',
    }
  }
}