Зарегистрируйте сайт
Установите OAuth из каталога Znosin, откройте «Мои сайты» и добавьте сайт. Один аккаунт может владеть 20 интеграциями. Для организации используйте отдельный аккаунт владельца, задайте пароль и проверяйте подключённые устройства.
Сайт с сервером
Конфиденциальный клиент использует client_secret_basic. Сохраните Client Secret в хранилище секретов на сервере: он показывается только один раз.
Браузерное приложение
Публичный клиент использует метод аутентификации none, без Client Secret. Не передавайте PKCE verifier и токены в URL и не записывайте их в логи.
Укажите до 10 точных адресов возврата. Обязателен HTTPS; HTTP допускается только для localhost, 127.0.0.1 и [::1]. Маски, фрагменты и учётные данные в URL запрещены. По возможности разделяйте интеграции для разработки и продакшена.
Client ID — публичный идентификатор. Смена Client Secret сразу отзывает старый секрет, коды и токены доступа. Изменение адресов возврата или отключение клиента также отзывает выданный доступ. Не помещайте секреты в Git, клиентский код и скриншоты.
Настройте OIDC-библиотеку
| Параметр | Значение |
|---|---|
| Issuer | https://znosin.com |
| Discovery | https://znosin.com/.well-known/openid-configuration |
| Сценарий авторизации | authorization_code · response_type=code · response_mode=query |
| Разрешения | openid profile email |
| PKCE | S256, обязателен для обоих типов клиента |
| Подпись ID-токена | RS256; открытые ключи по jwks_uri из документа discovery |
Перед перенаправлением создайте независимые криптографически случайные state, nonce и code_verifier. Сохраните их в серверной сессии посетителя, а для публичного клиента — в сессии браузера. State и nonce: 16–512 символов, используйте не менее 32 случайных байтов. Verifier: 43–128 незарезервированных ASCII-символов. Не используйте одну попытку входа повторно.
GET https://znosin.com/authorize?
client_id=YOUR_CLIENT_ID&
redirect_uri=EXACT_REGISTERED_URL&
response_type=code&scope=openid%20profile%20email&
state=RANDOM_STATE&nonce=RANDOM_NONCE&
code_challenge=BASE64URL_SHA256_VERIFIER&
code_challenge_method=S256Кодируйте каждое значение параметра для URL. Разрешение openid обязательно. Поддерживается необязательный prompt=consent. Скрытый вход, принудительная повторная аутентификация через max_age, request objects и другие response modes не поддерживаются.
Обработайте возврат на сайт
- Используйте сохранённую попытку входа один раз. Проверьте исходный
state, срок действия и точное совпадениеissс issuer. Приerror=access_deniedне создавайте сессию. Не используйте непроверенные параметры callback как адрес перенаправления. - Обменяйте код в течение 60 секунд: POST с данными формы на
/oauth/token. Передайтеgrant_type,client_id,redirect_uri,codeиcode_verifier. Код одноразовый. Конфиденциальный клиент также использует HTTP Basic: отдельно закодируйте Client ID и Client Secret как значения формы, соедините двоеточием и примените Base64. Секрет в теле запроса не принимается. - Через OIDC-библиотеку проверьте подпись RS256, точный issuer, audience, срок действия, время выпуска и nonce из сессии. Если есть
azp, проверьте и его. Простого декодирования JWT недостаточно. - Найдите или создайте локального пользователя по паре
iss+sub, затем смените идентификатор локальной сессии. Ник, имя и почта могут изменяться — они не подходят для идентификации аккаунта.
POST https://znosin.com/oauth/token
Content-Type: application/x-www-form-urlencoded
Authorization: Basic BASE64_FORM_ENCODED_ID_AND_SECRET
grant_type=authorization_code&
client_id=YOUR_CLIENT_ID&
redirect_uri=EXACT_REGISTERED_URL&
code=AUTHORIZATION_CODE&
code_verifier=ORIGINAL_VERIFIERВ примере используются заглушки, а не настоящие секреты. Публичный клиент не передаёт заголовок Authorization. Для обоих типов обязательны исходный PKCE verifier и точный зарегистрированный адрес возврата. Кодируйте все значения тела как данные формы.
Профиль и разрешения
В ответе приходят ID-токен на 5 минут и непрозрачный токен доступа на 1 час. Запрашивайте /oauth/userinfo с Authorization: Bearer ACCESS_TOKEN. Его sub должен совпадать с проверенным ID-токеном.
| Разрешение | Возвращаемые поля |
|---|---|
openid | sub |
profile | name, preferred_username, picture (публичный URL аватара) |
email | email, email_verified |
Сейчас email_verified равен false. Создание почтового ящика не является проверкой владения адресом. Не привязывайте непроверенную почту к существующему аккаунту с паролем или другим провайдером автоматически. Сначала попросите пользователя войти в существующий аккаунт.
Пароли, переписки, содержимое почты, файлы и права агентов не передаются. Пользователь может отозвать доступ в профиле, в разделе выданного сайтам доступа. Это блокирует UserInfo и новые обмены кодов, но не завершает сессию вашего сайта и не отменяет уже выданный ID-токен, проверяемый без сети. Сроки сессий и выходом управляет ваш сайт.
Эксплуатация и ограничения
CORS публичных клиентов разрешён только для точных origin зарегистрированных адресов возврата. Конфиденциальный клиент обменивает код между серверами. Не пересылайте Basic-заголовок на JWKS, UserInfo или при редиректах. Храните только нужный доступ, скрывайте коды и токены в логах и ограничивайте частоту callback-запросов. Лимиты token endpoint действуют по IP; при HTTP 429 учитывайте Retry-After.
Управление требует браузерной сессии владельца Znosin с проверкой Origin. Токены агентов не позволяют регистрировать сайты или подтверждать доступ. Самостоятельная регистрация проходит через OAuth-приложение, а не через анонимную динамическую регистрацию клиентов. Название задаёт владелец сайта; это не знак проверки. При согласии показывается фактический origin адреса возврата.
Реализован ограниченный профиль OIDC code flow, без сертификации OpenID Conformance. Refresh tokens, общий выход из сайтов, PAR, DPoP и автоматическая ротация RSA-ключей пока не реализованы. Существующие публичные клиенты продолжают поддерживаться.