Pull to refresh

Comments 62

Учитывая количество сайтов, посвящённых краже паролей «ВКонтакте», я бы на месте пользователей последнего не торопился пользоваться возможностью авторизации на стороннем сайте.
На facebook'e точно такой же стиль авторизации. А вообще да, обмануть юзера довольно легко если он не смотрит на домен в открывающемся окне.
Спасать должны автозаполнялки паролей.
угу, нововведение аля скажем аккам вк пока
… Посмотреть сайт с рабочим примером вы можете на этом сайте…
немного тавтологично, а за статью краткую емкую и понятную большое спасибо.
Интересно, да.
Я джанго давно не использовал, по сему, возможно, глупый вопрос: а это и правда всё что нужно?
d-pa подхватит настройки и будет использовать VKONTAKTE только как префикс?
Хорошо было бы выложить небольшое приложение-пример, в котором есть необходимый минимум кода и только.
Хотелось бы ещё узнать о том как работать с информацией из ВКонтакте, т.е. информацией профайлов.
В общем, статья полезна как анонс для «нормальной статьи», но, увы, не более.

Кстати, порадовало как на pyplanet.org можно аутентифицировтаься одной кнопкой не вводя полный путь до openid-акаунта гугла. Вот про это хотелось бы тоже небольшую статью.
Поддерживаю, живой пример с минимумом кода очень нужен. И насчет инфы из профилей.
Именно бэкенд от Вконтакте.ру не умеет дополнительную инфу вытаскивать, просто потому что я не нашёл хорошей библиотеки на питоне для работы с их API. В OpenId, OAuth и FacebookConnect такая возможность есть, нужно просто указать в настройках. О том что конкретно нужно указать написано на вики от django-publicauth. Ещё один интересный момент — если стянутой дополнительной инфы достаточно для создания профиля, то дополнительный шаг не понадобится, сразу создастя профиль и юзера авторизирует.

Хорошо, сделаю чистый проект только с авторизацией и пару дополнительными полями профиля и выставлю где нибудь.
Ура, хоть кто-то догадался сделать регистрации как бекенды.
Сам делал такое на пыхе.
А Вам еду мама разжевывала?
Да вы, я вижу, любите во всём разбираться сами, никогда не читаете ни мануалов, ни туториалов, ни референсов?
Очень советую читать такие статьи. Очень много времени сэкономите как себе, так и заказчику.
>Да вы, я вижу, любите во всём разбираться сами,

Где вы это увидели? Любите додумывать?
А что вы хотели сказать, если я не правильно угадал ход ваших мыслей?
Прошу прощения, промахнулся. Хотел к самой статье.
Ругается: Recv err: ReferenceError: Security error: attempted to read protected variable: VK
Да, у одного из десяти примерно случается такая проблема, честно говоря не знаю куда копать… Наверное просто подожду пока в интернете появится хотя бы пояснение проблемы, а может это баг на стороне вконтакте.ру и проблема сама решится.
Инициализация API может завершиться неуспешно только в том случае, если браузер пользователя не поддерживает функции обмена сообщениями между окнами window.postMessage и при этом не имеет установленного Flash-плеера.
Вроде бы Опера с 9-й версии поддерживает postMessage. А флеш у меня всегда отключен для новых доменов, это точно.
Увы, с 9.2, к примеру, точно не работает.
Знаете, что еще может быть. У меня дома в Опере какой-то глюк, или секретная настройка, ни одна страница не открывается в новом окне. Соответственно, когда я нажал кнопку «Вконтакте.ru», у меня страница открылась в том же окне. На работе такого, открылась в новом, и я успешно авторизовался. Так что копайте этот глюк в сторону блокировки всплывающих окон.
К сожалению это единственный способ начать процесс аутентификации предусмотренный Вконтакте.ру.
Не хотите сделать ссылку «Проникнуть в сайт» контрастнее?
На моем мониторе я её долго искал.
спасибо за багрепорт, это какая то проблема в вёрстке, не подскажите в каком браузере?
Опера, я же говорю :) 10.51
Ещё раз спасибо за помощь, вроде пофиксил проблему.
я вообще такие вещи стремаюсь использовать…
ps: я не трус, но я боюсь
Я честно говоря для авторизации всегда выбираю OpenID, потому что именно для этого он и был сделан. Хотя может он и для аутентификации сделан, я вечно путаю эти два слова :)
Не плохо бы еще показать код вьюшки publicauth-complete, той части, где идет работа с вконтакте.
Так опенсорс же, кто мешает глянуть на странице приложения? А если быть конкретным то задействовано два файла
bitbucket.org/offline/django-publicauth/src/tip/publicauth/views.py#cl-41
bitbucket.org/offline/django-publicauth/src/tip/publicauth/backends/vkontakte.py
ну и наверное стоит глянуть класс от которого наследуется последний файл.
а Твиттер новый API выпустили… Вчера вроде ещё не было…
Спасибо за пример, срочно реализуем.
Авторизация нужна таким, как я! У меня группа созданая под сайт, в группе 56000 человек из них 40-50 в день переходит на сайт, но не авторизуется в нём а прото что-то читает. Так вот теперь процесс авторизации для этих людей будет сильнео упрощен и это меня радует.
UFO just landed and posted this here
Это не авторизация. Это — аутентификация.

Авторизация — это не аутентификация.

Аутентификация — это не авторизация.

Это не авторизация. Это — аутентификация.
В одном из комментариев я как раз написал, что вечно путаю эти два понятия. Но в случае с Вконтакте это всё таки авторизация которую я использую как аутентификацию. То же самое и с провайдерами oAuth.
Не путать очень просто, если знать английский: нужно лишь вспомнить значения слов «authentic» и «authorized».
Лучше бы наоборот сделали. OpenID какой-нить или гугло-авторизацию
в этом приложении есть и OpenID.
Имел ввиду возможность авторизации вконтакте не имея там аккаунта.
например, мне постоянно кидают ссылки на какие-то странички фото\видео вконтакта. А желания регистрироваться только чтобы посмотреть 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__()
После удаления поля форма все равно остается, я так понимаю из конструктора формы нельзя непосредственно вызвать ее сохранение.
вот эта функция отвечает за авторегистрацию bitbucket.org/offline/django-publicauth/src/tip/publicauth/backends/__init__.py#cl-79

Путь до новой формы глявное что бы не был таким — «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»
мне показывается пустая форма без полей, но с кнопочной сабмит. А как в принципе от нее избавиться?
Ну тогда попробуйте полностью форму себе скопировать, без сабклассинга, удалите оттуда атрибут username, а в строчке

bitbucket.org/offline/django-publicauth/src/tip/publicauth/forms.py#cl-22

замените username=self.cleaned_data['username'] на username=identity или username="%s-%s" % (provider, identity)

Джанга не позволит совсем без юзернэйма создать запись в базе, так как на неё у джанги стоит unique=True.
save() отрабатывает при отправке формы, а надо провернуть без этого, т.е. где-то во вьюхах
Но если в двух словах то не работает. Может быть я не совсем понятно объяснил чего хочу добиться. Мне нужно что бы после того как отработал код вьюхи входа создавался профиль с любым именем, пусть даже случайным. И без лишних вопросов перекидывало на какую-нибудь страницу.
Вместо этого выводится форма, которую приходится вручную сабмитить…
Без save'а невозможно это сделать, юзера же надо создать, внести в базу так сказать. Как вы себе представляете логин/авторизацию вообще без сохранённых данных? Другое дело что второй шаг не должен показываться если полей в форме ExtraForm не существует, а просто сразу вызывать save и перекидывать человека на другую страницу уже залогениным.

После того как человек зарегистрировался, в следующие разы конечно никакие save не будут вызываться, потому что человек не дойдёт вообще до этой вьюшки, а залогинет его на этапе ранее.

Выставьте код на dumpz.org, покажите ваш файл настроек + вашу форму
Только что специально для вас сделал проект без дополнительных полей, всё замечательно работает. Вот код pyplanet.org/static/auth_example2.tar.gz как установить этот проект я писал в статье
Незнаю как на sqlite но на mysql упирается в ограничение на имя пользователя в 30 символов, что само по себе можно преодолеть просто стрипнув конец строки идентификатора, но например для гуг эпс это оставит для всех пользователей одну и ту же строчку.
Вы абсолютно правы никакого мужежа с конструктором форм не надо было начинать, я просто немного поменял логику метода save() в кастомной форме как то так: dumpz.org/18919/
Он пытается выдернуть что может из данных если нет, то просто генерирует по типу openid_4567
классное приложение, надо ещё сделать всплывающее стандартное окошко(javascript) с выбором провайдера, как в Loginza.ru. Попробую форкнуть.
У Вас не открывается страничка (http://pyplanet.org/auth/login/) в IE 7.
Данная проблема была и у меня — решилась удалением из странички повторяющей инициализации VK

Но, возникла другая проблема, в том же IE 7, — юзер не может залогинится. Окно с логином и паролем появляется, но после ввода просто закрывается без callback-a.

Может причина в этом?
>> Не следует забывать, что вызов внешних методов осуществляется при помощи механизма postMessage, а этот механизм не работает в браузерах Internet Explorer 6 и Internet Explorer 7. Конечно, в этих браузерах сработает специальный Flash-посредник, но, как бы странно это ни казалось, не у всех есть установленный Flash-плеер.

Но Flash-плеер у меня стоит в IE7.
Честно говоря у меня нет IE на компьютере и нет возможности подебагить эту проблему. Что касается конкретно сайта pyplanet то поддержка IE там и не задумывалась, так как таких посетителей всего 2% и то наверняка это случайно попавшие или маскирующиеся под IE клиенты.

Но если вдруг выпадет случай проверить и решить эту проблему я обязательно отпишусь в этом топике.
Спасибо.
Я просто уже протестил 5 сайтов с аутентификацией через Вконтакт — нигде в IE7 не работает.
спасибо за статью. Библиотека сама по себе классная, но почему-то не получается залогиниться с помощью OpenID ЖЖ. Причем, другие openID провайдеры вроде гугла, яндекса и myopenid.com работают нормально. Обидно, и при этом непонятно. Хоть бы ЖЖ код ошибки вернул какой
Много воды утекло со времени написания статьи, автору спасибо.
Заметил недостающие звенья в самой статье (в примерах все отлично).
для правильной работы django-publicauth необходимо не только наличае django-annoying, но и также использование middleware в settings проекта:

MIDDLEWARE_CLASSES = (
#   ...
     'annoying.middlewares.RedirectMiddleware',
)

Кстати вконтакте еще выдает VKONTAKTE_API_KEY? Мне просто ничего схожего с этим значением выдано не было, но тем не менее работает и без него.
Sign up to leave a comment.

Articles