我正在使用outh2进行身份验证。我需要谷歌日历v3 api。在localhost上一切正常。但是当我在heroku服务器上发布它时,我得到应用程序错误(基于错误代码是超时 - 30秒后)。我创建了separeted谷歌项目(谷歌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']
当我从localhost上的视图调用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
答案 0 :(得分:0)
看起来您的应用尝试在Heroku服务器上打开浏览器来执行OAuth2流程。这就解释了为什么它在服务器上失败了,但在你的机器上失败了。
我建议您从oauth2client.tools.run
单独实施OAuth2集成,而不是使用add_event
。
答案 1 :(得分:0)
我像赵伟建议的那样解决了我的问题。首先,我这样回复网址
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()
我将用户重定向到了那个。当他来到重定向的网址时,我添加了这样的事件:
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']]
可以优化代码。有些代码在重复......但它正在工作:)