OAuth для примера Google API с помощью Python / Django

Я пытаюсь получить OAuth, работающий с Google API с помощью Python. Я попробовал различные библиотеки OAuth, такие как OAuth, oauth2 и djanog-oauth, но я не могу заставить его работать (включая обеспеченные примеры).

Для отладки OAuth я использую Детскую площадку OAuth Google, и я изучил API и документацию OAuth

С некоторыми библиотеками я борюсь с получением правильной подписи с другими библиотеками, я борюсь с преобразованием маркера запроса к авторизованному маркеру. Что действительно помогло бы мне, если кто-то может показать мне рабочий пример для Google API с помощью одной из вышеупомянутых библиотек.

Править: Мой начальный вопрос не привел ни к каким ответам, таким образом, я добавил свой код. Существует две возможных причины этого кода, не работающего:
1) Google не авторизовывает мой маркер запроса, но не совсем уверенный, как обнаружить это
2) Подпись для маркера доступа недопустима, но затем я хотел бы знать, который ожидает Google параметров OAuth, поскольку я могу генерировать надлежащую подпись в первой фазе.

Это записано с помощью oauth2.py и для Django следовательно HttpResponseRedirect.

REQUEST_TOKEN_URL = 'https://www.google.com/accounts/OAuthGetRequestToken'
AUTHORIZATION_URL = 'https://www.google.com/accounts/OAuthAuthorizeToken'
ACCESS_TOKEN_URL = 'https://www.google.com/accounts/OAuthGetAccessToken'

CALLBACK = 'http://localhost:8000/mappr/mappr/oauth/' #will become real server when deployed

OAUTH_CONSUMER_KEY = 'anonymous'
OAUTH_CONSUMER_SECRET = 'anonymous'

signature_method = oauth.SignatureMethod_HMAC_SHA1()
consumer = oauth.Consumer(key=OAUTH_CONSUMER_KEY, secret=OAUTH_CONSUMER_SECRET)
client = oauth.Client(consumer)

request_token = oauth.Token('','') #hackish way to be able to access the token in different functions, I know this is bad, but I just want it to get working in the first place :)

def authorize(request):
    if request.GET == {}:
        tokens = OAuthGetRequestToken()
        return HttpResponseRedirect(AUTHORIZATION_URL + '?' + tokens)
    elif request.GET['oauth_verifier'] != '':
        oauth_token = request.GET['oauth_token']
        oauth_verifier = request.GET['oauth_verifier']
        OAuthAuthorizeToken(oauth_token)
        OAuthGetAccessToken(oauth_token, oauth_verifier)
        #I need to add a Django return object but I am still debugging other phases.

def OAuthGetRequestToken():
    print '*** OUTPUT OAuthGetRequestToken ***'
    params = {
    'oauth_consumer_key': OAUTH_CONSUMER_KEY, 
    'oauth_nonce':  oauth.generate_nonce(),
    'oauth_signature_method': 'HMAC-SHA1',
    'oauth_timestamp': int(time.time()), #The timestamp should be expressed in number of seconds after January 1, 1970 00:00:00 GMT.
    'scope': 'https://www.google.com/analytics/feeds/',
    'oauth_callback': CALLBACK,
    'oauth_version': '1.0'
    }

    # Sign the request.
    req = oauth.Request(method="GET", url=REQUEST_TOKEN_URL, parameters=params)
    req.sign_request(signature_method, consumer, None)

    tokens =client.request(req.to_url())[1]
    params = ConvertURLParamstoDictionary(tokens)
    request_token.key  = params['oauth_token']
    request_token.secret =  params['oauth_token_secret']
    return tokens

def OAuthAuthorizeToken(oauth_token):
    print '*** OUTPUT OAuthAuthorizeToken ***'
    params ={
    'oauth_token' :oauth_token,
    'hd': 'default'
    }
    req = oauth.Request(method="GET", url=AUTHORIZATION_URL, parameters=params)
    req.sign_request(signature_method, consumer, request_token)
    response =client.request(req.to_url())
    print response #for debugging purposes

def OAuthGetAccessToken(oauth_token, oauth_verifier):
    print '*** OUTPUT OAuthGetAccessToken ***'
    params = {
    'oauth_consumer_key':  OAUTH_CONSUMER_KEY,
    'oauth_token': oauth_token,
    'oauth_verifier': oauth_verifier,
    'oauth_token_secret': request_token.secret,
    'oauth_signature_method': 'HMAC-SHA1',
    'oauth_timestamp': int(time.time()),
    'oauth_nonce': oauth.generate_nonce(),
    'oauth_version': '1.0',    
    }

    req = oauth.Request(method="GET", url=ACCESS_TOKEN_URL, parameters=params)
    req.sign_request(signature_method, consumer, request_token)

    response =client.request(req.to_url())
    print response
    return req

def ConvertURLParamstoDictionary(tokens):
    params = {}
    tokens = tokens.split('&')
    for token in tokens:
        token = token.split('=')
        params[token[0]] = token[1]

    return params

35
задан DrDee 18 February 2010 в 22:29
поделиться

5 ответов

У меня OAuth работает в приложении на python App Engine:

http://github.com/sje397/Chess

Приложение запущено по адресу:

http://your-move.appspot.com

6
ответ дан 27 November 2019 в 15:47
поделиться

Это может быть ответом.

При вызове OAuthGetRequestToken вы подписываете base_string своим consumer_secret, за которым следует & (амперсанд)

При вызове OAuthGetAccessToken вы подписываете base_string своим consumer_secret, за которым следует & (амперсанд), а затем token_secret.

Для OAuthGetRequestToken вы подписываете базовую_строку с помощью (consumer_secret + "&") и для OAuthGetAccessToken вы подпишите базовую строку с помощью (consumer_secret + "&" + token_secret)

http://hueniverse.com/2008/10/beginners-guide-to-oauth-part-iii-security-architecture/. В методах PLAINTEXT и HMAC-SHA1 общий секрет представляет собой комбинацию Consumer Secret и Token Secret.

2
ответ дан 27 November 2019 в 15:47
поделиться

Вы пробовали официальный api gdata python? Он поставляется с клиентом oauth и скрывает сложность вызовов oauth. http://code.google.com/p/gdata-python-client/

3
ответ дан 27 November 2019 в 15:47
поделиться

IIRC Google oauth не совсем соответствует стандарту, у вас есть , чтобы указать, какую услугу вы запрашиваете (см. Примеры в документации Google) в запросе в качестве дополнительного параметра, или это не сработает.

0
ответ дан 27 November 2019 в 15:47
поделиться

У Tornado есть рабочий код для Google oauth. Посмотрите здесь. аутентификация Google . Я использовал его и работал довольно хорошо из коробки. Все, что вам нужно сделать, это извлечь класс и аккуратно поместить его в представление django.

PS: Tornado использует асинхронный модуль для возврата пользователя. Поскольку вы используете django, вам нужно полагаться на некоторую переменную get, чтобы определить, что пользователь только что предоставил доступ к вашему приложению.

2
ответ дан 27 November 2019 в 15:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: