Учитывая количество сайтов, посвящённых краже паролей «ВКонтакте», я бы на месте пользователей последнего не торопился пользоваться возможностью авторизации на стороннем сайте.
Интересно, да.
Я джанго давно не использовал, по сему, возможно, глупый вопрос: а это и правда всё что нужно?
d-pa подхватит настройки и будет использовать VKONTAKTE только как префикс?
Хорошо было бы выложить небольшое приложение-пример, в котором есть необходимый минимум кода и только.
Хотелось бы ещё узнать о том как работать с информацией из ВКонтакте, т.е. информацией профайлов.
В общем, статья полезна как анонс для «нормальной статьи», но, увы, не более.
Кстати, порадовало как на pyplanet.org можно аутентифицировтаься одной кнопкой не вводя полный путь до openid-акаунта гугла. Вот про это хотелось бы тоже небольшую статью.
Именно бэкенд от Вконтакте.ру не умеет дополнительную инфу вытаскивать, просто потому что я не нашёл хорошей библиотеки на питоне для работы с их API. В OpenId, OAuth и FacebookConnect такая возможность есть, нужно просто указать в настройках. О том что конкретно нужно указать написано на вики от django-publicauth. Ещё один интересный момент — если стянутой дополнительной инфы достаточно для создания профиля, то дополнительный шаг не понадобится, сразу создастя профиль и юзера авторизирует.
Хорошо, сделаю чистый проект только с авторизацией и пару дополнительными полями профиля и выставлю где нибудь.
Да вы, я вижу, любите во всём разбираться сами, никогда не читаете ни мануалов, ни туториалов, ни референсов?
Очень советую читать такие статьи. Очень много времени сэкономите как себе, так и заказчику.
Да, у одного из десяти примерно случается такая проблема, честно говоря не знаю куда копать… Наверное просто подожду пока в интернете появится хотя бы пояснение проблемы, а может это баг на стороне вконтакте.ру и проблема сама решится.
Инициализация API может завершиться неуспешно только в том случае, если браузер пользователя не поддерживает функции обмена сообщениями между окнами window.postMessage и при этом не имеет установленного Flash-плеера.
Знаете, что еще может быть. У меня дома в Опере какой-то глюк, или секретная настройка, ни одна страница не открывается в новом окне. Соответственно, когда я нажал кнопку «Вконтакте.ru», у меня страница открылась в том же окне. На работе такого, открылась в новом, и я успешно авторизовался. Так что копайте этот глюк в сторону блокировки всплывающих окон.
Я честно говоря для авторизации всегда выбираю OpenID, потому что именно для этого он и был сделан. Хотя может он и для аутентификации сделан, я вечно путаю эти два слова :)
Спасибо за пример, срочно реализуем.
Авторизация нужна таким, как я! У меня группа созданая под сайт, в группе 56000 человек из них 40-50 в день переходит на сайт, но не авторизуется в нём а прото что-то читает. Так вот теперь процесс авторизации для этих людей будет сильнео упрощен и это меня радует.
В одном из комментариев я как раз написал, что вечно путаю эти два понятия. Но в случае с Вконтакте это всё таки авторизация которую я использую как аутентификацию. То же самое и с провайдерами oAuth.
Имел ввиду возможность авторизации вконтакте не имея там аккаунта.
например, мне постоянно кидают ссылки на какие-то странички фото\видео вконтакта. А желания регистрироваться только чтобы посмотреть 1 фотку нет.
Скажите плиз, а как как этот способ входа на сайт уживается вместе со стандартной системой от разработчиков? Вошедший через вконтакт человек является полноценным пользователем сайта? При первом логине ему создаётся запись в таблице пользователей?
Да, создаётся обычный юзер из django.contrib.auth.models.User и вдобавок есть ещё одна моделька. Вы можете глянуть метод save() у класса в файле forms.py приложения publicauth.
Спасибо за отличный код!
У меня есть небольшой вопрос, можно ли вообще отрубить EXTRA_FORM?
Получается что пользователю приходится 2 формы заполнять в профиле и при регистрации.
Вам нужно просто указать путь до своей EXTRA_FORM, в которой может не быть вообще полей, а только метод save(). Как я уже писал в одном комментарии если дополнительные данные не нужны или их достаточно из вытянутых то второй шаг пропустится. Так что создайте новый класс формы и укажить путь до него в настройках EXTRA_FORM или сделайте сабкласс и удалите в нём поле юзернэйм. наверное это делается так
def __init__(self):
del self.base_fields['username']
super(YourClass, self).__init__()
Путь до новой формы глявное что бы не был таким — «forms.ExtraForm», иначе первым делом он будет искать такую форму в папке publicauth и соответсвенно вместо вашей формы вызовет её. В общем главное что бы этот стринг отличался.
class LoginPass(ExtraForm):
#dummy = forms.CharField()
def __init__(self, initial):
try:
del self.base_fields['username']
finally:
super(LoginPass, self).__init__()
def save(self, request, identity, provider):
pass
в сеттингс PUBLICAUTH_EXTRA_FORM = «myapp.forms.LoginPass»
мне показывается пустая форма без полей, но с кнопочной сабмит. А как в принципе от нее избавиться?
save() отрабатывает при отправке формы, а надо провернуть без этого, т.е. где-то во вьюхах
Но если в двух словах то не работает. Может быть я не совсем понятно объяснил чего хочу добиться. Мне нужно что бы после того как отработал код вьюхи входа создавался профиль с любым именем, пусть даже случайным. И без лишних вопросов перекидывало на какую-нибудь страницу.
Вместо этого выводится форма, которую приходится вручную сабмитить…
Без save'а невозможно это сделать, юзера же надо создать, внести в базу так сказать. Как вы себе представляете логин/авторизацию вообще без сохранённых данных? Другое дело что второй шаг не должен показываться если полей в форме ExtraForm не существует, а просто сразу вызывать save и перекидывать человека на другую страницу уже залогениным.
После того как человек зарегистрировался, в следующие разы конечно никакие save не будут вызываться, потому что человек не дойдёт вообще до этой вьюшки, а залогинет его на этапе ранее.
Выставьте код на dumpz.org, покажите ваш файл настроек + вашу форму
Только что специально для вас сделал проект без дополнительных полей, всё замечательно работает. Вот код pyplanet.org/static/auth_example2.tar.gz как установить этот проект я писал в статье
Незнаю как на sqlite но на mysql упирается в ограничение на имя пользователя в 30 символов, что само по себе можно преодолеть просто стрипнув конец строки идентификатора, но например для гуг эпс это оставит для всех пользователей одну и ту же строчку.
Вы абсолютно правы никакого мужежа с конструктором форм не надо было начинать, я просто немного поменял логику метода save() в кастомной форме как то так: dumpz.org/18919/
Он пытается выдернуть что может из данных если нет, то просто генерирует по типу openid_4567
У Вас не открывается страничка (http://pyplanet.org/auth/login/) в IE 7.
Данная проблема была и у меня — решилась удалением из странички повторяющей инициализации VK
Но, возникла другая проблема, в том же IE 7, — юзер не может залогинится. Окно с логином и паролем появляется, но после ввода просто закрывается без callback-a.
Может причина в этом?
>> Не следует забывать, что вызов внешних методов осуществляется при помощи механизма postMessage, а этот механизм не работает в браузерах Internet Explorer 6 и Internet Explorer 7. Конечно, в этих браузерах сработает специальный Flash-посредник, но, как бы странно это ни казалось, не у всех есть установленный Flash-плеер.
Честно говоря у меня нет IE на компьютере и нет возможности подебагить эту проблему. Что касается конкретно сайта pyplanet то поддержка IE там и не задумывалась, так как таких посетителей всего 2% и то наверняка это случайно попавшие или маскирующиеся под IE клиенты.
Но если вдруг выпадет случай проверить и решить эту проблему я обязательно отпишусь в этом топике.
спасибо за статью. Библиотека сама по себе классная, но почему-то не получается залогиниться с помощью OpenID ЖЖ. Причем, другие openID провайдеры вроде гугла, яндекса и myopenid.com работают нормально. Обидно, и при этом непонятно. Хоть бы ЖЖ код ошибки вернул какой
Много воды утекло со времени написания статьи, автору спасибо.
Заметил недостающие звенья в самой статье (в примерах все отлично).
для правильной работы django-publicauth необходимо не только наличае django-annoying, но и также использование middleware в settings проекта:
Авторизация через новый API сайта Вконтакте.ру