Интеграция Единого Входа (SSO)
Последнее изменение:
Что такое 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" | Имя пользователя |
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 токен на любом языке программмирования самостоятельно.
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))
Готово!