Помогите пройти авторизацию на python. Есть такой код:
def main(): webbrowser.open('http://oauth.vk.com/authorize?client_id='+APP_ID+'& scope='+SETTINGS+'&redirect_uri='+REDIRECT_URI+'&display='+DISPLAY+'&response_type=token')
В браузере вводятся логин/пароль и запрашивается разрешение, но как после всего этого вытянуть из браузера токен и идентификатор пользователя?
Смысл авторизации через сторонний сервис (в данном случае OAuth 2) ледующий:
- На сервисе (в данном случае ВК) необходимо зарегистрировать приложение и получить ключ API.
- После этого приложение (сайт) могут делать запрос личных данных пользователя у строннего сервиса через этот самый API, для чего:
- перенаправить пользователя (браузер пользователя посредством посылки ему HTTP ответа 302 Redirect) по специально сформированной ссылке (из Вашего сообщения) на сервис предоставляющий API;
- пользователь там произведёт какие-то действия, предположительно авторизуется и разрешит доступ к данным;
- по завершении действий пользователь будет перенаправлен сторонним сервисом посредством всё того же 302 Redirect на URL переданный в параметрах специально сформированной ссылки (в данном случае это
'&redirect_uri='+REDIRECT_URI
).
- Пользователь попадает по той самой ссылке возврата Ваш на сайт. И если пользователь согласился предоставить свои данные, хранящиеся на стороннем сервисе, Вашему сайту — то эта ссылка в GET параметрах будет содержать ключ доступа к данным пользователя на этом стороннем сервисе, в противном случае она будет содержать код отказа (см. документацию на целевом сервисе).
В положительной ситуации требуется сохранить этот ключ доступа и используя его и ключ API в дальнейшем прямыми запросами приложения к сервису получать необходимую информацию. В зависимости от протокола этот ключ доступа может использоваться для получения другого ключа с которым уже можно будет оперировать с данными пользователя. В любом случае после третьего шага участие пользователя уже не требуется и все данные нужно пjлучать прямыми запросами Вашего сайта к стороннему, например через urllib2.urlopen
.
Это общий принцип действия, конкретные нюансы следует уточнять в документации для разработчиков от конкретного сервиса. В данном случае это Авторизация сайтов на ВКонтакте.
Я некоторое время назад решил вашу проблему. Вкратце, можно парсить странички авторизации и отправлять формы без использования браузера. Подробное описание решения можно прочитать в статье. Исходники модуля лежат на github. Модуль использует только стандартные модули Python, поэтому должен работать без лишних телодвижений практически везде.
Токен придет в URL запроса на REDIRECT_URI
. Отсюда: Авторизация клиентских приложений
Получение access_token
После успешной авторизации приложения
браузер пользователя будет
перенаправлен по адресуREDIRECT_URI
,
указанному при открытии диалога
авторизации. При этом ключ доступа к
API access_token
и другие параметры
будут передана в URL-фрагменте ссылки:
http://REDIRECT_URI#access_token= 533bacf01e11f55b536a565b57531ad114461ae8736d6506a3&expires_in=86400&user_id=8492
Два варианта.
- Советский. Перед отправкой пользователя с браузером на сайт, рассказать ему «сейчас у вас откроется браузер, вы там введите свой пароль, со всем согласитесь, и потом скопируйте сюда в нашу программу всю адресную строку ручками».
- Буржуазный. Использовать некую среду, внутри которой есть свой компонент браузера. Будь то родное приложение под Windows, написанное на Delphi, или под Мак на XCode. В таком случае, приложение имеет власть над содержащимся внутри него браузером, и может в нужный момент получить из него адресную строку.