Как использовать OpenID в Plone

Статья с описанием, как использовать OpenID, чтобы войти на Plone-сайт в качестве любого пользователя с любыми правами.

Вот решение, которое позволит любому из постоянных пользователей Вашего сайта:

  • Требовать OpenID url как свой собственный;
  • Использовать OpenID, чтобы начать работу на Вашем Plone-сайте;
  • И автоматически переключаться на их нормального Plone-пользователя, при этом никаких дополнительных паролей либо логинов не требуется.

Это лишь доказательство концепции кода, и части моей летней работы.

В настоящее время (Plone 3) возможно, чтобы пользователи входили на Ваш сайт через OpenID , но они станут своего рода зомби-участниками: Если Вы присвоите им роли в Plone UI, то эти роли не закрепятся. Но если OpenId логин может перейти в нормального пользователя Plone, OpenId становится более полезным в Plone.

Вот как это работает:

Установка

Вы должны инсталлировать три продукта:

  1. OpenId Product, который идет с Plone;
  2. OneTimeTokenPAS ;

  3. Продукт, который делает доступным для поиска такое свойство пользователя как 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