Интеграция Единого Входа (SSO)

Последнее изменение:

Advanced

Что такое SSO?

Система перекрестной авторизации (Single Sign-On) позволяет Вашим пользователям входить в UserEcho без дополнительной регистрации, используя текущее имя пользователя в Вашем проекте.


Как это работает?

Когда пользователь переходит на Ваш форум, Вы должны передать дополнительный параметр sso_token. Система автоматически распознает параметр и авторизует пользователя, на основании информации с sso_token.

Простой линк выглядит так:

http://mycommunity.userecho.ru/?sso_token=your_sso_token

Для авторизации с виджета Вам необходимо передать аналогичный параметр:

var _ues = {
... ,
sso_token:"Ваш SSO токен"
};


Доступные опции

Параметр Значение Требуется заполнение? Пример Описание
guid Varchar(255) да "1000000" Уникальный идентификатор пользователя на стороне вашего сайта
expires Unix epoch timestamp да 1462245336 Дата истечения срока действия токена в Unix Epoch Timestamp.
Unix Epoch Timestamp Мы рекомендуем добавлять не менее 1 часа от текущего времени.
display_name Varchar(30) да "John Doe" Имя пользователя
email Varchar(255) рекомендуется "john.doe@example.com" Адрес электронной почты пользователя
verified_email Boolean нет False Является email проверенным?
locale Varchar(5) нет "en"
Доступные языки: http://feedback.userecho.ru/topics/8872-available-interface-languages-in-the-userecho/
Язык по умолчанию
avatar_url Varchar(255) нет

Ссылка на изображение аватара пользователя
force_update_avatar Boolean нет False Принудительное обновление аватара пользователя, даже если пользователь уже имеет его.
allowed_private_forums List [forum_id] нет [29966,29965] Список ID форумов. Пользователь будет иметь доступ к этим форумам.
groups List [forum_id] нет [1,2,3] Поместить пользователя в выбранные группы.
Пропустите этот параметр если Вы не используете группы пользователей в Вашем проекте.
Установите ID группы для назначения или 0 чтобы убрать пользователя из группы.
Если Вы передадите параметр, то пользователь будет убран из текущих групп, затем помещен в новые.
custom_fields Dict {field_id:value} нет {"cf_1":"Test value", "cf_2":"on"} Если в Вашем проекте у профиля пользователя есть дополнительные поля, Вы можете передать их через SSO.
Также теперь мы принимаем кастомные поля для топиков. Если вы передаете информацию в таком виде и пользователь создает топик, мы проверяем его последние данные SSO и заполняем поля информацией, предоставленной через SSO.
enable_moderation Boolean нет False Включить модерацию всех публичных сообщений пользователя.


Процесс генерации SSO токена

Вы можете воспользоваться одним из готовых примеров на Python, PHP, Node.js, C#, Go, Ruby. Примеры реализации Вы можете скачать на GitHub. Если этого недостаточно, ниже описание алгоритма, чтобы Вы могли сделать SSO токен на любом языке программмирования самостоятельно.

1. Сформируйте JSON блок с параметрами
json_data = {
    "guid":"1454598",
    "expires":1462245336, 
    "display_name":"John Doe",
    "email":"john.doe@gmail.com",
    "locale":"en",
    "avatar_url":"http://test.com/avatar/1454598.png"
    }    
2. Сохранить как строку
json_string = json.dumps(json_data)    
3. Расширьте строку

Примечание! Некоторые библиотеки шифрования могут сделать это самостоятельно. Если Ваша библиотека делает это, Вы можете пропустить этот шаг.
Добиваем длину блока с конца до числа, кратного размеру блока AES (кратного 16) символами, код которого равен количеству недостающих символов для кратности :) Вот такой хитрый алгоритм. Т.е. размер блока 16. Например у нас строка 44. Следующее кратное 16 число 48. 48-44=4. значит строку добиваем четырьмя символами, код которого 4 (не четверками, а код 4).

    pad = AES.block_size - len(json_string) % AES.block_size
    data = json_string if pad == AES.block_size else json_string + (chr(pad) * pad)    
4. Создание IV

iv - initialisation vector (http://en.wikipedia.org/wiki/Initialization_vector) - необходимо назначить строки по 16 символов, желательно каждый раз разные, для обеспечения безопасности. Мы делаем это случайным образом

iv  = randpool.RandomPool(AES.block_size).get_bytes(AES.block_size)    
5. Шифрование данных с sso_key и IV и объединение IV с зашифрованными данными
  encrypted_bytes = iv + AES.new(sso_key, AES.MODE_CBC, iv).encrypt(data)    
6. Экранируем символы, недопустимые в ссылках
  sso_token = urllib.quote(base64.b64encode(encrypted_bytes))    

Готово!


Эта статья была полезна для 19 людей. Эта статья помогла вам?