N1 Nex1on

Вход для других сайтов (OpenID Connect)

Ваш сайт умеет быть «поставщиком входа»: человек, у которого есть учётная запись у вас, может войти под ней на другом сайте (вашем втором проекте, магазине, форуме партнёра) — без нового пароля на том сайте. Так работают кнопки «Войти через …» у больших сервисов.

Раздел: Админка → Интеграции → Вход для других сайтов. По умолчанию он выключен: пока вы не включили, адреса поставщика отвечают «не найдено», в страницах нет ни ссылок, ни кнопок.

Что откроется, когда вы включите

  • Люди с учётной записью у вас смогут входить на подключённые сайты, нажав «Разрешить» на странице согласия (она показывает название сайта и адрес, куда человек вернётся).
  • Чужой сайт получает не пароль, а подписанное подтверждение «это вы» и (только с согласия человека) имя, ник, язык, картинку и подтверждённую почту.
  • Каждому чужому сайту человек известен под своим номером: два сайта не могут сопоставить одного человека по этому номеру.
  • Человек в любой момент отзывает разрешение в кабинете («Подключённые сайты»); вы можете отозвать у конкретного сайта всё сразу.

Перед включением добавьте в политику конфиденциальности абзац о том, что при входе через ваш сайт подключённым сайтам передаются имя, ник, язык, картинка и подтверждённая почта — только с согласия человека.

Условия включения

  • Адрес сайта в настройках — https://… (на проверочном стенде допустим http://127.0.0.1).
  • Есть ключ сайта (app.key) — им шифруется ключ подписи.
  • На хостинге работает расширение openssl.
  • Нужно право «менять настройки» и пароль ещё раз.

Смена app.key или перенос базы на сайт с другим ключом обнуляет ключ подписи: он создастся заново, подключённые сайты подтянут новый набор ключей сами.

Как подключить свой сайт

  1. В разделе нажмите «Добавить клиента», впишите название и точные адреса возврата (по одному в строке): https://shop.example/auth/callback. Подстановочных знаков (*), адресов с # и http:// нет. Тип: «с секретом» (серверное приложение) или «открытый» (одностраничное приложение, секрета нет — защищает PKCE).
  2. Скопируйте client_id и client_secret — секрет показывается один раз; потеряли — нажмите «Новый секрет».
  3. В настройках чужого сайта (любая библиотека OpenID Connect) укажите адрес поставщика — адрес вашего сайта. Всё остальное библиотека найдёт сама по https://ваш-сайт/.well-known/openid-configuration.
  4. Области: openid (обязательна), profile (имя, ник, язык, картинка), email (подтверждённая почта).

Если библиотеки нет, поток такой (код авторизации + PKCE):

  1. Сайт создаёт случайный code_verifier и считает code_challenge = BASE64URL(SHA256(code_verifier)).
  2. Отправляет человека на …/oauth/authorize?client_id=…&redirect_uri=…&response_type=code&scope=openid%20profile%20email&state=…&code_challenge=…&code_challenge_method=S256&nonce=…. Нужны все параметры; state и PKCE S256 обязательны, plain не поддерживается.
  3. После согласия человек возвращается на redirect_uri с code, state и iss. Сайт сверяет state и iss.
  4. Сервер сайта обменивает код: POST …/oauth/token (grant_type=authorization_code, code, redirect_uri, code_verifier; секрет — заголовком Authorization: Basic или полем client_secret). Код живёт 60 секунд и используется один раз; повторное предъявление отзывает всё, что выдано по нему.
  5. В ответе id_token (RS256) и access_token (10 минут). id_token проверяется по ключам из /.well-known/jwks.json: iss, aud (ваш client_id), exp, nonce, подпись. Постоянный номер человека на вашем сайте — sub.
  6. Данные профиля: GET …/oauth/userinfo с заголовком Authorization: Bearer <access_token> (токен в адресе не принимается).
  7. Отозвать токен: 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

На этой странице
Поделиться: Telegram WhatsApp
Откладывать можно и без входа: закладки сохранятся в этом браузере, а после входа их можно перенести в учётную запись. Вход
Обсуждение

Комментарии

Обсуждение ещё не началось

Пока никто не высказался. Будьте первым.

Пожаловаться на запись