Автор Тема: LDAP-аутентификация в Minecraft  (Прочитано 9176 раз)

alexskl21

  • Новичок
  • *
  • Сообщений: 1
    • Просмотр профиля
LDAP-аутентификация в Minecraft
« : 13 Январь 2017, 14:46:21 »
Здравствуйте. У меня есть сервер Minecraft, на котором проводятся определенные тренинги. Я написал лаунчер для Minecraft, в который хочу интегрировать LDAP-аутентификацию. Также имеется множество других систем, на которых эта же аутентификация может понадобиться позже. С LDAP раньше никак не сталкивался. Помогите, пожалуйста, чайнику - с чего начать, что прочитать, куда еще обратиться, как лучше реализовать и т.д. Имеется сервер, доступный по ссылке

Сейчас лаунчер обращается к php-файлу, который обращается к базе данных sql, проверяя логин и пароль. Следовательно, нужно, чтобы php-файл обращался к базе данных ldap, которую нужно как-то создать, а вот как - для меня не совсем ясно.
« Последнее редактирование: 13 Январь 2017, 15:39:48 от alexskl21 »

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: LDAP-аутентификация в Minecraft
« Ответ #1 : 16 Январь 2017, 07:28:41 »
Здравствуйте!

Сейчас попробую объяснить идею проверки аутентификации с использованием каталога LDAP. Вообще, не совсем корректно называть каталог базой данных, скорее это коллекция объектов. Так вот, для проверки аутентификации у вас в каталоге должны быть объекты (в терминологии LDAP они называются записями) пользователей в которых, кроме всего прочего, хранится ещё и логин с паролем, например, такая запись:

dn: uid=ivanov,ou=People,dc=mycompany,dc=ru
objectClass: inetOrgPerson
uid: ivanov
cn: Ivan Ivanov
sn: Ivanov
userPassword: 123

Здесь логин хранится в атрибуте uid, а пароль -- в атрибуте userPassword. В данном случае пароль в открытом виде (123), но чаще всего в каталогах он хранится в хэшированном виде, например, тот же 123:
userPassword: {SSHA}WmnNw6gcYLQGFa+HOtXD6T4sR+yQqw+e

Поскольку из хэша получить обратно пароль нельзя, то общепринятой практикой проверки аутентификации через LDAP является так называемое "простое подсоединение" (Simple Bind) к каталогу: если с помощью полученных откуда-либо логина с паролем можно пройти аутентификацию в каталоге с помощью операции Simple Bind, то эти удостоверяющие данные считаются верными. Единственный момент: в качестве имени пользователя для операции Simple Bind используется полное уникальное имя (DN) записи пользователя, то есть uid=ivanov,ou=People,dc=mycompany,dc=ru. В программном коде, получив логин, такую строчку можно легко составить.

Итак, подразумевая, что нам нужно проверить аутентификацию пользователя в каталоге, где хранится приведённая выше запись, можно написать такую php-функцию:
<?php

if(test_ldap_auth('ivanov','123')) echo "good\n"; else echo "bad\n";

function 
test_ldap_auth($login$password)
{
    
$ldapURI 'ldap://127.0.0.1:389'// URI LDAP-сервера
    
$usersBaseDN 'ou=People,dc=mycompany,dc=ru'// ветка каталога, где хранятся записи пользователей

    
set_error_handler(function($errno$errstr){throw new \Exception($errstr$errno);}, E_WARNING);

    
$result true;

    try
    {
        
$conn ldap_connect($ldapURI); // подключаемся к LDAP-серверу
        
ldap_set_option($connLDAP_OPT_PROTOCOL_VERSION3); // указываем, что используется 3-я версия протокола LDAP
        
ldap_bind($conn'uid=' $login ',' $usersBaseDN $password); // Simple Bind с указанием DN записи и пароля
        
ldap_close($conn); // отключаемся от LDAP-сервера
    
}
    catch(
Exception $e)
    {
        
$result false;
    }

    
restore_error_handler();

    return 
$result;
}
?>


В принципе, всё довольно просто. Если у Вас где-то висит постоянный процесс (демон) аутентификации, то функцию можно оптимизировать, изъяв из тела функции подключение к серверу и отключение  от него (то есть сделать подключение постоянным), а в функции оставить только ldap_bind().

Если возникнут вопросы, пишите.

Егор
« Последнее редактирование: 16 Январь 2017, 09:10:54 от egor »