[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-setevaya-bezopasnost-kak-rabotaet-oauth-2-0-i-openid-connect":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":16,"progress":17,"seo":18},855,"kak-rabotaet-oauth-2-0-i-openid-connect",24,"setevaya-bezopasnost","Сетевая безопасность","🔒","Как работает OAuth 2.0 и OpenID Connect?","OAuth 2.0 — протокол авторизации, позволяющий приложению получить ограниченный доступ к ресурсам пользователя без передачи его пароля. OpenID Connect (OIDC) — надстройка над OAuth 2.0, добавляющая аутентификацию.\n\n### Роли в OAuth 2.0\n\n| Роль | Описание | Пример |\n|------|----------|--------|\n| Resource Owner | Владелец ресурса (пользователь) | Клиент банка |\n| Client | Приложение, запрашивающее доступ | Мобильное приложение банка |\n| Authorization Server | Сервер авторизации | Keycloak, Auth0 |\n| Resource Server | Сервер с защищёнными ресурсами | API банка (Spring Boot) |\n\n### Authorization Code Flow (основной поток)\n\nИспользуется для серверных веб-приложений. Самый безопасный поток.\n\n\u003Cdetails>\u003Csummary>Схема Authorization Code Flow\u003C\u002Fsummary>\n\n```\nПользователь    Приложение (Client)    Auth Server       API (Resource Server)\n     │               │                    │                    │\n     │── \"Войти\" ───>│                    │                    │\n     │               │── Redirect ───────>│                    │\n     │               │   \u002Fauthorize?       │                    │\n     │               │   response_type=code│                    │\n     │               │   &client_id=XXX    │                    │\n     │               │   &scope=openid     │                    │\n     │\u003C── Страница логина ───────────────│                    │\n     │── логин\u002Fпароль ──────────────────>│                    │\n     │\u003C── Redirect callback?code=CODE ──│                    │\n     │               │── POST \u002Ftoken ───>│                    │\n     │               │   code=CODE        │                    │\n     │               │   client_secret=YYY│                    │\n     │               │\u003C── access_token ──│                    │\n     │               │    refresh_token   │                    │\n     │               │    id_token (OIDC) │                    │\n     │               │── GET \u002Fapi ────────────────────────────>│\n     │               │   Authorization: Bearer access_token    │\n     │               │\u003C── Данные ──────────────────────────────│\n```\n\n\u003C\u002Fdetails>\n\n### Authorization Code + PKCE (для SPA и мобильных приложений)\n\nPKCE (Proof Key for Code Exchange) защищает от перехвата authorization code.\n\n```java\n\u002F\u002F 1. Генерация code_verifier\nString codeVerifier = generateRandomString(128);\n\n\u002F\u002F 2. Вычисление code_challenge\nString codeChallenge = Base64.getUrlEncoder()\n    .withoutPadding()\n    .encodeToString(\n        MessageDigest.getInstance(\"SHA-256\").digest(codeVerifier.getBytes())\n    );\n\n\u002F\u002F 3. Отправка code_challenge в \u002Fauthorize\n\u002F\u002F 4. При обмене code на token отправка code_verifier\n\u002F\u002F Сервер проверяет: SHA256(code_verifier) == code_challenge\n```\n\n### Client Credentials Flow (сервис-к-сервису)\n\nИспользуется для межсервисного взаимодействия без участия пользователя.\n\n```bash\ncurl -X POST https:\u002F\u002Fauth.mybank.com\u002Foauth\u002Ftoken \\\n  -d \"grant_type=client_credentials\" \\\n  -d \"client_id=payment-service\" \\\n  -d \"client_secret=SECRET\" \\\n  -d \"scope=transfer.create transfer.read\"\n```\n\n\u003Cdetails>\u003Csummary>Настройка Client Credentials в Spring Boot\u003C\u002Fsummary>\n\n```java\n@Bean\npublic OAuth2AuthorizedClientManager authorizedClientManager(\n        ClientRegistrationRepository clientRegistrationRepository,\n        OAuth2AuthorizedClientRepository authorizedClientRepository) {\n\n    OAuth2AuthorizedClientProvider provider =\n        OAuth2AuthorizedClientProviderBuilder.builder()\n            .clientCredentials()\n            .build();\n\n    DefaultOAuth2AuthorizedClientManager manager =\n        new DefaultOAuth2AuthorizedClientManager(\n            clientRegistrationRepository, authorizedClientRepository);\n    manager.setAuthorizedClientProvider(provider);\n    return manager;\n}\n```\n\n\u003C\u002Fdetails>\n\n### OpenID Connect (OIDC)\n\nOIDC добавляет к OAuth 2.0:\n- ID Token — JWT с информацией о пользователе (sub, email, name)\n- UserInfo Endpoint — `\u002Fuserinfo` для получения расширенной информации\n- Discovery — `\u002F.well-known\u002Fopenid-configuration` с описанием всех эндпоинтов\n- Стандартные scopes: `openid`, `profile`, `email`\n\n### Настройка Spring Security + OAuth 2.0 Resource Server\n\n```yaml\nspring:\n  security:\n    oauth2:\n      resourceserver:\n        jwt:\n          issuer-uri: https:\u002F\u002Fauth.mybank.com\u002Frealms\u002Fbank\n```\n\n\u003Cdetails>\u003Csummary>Конфигурация SecurityFilterChain\u003C\u002Fsummary>\n\n```java\n@Configuration\n@EnableWebSecurity\npublic class SecurityConfig {\n\n    @Bean\n    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {\n        http\n            .authorizeHttpRequests(auth -> auth\n                .requestMatchers(\"\u002Fapi\u002Fpublic\u002F**\").permitAll()\n                .requestMatchers(\"\u002Fapi\u002Faccounts\u002F**\").hasRole(\"MANAGER\")\n                .requestMatchers(\"\u002Fapi\u002Fadmin\u002F**\").hasRole(\"ADMIN\")\n                .anyRequest().authenticated()\n            )\n            .oauth2ResourceServer(oauth2 -> oauth2\n                .jwt(jwt -> jwt\n                    .jwtAuthenticationConverter(jwtAuthenticationConverter())\n                )\n            );\n        return http.build();\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\nВ банках OAuth 2.0 \u002F OIDC является стандартом для аутентификации пользователей и авторизации межсервисных запросов. Как правило, используется Keycloak или аналогичный сервер авторизации.\n\n> **На собеседовании:** интервьюер хочет услышать про роли (Resource Owner, Client, Auth Server, Resource Server), описание Authorization Code Flow и понимание разницы между OAuth 2.0 (авторизация) и OIDC (аутентификация). Частая ошибка — путать аутентификацию и авторизацию и не знать Client Credentials Flow для межсервисного взаимодействия.","","senior",[15],"network-security",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":23,"featuredSnippetReady":24},"Как работает OAuth 2.0 и OpenID Connect? — Gymterview","OAuth 2.0 — протокол авторизации, позволяющий приложению получить ограниченный доступ к ресурсам пользователя без передачи его пароля. OpenID Connect (OIDC) — н","OAuth 2.0 — протокол авторизации, позволяющий приложению получить ограниченный доступ к ресурсам пользователя без переда",[15,13],"OAuth 2.0 — протокол авторизации, позволяющий приложению получить ограниченный доступ к ресурсам пользователя без передачи его пароля. OpenID Connect (OIDC) — надстройка над OAuth 2.0, добавляющая аутентификацию.",true]