Вход для других сайтов (OpenID Connect)
Ваш сайт умеет быть «поставщиком входа»: человек, у которого есть учётная запись у вас, может войти под ней на другом сайте (вашем втором проекте, магазине, форуме партнёра) — без нового пароля на том сайте. Так работают кнопки «Войти через …» у больших сервисов.
Раздел: Админка → Интеграции → Вход для других сайтов. По умолчанию он выключен: пока вы не включили, адреса поставщика отвечают «не найдено», в страницах нет ни ссылок, ни кнопок.
Что откроется, когда вы включите
- Люди с учётной записью у вас смогут входить на подключённые сайты, нажав «Разрешить» на странице согласия (она показывает название сайта и адрес, куда человек вернётся).
- Чужой сайт получает не пароль, а подписанное подтверждение «это вы» и (только с согласия человека) имя, ник, язык, картинку и подтверждённую почту.
- Каждому чужому сайту человек известен под своим номером: два сайта не могут сопоставить одного человека по этому номеру.
- Человек в любой момент отзывает разрешение в кабинете («Подключённые сайты»); вы можете отозвать у конкретного сайта всё сразу.
Перед включением добавьте в политику конфиденциальности абзац о том, что при входе через ваш сайт подключённым сайтам передаются имя, ник, язык, картинка и подтверждённая почта — только с согласия человека.
Условия включения
- Адрес сайта в настройках —
https://…(на проверочном стенде допустимhttp://127.0.0.1). - Есть ключ сайта (
app.key) — им шифруется ключ подписи. - На хостинге работает расширение
openssl. - Нужно право «менять настройки» и пароль ещё раз.
Смена app.key или перенос базы на сайт с другим ключом обнуляет ключ подписи: он создастся заново, подключённые сайты подтянут новый набор ключей сами.
Как подключить свой сайт
- В разделе нажмите «Добавить клиента», впишите название и точные адреса возврата (по одному в строке):
https://shop.example/auth/callback. Подстановочных знаков (*), адресов с#иhttp://нет. Тип: «с секретом» (серверное приложение) или «открытый» (одностраничное приложение, секрета нет — защищает PKCE). - Скопируйте
client_idиclient_secret— секрет показывается один раз; потеряли — нажмите «Новый секрет». - В настройках чужого сайта (любая библиотека OpenID Connect) укажите адрес поставщика — адрес вашего сайта. Всё остальное библиотека найдёт сама по
https://ваш-сайт/.well-known/openid-configuration. - Области:
openid(обязательна),profile(имя, ник, язык, картинка),email(подтверждённая почта).
Если библиотеки нет, поток такой (код авторизации + PKCE):
- Сайт создаёт случайный
code_verifierи считаетcode_challenge = BASE64URL(SHA256(code_verifier)). - Отправляет человека на
…/oauth/authorize?client_id=…&redirect_uri=…&response_type=code&scope=openid%20profile%20email&state=…&code_challenge=…&code_challenge_method=S256&nonce=…. Нужны все параметры;stateи PKCES256обязательны,plainне поддерживается. - После согласия человек возвращается на
redirect_uriсcode,stateиiss. Сайт сверяетstateиiss. - Сервер сайта обменивает код:
POST …/oauth/token(grant_type=authorization_code,code,redirect_uri,code_verifier; секрет — заголовкомAuthorization: Basicили полемclient_secret). Код живёт 60 секунд и используется один раз; повторное предъявление отзывает всё, что выдано по нему. - В ответе
id_token(RS256) иaccess_token(10 минут).id_tokenпроверяется по ключам из/.well-known/jwks.json:iss,aud(вашclient_id),exp,nonce, подпись. Постоянный номер человека на вашем сайте —sub. - Данные профиля:
GET …/oauth/userinfoс заголовкомAuthorization: Bearer <access_token>(токен в адресе не принимается). - Отозвать токен:
POST …/oauth/revoke(token, секрет клиента).
Обновляющих токенов (refresh_token) в первом выпуске нет: после 10 минут сайт отправляет человека на вход заново (если разрешение действует, человек не видит вопроса).
Что запрещено нарочно
- Учётные записи с доступом в панель и владелец не входят через другие сайты, пока вы не отметили «Пускать учётки с доступом в панель» у конкретного сайта; и им нужен свежий вход (до 10 минут) — или пароль ещё раз. Если у такой учётной записи включена вторая проверка, пароль её не заменяет: сайт получит ответ
login_required, человек входит заново и повторяет. - Страницы авторизации и согласия нельзя встроить во фрейм;
prompt=noneво фрейме не работает. - Согласие обязательно для всех сайтов; оно действует 12 месяцев; новая область — новое согласие.
- Адреса
http://на боевом сайте не работают никогда (флаг «разработка» действует только на проверочном стенде). - Заблокированный, удалённый человек, смена пароля, смена второй проверки, отзыв согласия, выключение сайта — токены перестают работать сразу.
Если что-то пошло не так
- «Войти не получится»: клиент неизвестен/выключен, адрес возврата не совпал буква в букву, нет
state— смотрите раздел «Вход для других сайтов» и настройки чужого сайта. - Ответы с ошибкой приходят на адрес возврата в
error=…(invalid_request,invalid_scope,access_denied,login_required,consent_required,unsupported_response_type); у/oauth/token—invalid_client,invalid_grant,unsupported_grant_typeбез подробностей. - Журнал безопасности:
oauth.consent_granted,oauth.consent_denied,oauth.consent_revoked,oauth.code_replayed(повторный код — повод проверить сайт-клиент),oauth.confirm_failed. Журнал админки: создание, изменение и выключение клиентов, смена секрета и ключа, «отозвать у всех». Всем владельцам уходит письмо о каждом таком действии. - Смена ключа подписи («Сменить ключ подписи» в разделе) безопасна: прежний ключ остаётся в наборе ещё два часа, пока не истекут выданные токены.
Обновлено 17.10.2026
Пока никто не высказался. Будьте первым.