About Blog Dev | Alfa Romeo SZ Conkeror wishlist

Поддержка OpenID

Что-то меня прям пробило на код. :-) 4 месяца ничего не трогал, а за последние два дня прям сделал выше всяких норм. :-) В общем, OpenID работает. Причём он привязан к собственной джанговой системе аутентификации.

При логине с новым опенидом предлагается либо создать нового пользователя, либо привязать этот опенид к существующему пользователю (только введя пароль, иначе никак :)). К одному пользователю, что естественно и удобно, может быть привязано несколько OpenID’шных аккаунтов.

При том же первом логине сервер просит у провайдера опенида никнейм и мыло пользователя, а если не отдаёт - пытается угадать его (ну, угадывание достаточно тупое - он просто берёт первую часть имени домена опенида, сделано это как воркэраунд для ЖЖ, которая не отдаёт ни под каким видом ничего).

P.S.Сама поддержка OpenID - это django-openidconsumer Саймона Виллисона с патчем Benoit’а Chesneau (ух, затрудняюсь это на русском написать ;))

P.P.S.Если будут замечены глюки или баги, просьба отписать в комментариях или создать новый тикет в траке.

Add post to: Delicious Reddit Slashdot Digg Technorati Google
Comment

Comments

helge9210 19.08.2007 23:47

При второй попытке зарегистрироваться через OpenID.

TypeError at /openid/ expected string or buffer

При первой попытке все отработало нормально.

reply
helge9210 19.08.2007 23:49

Поправка: оно пользовалось результатами первой попытки (считало уже зарегистрированным), но почему-то показало поле для ввода OpenID. Reload страницы убрал поле OpenID и все стало нормально.

reply
Александр Соловьёв 20.08.2007 8:27

Хм. Я подумаю над этим.

reply
Александр Соловьёв 20.08.2007 8:36

Не получается схватить тот же еррор. :( Ввожу openid - и поле пропадает.

Но вообще да, это надо бы во вью поправить. Там самая большая проблема в коде - он не сильно красивый, и потому не слишком легко модифицируемый. :)

reply
Иван Сагалаев 20.08.2007 1:46

Если я не позабыл окончательно свой французский, то Benoit Chesneau читается как Бенуа Шено. Или Шесно :-).

reply
Александр Соловьёв 20.08.2007 8:28

Хех, я по его имени (Benoit) подумал, что он еврей. :)

reply
Иван Сагалаев 20.08.2007 1:50

Кстати.. А можно в двух словах, насколько различаются по удобству в использовании подходы как у Саймона — с явным request.openid и, например, как у меня, когда для каждого openid автоматически создается и авторизуется request.user?

reply
Александр Соловьёв 20.08.2007 8:34

У него есть определённый плюс - к одному пользователю может быть привязано несколько openid. Мне кажется, что это правильный подход.

Хотя, должен сказать, что код после наложения патча от Бенуа (до - я не смотрел) не слишком красивый. В траке можно глянуть, и то, я его по мере сил причесал слегка. Но, чувствую, придётся переделать посимпатичнее, а то мне как-то это всё не совсем нравится.

reply
Александр Соловьёв 20.08.2007 17:34

Кстати, когда я смотрел реализацию openid из cicero, она не привязывала пользователя к openid, вроде… Плюс нужна была директория, а мне это реально не сильно удобно. :)

reply
Иван Сагалаев 21.08.2007 11:06

Привязывает, привязывает:

try:
  profile = Profile.objects.get(openid=info.identity_url)
  user = profile.user
except Profile.DoesNotExist:
  import md5
  unique = md5.new(info.identity_url).hexdigest()[:23] # 30 - len(‘cicero_’)
  user = User.objects.create_user(‘cicero_%s’ % unique, ‘user@cicero’, User.objects.make_random_password())
  profile = user.cicero_profile
  profile.openid = info.identity_url
  profile.save()
return user

А у тебя что в качестве стораджа? БД?

reply
Александр Соловьёв 21.08.2007 13:29

Ага, БД. Вот здесь модель Association. В общем, реально я взял эту реализацию только из-за двух вещей - хранение в базе и много опенидов на одного юзера (хоть и не автоматически, но мне кажется, что это допустимое зло :)).

reply
adept 20.08.2007 20:44

Тэкс. Буду на этом примере посмотреть, что такое django :)

reply
Александр Соловьёв 20.08.2007 22:03

Отлично, отлично… :) Надеюсь, мой вариант её использования не покажется сильно ужасным. :D

P.S.Код в openidconsumer/*.py, как я говорил, точно некрасивый. :]

reply
Александр Соловьёв 20.08.2007 22:38

Хех, увидел твой ник - и вспомнил про фид по тегу. Готово! :)

reply

Comment form for «Поддержка OpenID»

Required. 30 chars of fewer.

Required.