Введение
Сегодня я поделюсь своим опытом по аутентификации пользователей на уровне сервера.Сразу скажу, это не единственный способ защиты информации. Сервер Apache предполагает три варианта разрешения вопроса, будет ли в ответ на запрос предоставлен конкретный ресурс.
Критерии, которыми он пользуется, — это аутентификация, авторизация и управление доступом. И мало того, тот способ, что я опишу ниже можно расширить функционалом — в статье мы рассмотрим лишь базовый функционал, который может послужить отправной точкой и инструкцией к дальнейшим действиям.
Попытаемся себе представить, для чего нам это нужно.
- Делаете работу для заказчика и нельзя пускать на сайт никого кроме вас и клиента
- Не хотите показывать сайт обществу и лишь несколько людей должны иметь доступ к нему
- Не хотите показывать недоделанную работу — сайт в процессе разработки (Under Construction)
- Пускать на сайт, кроме привелигированного пользователя, нет никакого для вас резона
- Другая причина
Как правило аутентификацией называется любой процесс, с помощью которого проверяется, что некто является именно тем, за кого себя выдаёт. Обычно, такая проверка ограничивается вводом имени пользователя (login) и пароля (password), но может включать в себя любой другой метод, определяющий т.н. тождественность.
[решено] добавить друпаловскую авторизацию внешнему скрипту |
У меня есть скрипт (обрабатывает AJAX — запросы), когда я его вставляю сниппетом в страницу, то обновление информации на странице происходит с задержкой 4-5 секунд. Причем данные в базу записываются сразу же после нажатия кнопки отправить (без задержек), а потом в течение 5 секунд обновляется информация на странице (сперва ничего не происходит, потом сразу меняется).
Я так понимаю, что запрос на сервер уходит, генерируется эта же страница, и из нее данные отправляются в открытую страницу.
В связи с этим у меня возникла идея запросы отправлять на отдельный php-скрипт. Я попробовал этот сниппет использовать как отдельный файл, в этом случае все действительно работает мгновенно, но в этом случае нет данных о залогиненном пользователе, т.е. я просто для отладки прописал UID в скрипте.
Как можно к отдельному скрипту добавить друпаловскую авторизацию чтобы получать UID? Или как создать максимально облегченную друпаловскую страницу без всяких меню и блоков, с одним сниппетом?
Disclaimer
Итак, с данного момента багрепорты типа «ничего не работает, помогите» игнорируются. Багрепорты связанные с некорректным отображением элементов в нестандартных темах оформления игнорируются, так как они легко локализуются Firebug’ом и исправляются правкой CSS.
В случае с исчезновением кнопки share, проблема может быть из-за текста поста, по этому попробуйте создать тестовый пост, с 1 простым предложением и сохранить его, если кнопка в таком посте появилась, то продолжайте добавлять в него по 1-2 предложения из поста, в котором кнопка не появляется.
Конфигурирование
Защита сайта может быть выполнена в 3 шага
- Создание файла паролей
- Конфигурирование Apache для работы с файлом паролей
- Создание групп пользователей (опционально)
Небольшой совет по авторизации пользователя из внешнего скрипта |
Сначала это был вопрос, но по ходу сам разобрался и вопрос превратился в совет
Задача: залогинить пользователя из внешнего скрипта. Скрипт может находиться не только в корне сайта, а например в поддиректории. Из корня сайта всё получается:
<?php
// …что-нибудь делаем
include(‘./includes/bootstrap.inc’);
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
user_authenticate(array(‘name’ => ‘admin’, ‘pass’ => ‘*****’));
// …теперь мы залогинены на сайте, можно делать что-нибудь ещё
?>
Конструкция выше, помещённая в сторонний скрипт производит инициализацию друпала, логин юзера, возвращает куки — всё ок. Но когда скрипт находится во вложенной директории, это не срабатывает, даже если сделать chdir() в корень сайта. На самом деле, чтобы это работало нужно явно указать $base_url друпала! Указать его можно либо в settings.php, раскомментировав строку $base_url, или во внешнем скрипте, как удобней:
<?php
include(‘./includes/bootstrap.inc’);
$conf[‘base_url’] = ‘http://example.com‘;
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
user_authenticate(array(‘name’ => ‘admin’, ‘pass’ => ‘*****’));
?>
От слов, к делу
Шаг первый.Пишем в секции <VirtualHost> вашего сайта:
Работа модуля
Логика работы модуля:
- после нажатия пользователем кнопки «войти вКонтакте» модуль получает необходимые данные от сервера вКонтакте.
- Далее модуль проверяет есть ли в базе данных Друпала пользователь, связанный с именем, полученным от вКонтакте:
- если его нет, то создается новый пользователь и связывается с id пользователя ВКонтакте. Внимание! Важная деталь. Если в базе данных есть пользователь с именем не связанным с учетной записью вКонтакте и из вКонтакте приходит пользователь с таким же именем, то такие две учетные записи не будут связаны, для имени нового пользователя будет просто добавлен суффикс _N, где вместо N будет подставлено число.
- если связанный с учетной записью ВКонтакте пользователь есть, то будет использована найденная учетная запись.
- Выбранный пользователь авторизуется в системе.
- ВКонтакте не отдает адрес электронной почты, по этому модуль предлагает новому пользователю указать свой e-mail в настройках своего нового аккаунта.
Вход в личный кабинет