Аутентификация с помощью OAUTH2

From EjudgeWiki

Навигация: Главная страница/Система ejudge/Использование/Аутентификация с помощью OAUTH2

Поддерживается с версии 3.9.0.

Данный документ описывает настройку поддержки аутентификации с помощью протокола OAUTH2.

Поддерживаются два провайдера идентификационной информации: Google и VK. Чтобы добавить новый провайдер необходимо реализовать auth-плагин, который будет поддерживать особенности реализации нового провайдера. Схема OAUTH2 достаточно гибкая, и разные провайдеры реализуют разные допустимые схемы аутентификации.

OAUTH2 требует, чтобы клиент имел доступный из интернета URL по протоколу https. Сайт должен иметь валидный сертификат https, например, от Let's Encrypt. Самоподписанный сертификат не подойдет.

Плагин для реализации OAUTH2 в ejudge использует mysql. Если поддержка mysql не включена, или база ejudge для mysql не развернута, плагин OAUTH2 работать не будет.

Если развернуто несколько инсталляций ejudge, которые доступны по разным URL, для каждой инсталляции ejudge потребуется зарегистрировать отдельное "приложение" на сайте провайдера аутентификации.

Регистрация приложения в Google

Для настройки приложения в google требуется доступ к Google Cloud Platform.

Перейдите в пункт меню APIs & Services / Dashboard. Нажмите кнопку "CREATE PROJECT". Заполните поля "Project name", "Organization", "Location". После создания проекта выберите его вверху слева от "Google Cloud Platform". Выберите вкладку "OAuth Consent Screen". Заполните поля "App Name", "User Support Email", "Developer Contact Information". Нажмите "SAVE AND CONTINUE".

На вкладке Scopes нажмите кнопку "Add or Remove Scopes" и выберите три первых: userinfo.email, userinfo.profile, openid. Это базовые разрешения, они не требуют верификации приложения. Нажмите кнопку UPDATE внизу. В разделе "Your non-sensitive scopes" должны появиться эти три разрешения. Нажмите "SAVE AND CONTINUE".

На вкладке "Test users" можно сразу нажать "SAVE AND CONTINUE". Дальше нажмите "BACK TO DASHBOARD".

Перейдите на вкладку "Credentials". Выберите "+ CREATE CREDENTIALS". Выберите "OAUTH client ID". Заполните "Application type" — "Desktop App". Заполните поле "Name", например, "testsite-io-client". Нажмите "CREATE". Скопируйте значение поля "Your Client ID". Обозначим его google_app_id. Скопируйте значение поля "Your client secret". Обозначим его google_app_secret.

Перейдите на вкладку "OAuth Consent Screen". Нажмите на кнопку "PUBLISH APP".

Регистрация приложения в VK

В левом боковом меню в самом низу выберите пункт "Управление". Вы должны попасть в раздел VK Developers. В меню сверху выберите пункт "Мои приложения". Появится список созданных приложений. Нажмите кнопку "Создать". Введите название, например, "Test Site". В опциях "Платформа" выберите "Сайт". Введите адрес сайта, например, "https://testsite.io". Введите базовый домент, например, "testsite.io". Нажмите кнопку "Создать".

В случае успешного создания вы перейдете на вкладку "Информация" нового приложения. В принципе, на этой странице ничего можно не заполнять. Перейдите на вкладку "Настройки". Сохраните где-нибудь ID приложения (обозначим его vk_app_id) и защищенный ключ (vk_app_secret). Проверьте что адрес сайта и базовый домен правильные. В тематике сайта выберите, например, "Образование".

Самое важное. В поле "Доверенный редирект URI" впишите URI, по которому будет выполняться переход в случае успешной авторизации. Для примера сайта выше это может быть "https://testsite.io/ej/client/oauth-login-2/S2". Часть до /S2, то есть "https://testsite.io/ej/client/oauth-login-2" обозначим как vk_callback. Сохраните измененные настройки приложения.

Настройка apache

Чтобы URI вида HOST/ej/client/PATH передавались в cgi-bin программы ejudge потребуется добавить rewrite правила в конфигурационный файл apache.

В секции конфигурации соответствующего виртуального хоста, либо в глобальной секции найдите директиву вида:

ScriptAlias /cgi-bin/   "PATH/cgi-bin/"

Где PATH какой-то путь в файловой системе. Добавьте ниже директиву:

ScriptAliasMatch ^/ej/.+ PATH/cgi-bin/new-client

Где PATH — тот же самый путь.

Настройка ejudge

В глобальном конфигурационном файле ejudge.xml в раздел плагинов добавьте конфигурацию плагинов для google и VK:

<plugin type="auth" name="google" load="yes">
  <config>
    <client_id>${google_app_id}</client_id>
    <client_secret>${google_app_secret}</client_secret>
    <redirect_uri>${google_callback}</redirect_uri>
  </config>
</plugin>
<plugin type="auth" name="vk" load="yes">
  <config>
    <client_id>${vk_app_id}</client_id>
    <client_secret>${vk_app_secret}</client_secret>
    <redirect_uri>${vk_callback}</redirect_uri>
  </config>
</plugin>

Здесь через ${VAR} обозначена подстановка параметра VAR, определенного при настройке приложения у провайдера аутентификации.

Настройка входа привилегированных пользователей

Чтобы привилегированные пользователи могли входить в ejudge через OAUTH2 аутентификацию потребуется следующая настройка:

Добавить атрибут enable_oauth в элемент config в конфигурационный файл ejudge.xml примерно следующим образом:

<config enable_oauth="yes" ...>

В конфигурационный файл capabilities.xml, который находится в том же каталоге, что ejudge.xml, добавить таблицу отображений внешних OAUTH2 идентификаторов пользователей во внутренние:

<oauth_user_map>
  <oauth_entry oauth_user="EXT-ID-1" local_user="LOCAL-LOGIN-1" />
  <oauth_entry oauth_user="EXT-ID-2" local_user="LOCAL-LOGIN-2" />
</oauth_user_map>

EXT-ID — это идентификатор пользователя у провайдера аутентификации. В случае google — это email, например, user@gmail.com. В случае VK — это заданный при регистрации email, либо идентификатор вида user${VK-ID}@vk, где VK-ID — идентификатор пользователя VK.

LOCAL-LOGIN — это логин пользователя в ejudge, например, ejudge.

Настройка входа пользователей в турнир

Аутентификация пользователей по OAUTH2 разрешается в каждом турнире по отдельности. Для этого нужно установить атрибут enable_oauth элемента contest в файле contest.xml. Конфигурационный файл будет выглядеть примерно так:

<contest id="auto"
         enable_oauth="yes"
         ...

Если доступ к программе register разрешен с помощью правила register_access, на турнир смогут регистрироваться новые пользователи. Иначе в турнир смогут заходить только уже зарегистрированные пользователи.

Дополнительные ограничения на вход с помощью OAUTH2 можно задать с помощью элемента oauth_rules. Например,

<oauth_rules>
  <oauth_rule domain="school.ru" allow="yes" strip_domain="yes" />
  <oauth_rule domain="" deny="yes" />
</oauth_rules>

в турнир с помощью OAUTH2 смогут заходить только пользователи с почтовым адресом вида USER@school.ru, при этом в системе ejudge им будет соответствовать логин USER</code. Вход остальных пользователей с помощью OAUTH2 запрещен.

Особенности создания пользователей с помощью OAUTH2

Если в турнире открыт доступ к программе регистрации register, причем регистрация может быть как свободная, так и модерируемая, то пользователи, входящие по OAUTH2 будут автоматически зарегистрированы в данный турнир, если такой логин еще не существовал.

Для пользователей, созданных при входе по OAUTH2, в поле email и в поле login прописывается OAUTH-идентификатор пользователя (обычно это адрес электронной почты). Генерируется случайный 16-символьный пароль, который в базу сохраняется в хешированном виде. Таким образом пользователь, зарегистрировавшийся с помощью OAUTH2, в дальнейшем в ejudge сможет входить только с помощью OAUTH2.