Аутентификация в стороннем приложении через базу пользователей Drupal 7

Published: 20.01.2012

Предположим, у нас есть основной сайт на Drupal 7, где регистрируются пользователи. И есть независимое приложение не на Друпале, которое также требует аутентификации пользователей, но только из числа зарегистрированных на основном сайте.

На первый взгляд, всё просто: получаем из формы аутентификации логин и пароль, ищем в поле name таблицы users введённый логин, если находим, то сравниваем поле pass найденной строки с введённым паролем.

Конечно же, сейчас почти никто не хранит пароли в открытом виде, и Друпал не исключение — пароли хранятся зашифрованными в виде хешей. Друпал 6 шифровал пароли в md5, получить хеш введённого пароля для последующего сравнения с хешем из базы было очень просто при помощи команды md5($pass);.

Седьмая версия Друпала использует более надёжный алгоритм шифрования паролей SHA-512. Помимо этого, при шифровании нового пароля к нему добавляется случайно генерируемая соль, таким образом, при создании нескольких аккаунтов с одинаковыми паролями, их хеши будут разными. Соответственно, сгенерировать нужный хеш только на основе введённого пароля не получится — нужно знать соль, которая использовалась для шифрования исходного пароля. А она содержится в самом хеше.

По большому счёту, вот и вся сложность — для генерации хеша всего-то нужен не только введённый пароль, но и эталонный хеш, в котором содержится соль. А саму функцию генерации хеша _password_crypt «позаимствуем» у Друпала:

  1. function validatePassword($password, $stored_hash) {
  2.   // $path_to_drupal7_root - путь к корневой директории с установленным Друпалом
  3.   // или можно файл password.inc скопировать к своему приложению
  4.   include_once $path_to_drupal7_root.'/includes/password.inc';
  5.  
  6.   // генерируем хеш
  7.   $hash = _password_crypt('sha512', $password, $stored_hash);
  8.  
  9.   // сравниваем и возвращаем результат
  10.   return $stored_hash == $hash;
  11. }