CMS Drupal с версии 6 обзавелся встроенной поддержкой OpenID. Но многие ругают это решение по двум причинам:
А вот решение второй проблемы оказалось довольно простым, хотя практически нигде и не описано.
В чем причина такого странного поведения Drupal? Дело в том, что при попытке залогиниться, используя OpenID, движок создает полноценный аккаунт пользователя, принимая в качестве данных отдаваемую OpenID-провайдером информацию. Но многие сайты во-первых отдают не логин в чистом виде, а полный адрес страницы пользователя (например, «логин.livejournal.com», вместо просто «логин»), в котором, разумеется, есть невалидные для имени пользователя в Drupal символы; а во-вторых не дают информацию о e-mail пользователя, которая необходима для создания аккаунта в Drupal.
Первая часть проблемы решается патчем с официального сайта проекта (версии появляются на странице обсуждения). Мало того, что теперь невалидные символы автоматически удаляются, так адрес еще и анализируется на предмет того — каков же все-таки логин пользователя. Спасибо людям из сообщества.
Вторая часть тоже решается несложно: нужно просто сгенерировать фальшивый адрес для пользователя и тогда Drupal посчитает, что все в порядке. Это не лучшее решение, поскольку конфликтует с подтверждениями по электронной почте и т.п. (адрес то фальшивый), но зато облегчает жизнь пользователям — никаких лишних шагов при попытке логина.
Для этого изменяем часть строки из openid.module:
$form_state['values']['mail'] = (!empty($response['openid.sreg.email']))? $response['openid.sreg.email']: ''; (версия после применения патча)
или $form_state['values']['mail'] = (empty($response['openid.sreg.email']))? '': $response['openid.sreg.email']; (версия до применения патча)
меняем на
$form_state['values']['mail'] = (!empty($response['openid.sreg.email']))? $response['openid.sreg.email']: $form_state['values']['name'].'@nomail';
Теперь, если сервер не прислал e-mail пользователя, то поле будет заполнено адресом вида «логин_пользователя@nomail».
Я понимаю и уважаю идею разработчиков о том, что логин по OpenID должен создавать валидный Drupal-аккаунт, но ситуации бывают разные — кому-то их решение может не подойти.
Upd: Нашел место, где я в свое время вычитал алгоритм лечения второй проблемы (на него и опирался) для Drupal 5.x — там даже готовый патч есть. Очень рекомендую, блог «SolarWind Gate. Заметки гика»
- Не позволяет авторизоваться на сайте без создания аккаунта. То есть, использование OpenID в качестве цифровой подписи, к примеру для комментариев, становится невозможным.
- При попытки авторизоваться по OpenID система часто выдает ошибку «найдены невалидные символы в логине», либо требует ввести email.
А вот решение второй проблемы оказалось довольно простым, хотя практически нигде и не описано.
В чем причина такого странного поведения Drupal? Дело в том, что при попытке залогиниться, используя OpenID, движок создает полноценный аккаунт пользователя, принимая в качестве данных отдаваемую OpenID-провайдером информацию. Но многие сайты во-первых отдают не логин в чистом виде, а полный адрес страницы пользователя (например, «логин.livejournal.com», вместо просто «логин»), в котором, разумеется, есть невалидные для имени пользователя в Drupal символы; а во-вторых не дают информацию о e-mail пользователя, которая необходима для создания аккаунта в Drupal.
Первая часть проблемы решается патчем с официального сайта проекта (версии появляются на странице обсуждения). Мало того, что теперь невалидные символы автоматически удаляются, так адрес еще и анализируется на предмет того — каков же все-таки логин пользователя. Спасибо людям из сообщества.
Вторая часть тоже решается несложно: нужно просто сгенерировать фальшивый адрес для пользователя и тогда Drupal посчитает, что все в порядке. Это не лучшее решение, поскольку конфликтует с подтверждениями по электронной почте и т.п. (адрес то фальшивый), но зато облегчает жизнь пользователям — никаких лишних шагов при попытке логина.
Для этого изменяем часть строки из openid.module:
$form_state['values']['mail'] = (!empty($response['openid.sreg.email']))? $response['openid.sreg.email']: ''; (версия после применения патча)
или $form_state['values']['mail'] = (empty($response['openid.sreg.email']))? '': $response['openid.sreg.email']; (версия до применения патча)
меняем на
$form_state['values']['mail'] = (!empty($response['openid.sreg.email']))? $response['openid.sreg.email']: $form_state['values']['name'].'@nomail';
Теперь, если сервер не прислал e-mail пользователя, то поле будет заполнено адресом вида «логин_пользователя@nomail».
Я понимаю и уважаю идею разработчиков о том, что логин по OpenID должен создавать валидный Drupal-аккаунт, но ситуации бывают разные — кому-то их решение может не подойти.
Upd: Нашел место, где я в свое время вычитал алгоритм лечения второй проблемы (на него и опирался) для Drupal 5.x — там даже готовый патч есть. Очень рекомендую, блог «SolarWind Gate. Заметки гика»