2009-03-22 3 views
35

Я создаю приложение Python, которое должно связываться с поставщиком услуг OAuth. SP требует от меня указать URL-адрес обратного вызова. Указание localhost явно не будет работать. Я не могу настроить открытый сервер. Любые идеи, помимо оплаты за сервер/хостинг? Возможно ли это?Как я могу развиваться против OAuth локально?

ответ

18

Две вещи:

  1. OAuth-провайдер в вопросе нарушения OAuth спецификации, если это дает вам ошибку, если вы не укажете обратного вызова URL. callback_url - spec'd to be an OPTIONAL parameter.

  2. Но, педантизм в стороне, вы, вероятно, захотите получить обратный вызов, когда пользователь выполнил только так, чтобы вы знали, что можете использовать токен запроса для токена доступа. Yahoo's FireEagle developer docs есть много отличной информации о том, как это сделать.

Даже во втором случае обратный вызов фактически не должен быть видимым из Интернета вообще. Поставщик услуг OAuth перенаправит браузер, который пользователь использует, чтобы указать свое имя пользователя/пароль для URL-адреса обратного вызова.

Два распространенный способ сделать это является:

  1. Создать немую веб-службу из вашего приложения, который прослушивает некоторый порт (скажем, http://localhost:1234/) для завершения обратного вызова, или
  2. Регистрации протокола (вам нужно будет проверить документацию для вашей ОС, в частности, о том, как это сделать, но она позволяет такие вещи, как < a href = "skype: 555-1212" > для работы).

(Пример потока, который я считаю, что вы описываете lives here.)

0

Вы можете создать 2 Приложения? 1 для развертывания, а другой для тестирования.

В качестве альтернативы вы также можете указать параметр oauth_callback при запросе маркера запроса. Некоторые провайдеры будут перенаправлять URL-адрес, указанный oauth_callback (например, Twitter, Google), но некоторые будут игнорировать этот URL обратного вызова и перенаправить на тот, который указан во время конфигурации (например,Yahoo)

4

Это было с Facebook OAuth - я на самом деле был, который мог указать «http://127.0.0.1:8080» в качестве URL-адреса сайта и URL-адреса обратного вызова. Потребовалось несколько минут, чтобы изменения в приложении Facebook распространялись, но потом это сработало.

+2

Действительно. 'localhost' не будет работать, но' 127.0.0.1' будет. –

10

В случае, если вы используете * систему Никса стиля, создать псевдоним, как 127.0.0.1 mywebsite.dev в /etc/hosts (вы должны иметь линию, которая похожа на выше в файле, используйте http://website.dev/callbackurl/for/app в обратном вызове URL и во время локального тестирования.

+1

В Windows также есть файл hosts. В Windows 7 он находится на 'C: \ Windows \ System32 \ drivers \ etc \ hosts' –

0

Итак, как я решил эту проблему (используя интерфейс OAuth от BitBucket), был указан URL-адрес обратного вызова на localhost (или, что бы вы ни делали на самом деле), а затем после URL-адреса авторизации с завитком, но с завихрением только возврата HTTP Пример:

curl --user BitbucketUsername:BitbucketPassword -sL -w "%{http_code} %{url_effective}\\n" "AUTH_URL" -o /dev/null 

Вставка для ваших учетных данных и URL-адреса авторизации (не забудьте восклицательный знак!).

Что вы должны получить что-то вроде этого:

200 http://localhost?dump&oauth_verifier=OATH_VERIFIER&oauth_token=OATH_TOKEN 

И вы можете очистить oath_verifier от этого.

Проделав то же самое в питоне:

import pycurl 
devnull = open('/dev/null', 'w') 
c = pycurl.Curl() 

c.setopt(pycurl.WRITEFUNCTION, devnull.write) 
c.setopt(c.USERPWD, "BBUSERNAME:BBPASSWORD") 
c.setopt(pycurl.URL, authorize_url) 
c.setopt(pycurl.FOLLOWLOCATION, 1) 
c.perform() 

print c.getinfo(pycurl.HTTP_CODE), c.getinfo(pycurl.EFFECTIVE_URL) 

Я надеюсь, что это полезно для кого-то!

+0

. Предостережение с этим (по крайней мере, с BitBucket) заключается в том, что вам придется посетить URL-адрес, чтобы кликнуть по крайней мере на самом деле. И затем я думаю, что он помнит ваши учетные данные. –

Смежные вопросы