Как использовать OpenID в Plone
Вот решение, которое позволит любому из постоянных пользователей Вашего сайта:
- Требовать OpenID url как свой собственный;
- Использовать OpenID, чтобы начать работу на Вашем Plone-сайте;
- И автоматически переключаться на их нормального Plone-пользователя, при этом никаких дополнительных паролей либо логинов не требуется.
Это лишь доказательство концепции кода, и части моей летней работы.
В настоящее время (Plone 3) возможно, чтобы пользователи входили на Ваш сайт через OpenID , но они станут своего рода зомби-участниками: Если Вы присвоите им роли в Plone UI, то эти роли не закрепятся. Но если OpenId логин может перейти в нормального пользователя Plone, OpenId становится более полезным в Plone.
Вот как это работает:
Установка
Вы должны инсталлировать три продукта:
- OpenId Product, который идет с Plone;
- Продукт, который делает доступным для поиска такое свойство пользователя как Remember .
Remember может быть установлен через buildout . С помощью OneTimeTokenPAS после его инсталляции через buildout, я должен был вручную разместить его в папку продукта, чтобы он работал, а также я должен был удалить яйцо (egg) в egg cache, и Products.OneTimeTokenPAS из buildout config, так что яйцо не будет вновь появляться в последующих buildouts.
Нам необходимо кое-что протестировать. Установите Remember и затем создайте нормального пользователя. Для каждого пользователя есть поле местоположения. Заполните здесь OpenID url. Зайдите в портальный каталог, и убедитесь, что поле местоположения доступно для поиска. Я создал индекс "location" и индексы "getLocation".
Установите OneTimeTokenPAS, и следуйте инструкциям относительно папки acl_users, чтобы включить авторизацию и извлечение, и переместить его наверх среди авторизованных плагинов.
Инсталлируйте поддержку OpenID, добавив продукт.
Выполнение
Создайте python-скрипт в корне вашего Plone-сайта со следующим содержанием:
# Get url to site portal_url = container.absolute_url() # So what is the id of the currently logged in user # (will be an openId url for openId logged in users in Plone)? oldUserId = container.portal_membership.getAuthenticatedMember().getId() # Search to see if any member on the site has indicated that that url is # their openId # We search each user's "location" field here (with the Member content # type of # the remember product), but better to use a dedicated # OpenID field for serious use. # Lose trailing slash of openId identifier oldUserId = oldUserId[:-1] res = container.portal_catalog(portal_type='Member',location=oldUserId) # Get the id of that user try: userId = res[0].getId except IndexError: return "Nobody has claimed %s as their open id url" % oldUserId # prepare a login to switch to that user tokenTool = container.onetimetoken_storage token = tokenTool.setToken(userId) logincode = '?logincode=%s' % tokenTool.setToken(userId) url = portal_url + logincode # Kill the auth cookie of the old user, or onetimetoken in acl_users # won't kick in context.REQUEST.response.setCookie('__ac','') # Redirect to the token login, effectively logging in the user with # no action on # her part context.REQUEST.response.redirect(url)
Проксируйте скрипт как "Manager". Теперь после того, как Вы войдете, как OpenID-пользователь, Вы можете щелкнуть по ссылке, которая ведет к вышестоящему скрипту. Может быть будет возможно выполнить вышеупомянутый скрипт автоматически при вводе OpenID.
Обновление 2009-07-10
Злоумышленник может заблокировать другого пользователя, потребовав его OpenID. Таким способом хороший пользователь мог зайти в аккаунт плохого парня. Но хороший парень может просто изменить требование OpenID этого аккаунта, выйти и войти в правильный аккаунт. И таким образом нет проблем.
Оригинал статьи на jorgenmodin.net
Перевод ООО «Комтет» komtet.ru