Использование Google OAuth на локальном хосте

Я начал использовать OAuth с Python и Django. Мне это нужно для API Google. Я работаю на локальном хосте, поэтому не могу зарегистрировать домен для обратного вызова. Я читал о том, что Google OAuth можно использовать с анонимным доменом. Не могу найти, как и где это можно сделать?

Редактировать:

у меня такое представление:

def authentication(request):
    CONSUMER_KEY = 'xxxxx'
    CONSUMER_SECRET = 'xxxxx'
    SCOPES = ['https://docs.google.com/feeds/', ]

    client = gdata.docs.client.DocsClient(source='apiapp')
    oauth_callback_url = 'http://%s/get_access_token' % request.META.get('HTTP_HOST')
    request_token = client.GetOAuthToken(
      SCOPES, oauth_callback_url, CONSUMER_KEY, consumer_secret=CONSUMER_SECRET)
   domain = '127.0.0.1:8000'
   return HttpResponseRedirect(
        request_token.generate_authorization_url(google_apps_domain=domain))

И эта ошибка:

К сожалению, вы попали на страницу входа в домен, в котором не используются Службы Google. Пожалуйста, проверьте веб-адрес и повторите попытку.

Зарегистрировано через https://code.google.com/apis/console/.

Редактировать:

CONSUMER_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxx'
CONSUMER_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxx'
SCOPES = ['https://docs.google.com/feeds/', ]
DOMAIN = 'localhost:8000'


def authentication(request):    
    client = gdata.docs.client.DocsClient(source='apiapp')
    oauth_callback_url = 'http://%s/get_access_token' % DOMAIN

    request_token = client.GetOAuthToken(SCOPES,
                                     oauth_callback_url,
                                     CONSUMER_KEY,
                                     consumer_secret=CONSUMER_SECRET)

    return HttpResponseRedirect(
        request_token.generate_authorization_url())


def verify(request):
    client = gdata.docs.client.DocsClient(source='apiapp')
    f = open('/home/i159/.ssh/id_rsa')
    RSA_KEY = f.read()
    f.close()

    oauth_callback_url = 'http://%s/get_access_token' % DOMAIN

    request_token = client.GetOAuthToken(SCOPES,
                                     oauth_callback_url,
                                     CONSUMER_KEY,
                                     rsa_private_key=RSA_KEY)
    return HttpResponseRedirect(
        request_token.generate_authorization_url(google_apps_domain=DOMAIN))

Ошибка:

Не удалось получить токен запроса OAuth: 400, у потребителя нет сертификата: xxxxxxxxxxxxxxx.apps.googleusercontent.com


person I159    schedule 02.10.2011    source источник


Ответы (3)


Просто для ясности: вы можете использовать поток веб-приложений с локальным хостом при разработке на OAuth 1.0 или OAuth 2.0. OAuth 2.0 следует предпочесть, так как это механизм, на котором мы сосредоточены. Пользовательский опыт для OAuth 2.0 будет значительно лучше.

Ничто не мешает вам использовать localhost в качестве URL-адреса обратного вызова. Я делаю это сам все время. Вам просто нужно убедиться, что URL-адрес обратного вызова точно совпадает, включая любые номера портов, и вы не можете развернуть свое приложение таким образом по очевидным причинам. Установленные приложения более сложны, но если вы что-то делаете с Django, можно воспользоваться тем фактом, что OAuth 2.0 — это система токенов-носителей. Пока вы храните токен обновления на стороне сервера, вы можете внеполосно пройти аутентификацию в собственном приложении, а затем отправить токен носителя в установленное приложение. У вашего установленного приложения будет примерно час, в течение которого вы можете совершать звонки, прежде чем вам нужно будет повторить процесс. В большинстве случаев это может происходить незаметно для пользователя. Передача токена-носителя должна происходить по зашифрованному каналу.

person Bob Aman    schedule 03.10.2011
comment
Боб, я ценю твое внимание к моей проблеме. Я перешел на один шаг в своей проблеме с советом @Stanpol. Но у меня все еще есть эта проблема, /get_access_token/?oauth_verifier= у меня есть ошибка: У потребителя нет сертификата... Я внес изменения в свой вопрос, состоящий из последнего кода. Я был бы очень благодарен за пример кода, как вы это делаете, так как Google немного сбивает меня с толку. - person I159; 03.10.2011
comment
Вы пробовали играть с OAuth Playground? Это может помочь вам лучше понять, как работает OAuth 1. - person Bob Aman; 04.10.2011
comment
И просто для ясности: вы не можете управлять доменом localhost, потому что он недоступен из инструмента управления доменами, куда вы должны загрузить сертификат X.509. Домен должен быть проверен, прежде чем вы сможете загрузить для него сертификат, а это невозможно сделать с помощью localhost. Это еще одна причина, по которой вам следует использовать OAuth 2. Я считаю, что OAuth 1 можно использовать только с локальным хостом, если вы используете метод подписи HMAC-SHA1. Если вам абсолютно необходимо использовать OAuth 1, вам потребуется переключить метод подписи. - person Bob Aman; 04.10.2011

OAuth 1.0 для установленных приложений

Кроме того, вы, вероятно, не захотите включать свои фактические CONSUMER_KEY и CONSUMER_SECRET в код примера.

person Cody Hess    schedule 02.10.2011
comment
+1 за ваш хороший совет о том, что НЕ включать в пример кода. Я думал, что OAuth 2.0 теперь является стандартом, но я предполагаю, что он все еще является экспериментальным в этом контексте, основываясь на вашем ответе? - person Ellie Kesselman; 03.10.2011
comment
Да, ты прав, @Cody Hess. Я только что прочитал это stackoverflow.com/questions/5408971/ и многое другое во всех группах Google. OAuth 1.0 — это путь на данный момент. - person Ellie Kesselman; 03.10.2011
comment
@FeralOink В документации 2.0 также упоминаются установленные приложения со специальным URL-адрес перенаправления, но есть грубость, когда вашему пользователю приходится копировать-вставлять токен доступа из окна браузера. - person Cody Hess; 03.10.2011
comment
Я работаю в Google. Пожалуйста, используйте OAuth 2.0, а не OAuth 1.0. Наша реализация OAuth 2.0 активно поддерживается и в настоящее время является лучшим способом авторизации в Google API. Не позволяйте тегу Experimental в API вас запугать. См. документы для различных потоков приложений, которые мы поддерживаем в OAuth 2.0: code.google. com/apis/accounts/docs/OAuth2.html - person Bob Aman; 03.10.2011
comment
@BobAman Важно, чтобы вы упомянули об этом. Я думал, что тег Experimental в OAuth 2.0 означает, что он не готов для общего использования, и что OAuth 1.0 является стандартом де-факто. СПАСИБО за уточнение! Я внесу соответствующие изменения в сообщение, которое я написал об этом gooplex.wordpress.com /2011/03/07/ - person Ellie Kesselman; 06.10.2011
comment
@FeralOink Experimental на самом деле просто означает, что могут произойти критические изменения, но даже в этом случае это не будет обычным явлением. Преимущества OAuth 2.0 здесь значительно перевешивают риски. Однако, чтобы уточнить, Experimental и Labs не так уж сильно отличаются. «Экспериментальный» просто означает, что на самом деле нет никаких официальных обещаний о надежности, доступности или критических изменениях. Но это Гугл. Наши эксперименты часто являются предпочтительным способом ведения дел. :-) - person Bob Aman; 06.10.2011

Попробуйте свой код без аргументов:

return HttpResponseRedirect(request_token.generate_authorization_url())
person Stanpol    schedule 02.10.2011
comment
Я попробовал твой совет. Google запросил разрешение на доступ к документам. Это я думаю. И теперь Google перенаправил меня на 127.0.0.1:8000/get_access_token?oauth_verifier=.. Это ошибка для меня сейчас, но это движение. - person I159; 03.10.2011