Django oauth2 Google не работает на сервере
Я использую outh2 для аутентификации. Мне это нужно для Google Calendar V3 API. На localhost все работает нормально. Но когда я публикую его на сервере heroku, я получаю сообщение об ошибке приложения (на основании кода ошибки - тайм-аут - через 30 секунд). Я создал отдельный проект Google (для Google ID и секрет).
Вот мой код
import gflags
import httplib2
from apiclient.discovery import build
from oauth2client.file import Storage
from oauth2client.client import OAuth2WebServerFlow
from oauth2client.tools import run
FLAGS = gflags.FLAGS
def add_event(summary, location, dateTime_start, dateTime_end):
# Set up a Flow object to be used if we need to authenticate. This
# sample uses OAuth 2.0, and we set up the OAuth2WebServerFlow with
# the information it needs to authenticate. Note that it is called
# the Web Server Flow, but it can also handle the flow for native
# applications
# The client_id and client_secret are copied from the API Access tab on
# the Google APIs Console
FLOW = OAuth2WebServerFlow(
client_id='##########################',
client_secret='#######################',
scope='https://www.googleapis.com/auth/calendar',
user_agent='###########',
#access_type='offline'
)
# To disable the local server feature, uncomment the following line:
#FLAGS.auth_local_webserver = False
# If the Credentials don't exist or are invalid, run through the native client
# flow. The Storage object will ensure that if successful the good
# Credentials will get written back to a file.
storage = Storage('calendar.dat')
credentials = storage.get()
if credentials is None or credentials.invalid == True:
credentials = run(FLOW, storage)
# Create an httplib2.Http object to handle our HTTP requests and authorize it
# with our good Credentials.
http = httplib2.Http()
http = credentials.authorize(http)
# Build a service object for interacting with the API. Visit
# the Google APIs Console
# to get a developerKey for your own application.
service = build(serviceName='calendar', version='v3', http=http,
developerKey='###########################')
event = {
'summary': summary,
'location': location,
'start': {
'dateTime': dateTime_start, # '2011-06-03T10:00:00.000-07:00',
'timeZone': 'Europe/Ljubljana'
},
'end': {
'dateTime': dateTime_end, # '2011-06-03T10:25:00.000-07:00',
'timeZone': 'Europe/Ljubljana'
},
}
recurring_event = service.events().insert(calendarId='primary', body=event).execute()
return recurring_event['id']
Когда я вызываю add_event (summary, location, dateTime_start, dateTime_end) из моего представления о локальном хосте, все работает нормально (процесс аутентификации успешен, и событие добавляется в мой календарь). Но на сервере я получаю тайм-аут.
ОБНОВИТЬ:
Я должен, вероятно, сделать это как-то.. какие-то идеи?
Your browser has been opened to visit:
https://accounts.google.com/o/oauth2/auth?scope=.....
If your browser is on a different machine then exit and re-run this
--noauth_local_webserver
2 ответа
Похоже, ваше приложение пытается открыть браузер на сервере Heroku для выполнения потока OAuth2. Это объясняет, почему происходит сбой на сервере, но не на вашем компьютере.
Вместо того, чтобы использовать oauth2client.tools.run
Я бы посоветовал вам реализовать интеграцию с OAuth2 отдельно от add_event
,
Я решил свою проблему, как предложил Чао Вэй. Сначала я получаю URL, как это так
FLAGS = gflags.FLAGS
flow = OAuth2WebServerFlow(
client_id='##############3',
client_secret='###############',
scope='https://www.googleapis.com/auth/calendar',
user_agent='##############',
)
storage = Storage('calendar.dat')
credentials = storage.get()
if credentials is None or credentials.invalid == True:
oauth_callback = '*your_redirect_url*'
flow.redirect_uri = oauth_callback
url = flow.step1_get_authorize_url()
Я перенаправил пользователя на это. И когда он приходит к перенаправленному URL, я добавляю следующее событие:
FLAGS = gflags.FLAGS
flow = OAuth2WebServerFlow(
client_id='##############3',
client_secret='###############',
scope='https://www.googleapis.com/auth/calendar',
user_agent='##############',
)
if credentials is None or credentials.invalid == True:
oauth_callback = '*your_redirect_url*'
flow.redirect_uri = oauth_callback
flow.step1_get_authorize_url()
credential = flow.step2_exchange(code, http=None)
storage.put(credential)
credential.set_store(storage)
http = httplib2.Http()
http = credentials.authorize(http)
service = build(serviceName='calendar', version='v3', http=http,
developerKey='#############################')
event = {
'summary': summary,
'location': location,
'start': {
'dateTime': dateTime_start, # '2011-06-03T10:00:00.000-07:00',
'timeZone': 'Europe/Ljubljana'
},
'end': {
'dateTime': dateTime_end, # '2011-06-03T10:25:00.000-07:00',
'timeZone': 'Europe/Ljubljana'
},
}
recurring_event = service.events().insert(calendarId='primary', body=event).execute()
return ['id', recurring_event['id']]
Код может быть оптимизирован. Какой-то код повторяется.. но он работает:)