> > > >

Спецификация систем авторизации

Сообщения
183
Рейтинг
189
#1

Описанная ниже спецификация предоставляет гибкие возможности для разработчиков плагинов.
Названия методов даны в обобщенном виде, без привязки к конкретному плагину (или его названию) и рекомендованы к написанию именно в таком виде.
Прошу меня поправить, если чего-то не хватает/нужно исправить.

В ближайшее время (в течении двух-трёх недель) я начну реализовывать плагин по этой спецификации.


Константы:
C:
#define NICK_LENGTH 32
#define STEAM_LENGTH 24
#define IP_LENGTH 16
#define CACHE_LENGTH 65
Квары:
auth_identify_by [a/b/c/d] - Идентифицировать пользователя по признаку (см. AuthFlags).
auth_security_sault - соль, используемая в хешировании

Структуры/enum:
C:
// Результат работы форварда - для определения дальнейшей обработки события
enum
{
    AUTH_CONTINUE = 0,
    AUTH_SUPERCEDE
};

// Статус авторизации игрока
enum AuthStatus {
        AUTH_NULL = 0,                  // Значение не задано
        AUTH_NOT_REGISTERED = 1,        // Пользователь не зарегистрирован
        AUTH_SUCCESS,                   // Пользователь авторизован
        AUTH_FAIL,                      // Пользователь не авторизован
        AUTH_EMPTY                      // Абонет не абонент (пустой слот)
};

// Флаги авторизации (по каким полям проверять авторизацию пользователя)
enum AuthFlags (<<=1) {
        AFLAG_NULL = 0,    // Значение не задано
        AFLAG_NICK = 1,    // По нику (a)
        AFLAG_STEAM,       // SteamID (b)
        AFLAG_IP,          // IP адресу (c)
        AFLAG_PASS         // Паролю (d)
};

// Действия при ошибке авторизации
enum AuthFailActions(<<=1) {
        AFAIL_NULL = 0, // Значение не задано
        AFAIL_KICK = 1,  // Кикнуть игрока
        AFAIL_BAN,       // Забанить игрока
        AFAIL_LOG        // Занести действие в лог
}



// Структура, в которой хранится вся необходимая информация об игроке
enum UserStruct {
        us_user_id,                     // ID зарегистрированного пользователя
        us_nickname[NICK_LENGTH],       // Имя пользователя
        us_steam[STEAM_LENGTH],         // SteamID
        us_ip[IP_LENGTH],               // IP адрес
        us_password[CACHE_LENGTH],      // Пароль
        AuthFailActions:us_authfail,    // Действия при ошибке авторизации
        AuthFlags:us_authflags,         // Правила аутентификации пользователя
        AuthStatus:us_authstatus,       // Статус авторизации
        us_accessflags                  // Права доступа игрока
}

Нативы плагина:
C:
/**
* Метод возвращает статус игрока (см. AuthStatus)
* @param playerID - номер игрока на сервере
* @return AuthStatus - статус авторизации игрока
*/
native AuthStatus:auth_player_status(playerID);

/**
* Метод возвращает ID зарегистрированного игрока по его номеру
* @param playerID - номер игрока на сервере
* @return user_id - номер зарегистрированного пользователя. 0 - пользователь не найден/не авторизован
*/
native auth_get_byplayer(playerID);

/**
* Метод регистрирует нового пользователя
* @usage auth_adduser(.username="YoNick", .password="yoSecretPass");
* @usage auth_adduser(.steam="STEAM_1:0:012345", .ip="127.0.0.1", .authfail=AFAIL_KICK);
* @return user_id - номер зарегистрированного пользователя
*/
native auth_adduser(user_id=0, username[NICK_LENGTH]=" ", steam[STEAM_LENGTH]=" ", ip[IP_LENGTH]=" ", password[CACHE_LENGTH]=" ", authfail=0, authflags=0, accessflags=0, data[UserStruct] = user_proto);

/**
* Метод получает данные пользователя по ключу
* @usage auth_getuser(.username="YoNick", .password="yoSecretPass", .ret=yo_array);
* @usage auth_getuser(.steam="STEAM_1:0:012345",.ret=yo_array);
* @usage auth_getuser(.user_id=5,.ret=yo_array);
*/
native auth_getuser(user_id=0, username[NICK_LENGTH]=" ", steam[STEAM_LENGTH]=" ", ip[IP_LENGTH]=" ", password[CACHE_LENGTH]=" ", data[UserStruct] = user_proto);

/**
* Метод удаляет пользователя
* @param user_id - ID зарегистрированного пользователя
* @return bool:result - успешность выполнения операции
*/
native auth_deluser(user_id);

/**
* Метод изменяет пользователя
* @param user_id - ID зарегистрированного пользователя
* <...>
* @usage auth_adduser(.user_id=10, .steam="STEAM_1:0:012345", .ip="127.0.0.1", .authfail=AFAIL_KICK);
*/
native auth_usermod(user_id=0, username[NICK_LENGTH]=" ", steam[STEAM_LENGTH]=" ", ip[IP_LENGTH]=" ", password[CACHE_LENGTH]=" ", authfail=-1, authflags=-1, accessflags=-1, data[UserStruct] = user_proto);

/**
* Метод получает кешированную информацию о пользователе
* @param player_id - номер игрока на сервере
* @param user[UserStruct] - структура, в которую будет записана информация о пользователе
*/
native auth_get_playerinfo(player_id, ret[UserStruct]);

/**
* Метод задаёт кешированную информацию о пользователе
* @param player_id - номер игрока на сервере
* @param user[UserStruct] - структура, которая будет записана
*/
native auth_set_playerinfo(player_id, username[NICK_LENGTH]=" ", steam[STEAM_LENGTH]=" ", ip[IP_LENGTH]=" ", password[CACHE_LENGTH]=" ", authfail=-1, authflags=-1, accessflags=-1, data[UserStruct] = user_proto);

/**
* Метод заносит информацию о пользователе в базу данных
* @param player_id - номер игрока на сервере
*/
native auth_flush_playerinfo(player_id);

/**
* Метод позволяет форсировать авторизацию игрока
* @param player_id - номер игрока на сервере
* @param user_id - номер зарегистрированного игрока
* @param skip_checks - пропускать проверки подлинности
* @return bool: result - успешность операции
*/
native auth_force_login(player_id, user_id, skip_checks = true);

/**
* Метод позволяет форсировать выход игрока
* @param player_id - номер игрока на сервере
* @return bool: result - успешность операции
*/
native auth_force_logout(player_id);

События:
C:
/**
* Метод вызывается перед сменой статуса
* @param player_id - номер игрока
* @param AuthStatus: new_status - новый статус
* @param AuthStatus: old_status - старый статус
* @param user_id - номер зарегистрированного пользователя (0 - если пользователь не был авторизован)
* @return AUTH_SUPERCEDE - какой-то плагин заблокировал смену статуса
*         AUTH_CONTINUE - продолжаем действие
*/
forward auth_check(player_id, new_status, old_status, user_id);

/**
* Метод вызывается при смене статуса авторизации
* @param player_id - номер подключающегося игрока
* @param AuthStatus: new_status - новый статус
* @param AuthStatus: old_status - старый статус
* @param user_id - номер зарегистрированного пользователя (0 - если пользователь не был авторизован)
*/
forward auth_status_change(player_id, new_status, old_status, user_id);
 
Последнее редактирование:
  1
Сообщения
183
Рейтинг
189
#2
Господа заинтересованные, я надеюсь на вашу помощь. Нужно продумать и описать интерфейс, чтобы можно была возможность гибко разработать взаимодействие с другой СУБД.

- Возможность потокового вызова

Код:
// CRUD методы
storage_create_user(...)
storage_find_user(...)
storage_modify_user(...)
storage_delete_user(...)

// Инициализация БД, вызывается при старте плагина
storage_init(...).
 
Последнее редактирование:
  1
Сообщения
1.822
Рейтинг
1345
#3
BoecSpecOPs, я у себя пока-что продумал таким способом.
Главный плагин подключает необходимый #include (в зависимости от параметров компиляции) и в этих инклудах содержатся подготовленные функции для:
Каждый инклуд для хранилища имеет собственные методы для обработки связи с хранилищем, однако результат, отдаваемый главному плагину - един.
 
 
Сообщения
183
Рейтинг
189
#4
wopox1337, в общем случае так и запланировано. Сейчас нужно продумать детали реализации, чтобы не менять в последствии интерфейс для взаимодействия с БД.
P.S> сейчас гляну у тебя исходники, мб чего почерпну от туда.
 
  1
Сообщения
183
Рейтинг
189
#5
DEVCS-2102-31244 (Утверждено 17 Мая 2018 г.)


В связи с замечаниями Mistrick (#) безотлагательно переделан API.
Суть теперь заключается в том, чтобы задавать пары ключ-значение, где это необходимо.

Константы:
C:
#define NICK_LENGTH 32
#define STEAM_LENGTH 24
#define IP_LENGTH 16
#define CACHE_LENGTH 65
Квары:
auth_identify_by [a/b/c/d] - Идентифицировать пользователя по признаку (см. AuthFlags).
auth_security_sault - соль, используемая в хешировании

Структуры/enum:
C:
// Результат работы форварда - для определения дальнейшей обработки события
enum
{
    AUTH_CONTINUE = 0,
    AUTH_SUPERCEDE
};

// Статус авторизации игрока
enum AuthStatus {
        AUTH_NULL = 0,                  // Значение не задано
        AUTH_NOT_REGISTERED = 1,        // Пользователь не зарегистрирован
        AUTH_SUCCESS,                   // Пользователь авторизован
        AUTH_FAIL,                      // Пользователь не авторизован
        AUTH_EMPTY                      // Абонет не абонент (пустой слот)
};

// Флаги авторизации (по каким полям проверять авторизацию пользователя)
enum AuthFlags (<<=1) {
        AFLAG_NULL = 0,    // Значение не задано
        AFLAG_NICK = 1,    // По нику (a)
        AFLAG_STEAM,       // SteamID (b)
        AFLAG_IP,          // IP адресу (c)
        AFLAG_PASS         // Паролю (d)
};

// Действия при ошибке авторизации
enum AuthFailActions(<<=1) {
        AFAIL_NULL = 0, // Значение не задано
        AFAIL_KICK = 1,  // Кикнуть игрока
        AFAIL_BAN,       // Забанить игрока
        AFAIL_LOG        // Занести действие в лог
}



// Структура, в которой хранится вся необходимая информация об игроке
enum UserStruct {
        us_user_id,                     // ID зарегистрированного пользователя
        us_nickname[NICK_LENGTH],       // Имя пользователя
        us_steam[STEAM_LENGTH],         // SteamID
        us_ip[IP_LENGTH],               // IP адрес
        us_password[CACHE_LENGTH],      // Пароль
        AuthFailActions:us_authfail,    // Действия при ошибке авторизации
        AuthFlags:us_authflags,         // Правила аутентификации пользователя
        AuthStatus:us_authstatus,       // Статус авторизации
        us_accessflags                  // Права доступа игрока
}
Нативы плагина (API):
Код:
/**
* Метод возвращает статус игрока (см. AuthStatus)
* @Param playerID - номер игрока на сервере
* @return AuthStatus - статус авторизации игрока
*/
native AuthStatus:auth_player_status(player_id);

/**
* Метод возвращает ID зарегистрированного игрока по его номеру
* @Param playerID - номер игрока на сервере
* @return user_id - номер зарегистрированного пользователя. 0 - пользователь не найден/не авторизован
*/
native auth_get_byplayer(player_id);

/**
* Метод регистрирует нового пользователя с помощью передачи пар ключ-значение (См. UserStruct)
* @Param UserStruct:api_key; - ключ
* @Param any:value;          - значение
* @OptParam [...];           - последовательность пар ключ-значение
* @OptParam callback[];      - имя функции для обратного вызова и возврата результата
* @return user_id            - номер пользователя в БД. 0 - в случае неудачи
*
* @callback(user_id);        - функция, имя которой передано для обратного вызова и её параметры
*
* @usage auth_adduser(api_key, value[, api_key, value[...], callback[] = ""]);
* @usage auth_adduser(UserStruct, user);
* @usage auth_adduser(us_nickname, "YoNickName", us_password, "YoPassword");
*/
native auth_adduser(...);

/**
* Метод получает данные пользователя(-лей) по парам ключ-значение
* @Param UserStruct:api_key; - ключ
* @Param any:value;          - значение
* @OptParam[...];            - последовательность пар ключ-значение
* @OptParam callback[];      - имя функции для обратного вызова и возврата результата
* @return Array:h_array       - массив найденных пользователей по заданным ключам
*
* @callback(Handle:array);   - функция обратного вызова, будет передан параметр Handle с результатами
*/
native any:auth_getuser(...);

/**
* Метод удаляет пользователя(-лей) из БД по заданным данным
* @Param UserStruct:api_key; - ключ
* @Param any:value;          - значение
* @OptParam[...];            - последовательность пар ключ-значение
* @OptParam callback[];      - имя функции для обратного вызова и возврата результата
* @return count              - количество затронутых записей
*
* @callback(count);          - функция обратного вызова, будет передан параметр с количеством затронутых записей
*/
native auth_deluser(...);

/**
* Метод изменяет пользователя с номером user_id по заданным ключам
* Метод удаляет пользователя из БД
* @Param user_id             - номер пользователя в БД
* @Param UserStruct:api_key; - ключ
* @Param any:value;          - значение
* @OptParam[...];            - последовательность пар ключ-значение
* @OptParam callback[];      - имя функции для обратного вызова и возврата результата
* @return bool:result        - результат выполнения операции
*
* @callback(bool:result);    - функция обратного вызова, будет передан параметр с результатом выполнения операции
*/
native auth_usermod(...);

/**
* Метод получает кешированную информацию о пользователе
* @Param player_id           - номер игрока на сервере
* @Param user[UserStruct]    - структура, в которую будет записана информация о пользователе
*/
native auth_get_playerinfo(...);

/**
* Метод задаёт кешированную информацию о пользователе
* @Param player_id           - номер игрока на сервере
* @Param user[UserStruct]    - структура, которая будет записана
*/
native auth_set_playerinfo(...);

/**
* Метод заносит информацию о пользователе в базу данных
* @Param player_id           - номер игрока на сервере
*/
native auth_flush_playerinfo(...);

/**
* Метод позволяет форсировать авторизацию игрока
* @Param player_id - номер игрока на сервере
* @Param user_id - номер зарегистрированного игрока
* @Param skip_checks - пропускать проверки подлинности
*/
native auth_force_login(...);

/**
* Метод позволяет форсировать выход игрока
* @Param player_id - номер игрока на сервере
*/
native auth_force_logout(...);
События:
C:
/**
* Метод вызывается перед сменой статуса
* @param player_id - номер игрока
* @param AuthStatus: new_status - новый статус
* @param AuthStatus: old_status - старый статус
* @param user_id - номер зарегистрированного пользователя (0 - если пользователь не был авторизован)
* @return AUTH_SUPERCEDE - какой-то плагин заблокировал смену статуса
*         AUTH_CONTINUE - продолжаем действие
*/
forward auth_check(player_id, new_status, old_status, user_id);

/**
* Метод вызывается при смене статуса авторизации
* @param player_id - номер подключающегося игрока
* @param AuthStatus: new_status - новый статус
* @param AuthStatus: old_status - старый статус
* @param user_id - номер зарегистрированного пользователя (0 - если пользователь не был авторизован)
*/
forward auth_status_change(player_id, new_status, old_status, user_id);
 
Последнее редактирование:
 
> > > >