Django oauth2谷歌不在服务器上工作

时间:2013-05-06 10:09:18

标签: django google-calendar-api google-oauth

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

2 个答案:

答案 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']]

可以优化代码。有些代码在重复......但它正在工作:)