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',
}
}
}
我正在使用 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',
}
}
}