Невозможно разрешить конфигурацию с указанным эмитентом: невозможно настроить клиент OAuth. ⇐ JAVA
Невозможно разрешить конфигурацию с указанным эмитентом: невозможно настроить клиент OAuth.
В целях обучения я решил создать пример приложения, состоящего из трех сервисов (модулей Java).
[*]Сервер авторизации OAuth 2 [*]сервер ресурсов [*]Клиент OAuth 2
У меня не возникло серьезных проблем с первыми двумя из них, но я потратил последние несколько часов, пытаясь понять, как создать действительный клиент OAuth 2, но продолжаю получать эту ошибку: Невозможно разрешить конфигурацию с указанным эмитентом «http://localhost:9000».
Поскольку я понятия не имею, в чем проблема, я предоставлю весь необходимый контекст всех трех сервисов.
Вот конфигурация сервера ресурсов.
[*]application.yml
сервер: порт: 8080 весна: безопасность: оаут2: сервер ресурсов: просто: эмитент-uri: "http://localhost:9000" jwk-set-uri: "http://localhost:9000/oauth2/jwks" [*]Конфигурация безопасности @Configuration @EnableWebSecurity общественный класс SecurityConfig { @Бин MvcRequestMatcher.Builder mvc(HandlerMappingIntrospector интроспектор) { вернуть новый MvcRequestMatcher.Builder(интроспектор); } @Бин @Заказ(1) public SecurityFilterChain filterChain (HttpSecurity http, MvcRequestMatcher.Builder mvc) выдает исключение { http // БЕЗОПАСНОСТЬ .csrf(CsrfConfigurer::отключить) .headers(заголовки -> заголовки .frameOptions(HeadersConfigurer.FrameOptionsConfig::disable)) // РИСК .authorizeHttpRequests((auth) -> аутентификация .requestMatchers(mvc.pattern("/data-api/users")).denyAll() .requestMatchers(mvc.pattern("/data-api/users/**")).denyAll() .requestMatchers(mvc.pattern("/data-api/taco-orders")).denyAll() .requestMatchers(mvc.pattern("/data-api/taco-orders/**")).denyAll() .requestMatchers(mvc.pattern(HttpMethod.POST, "/data-api/tacos")).authenticated() .requestMatchers(mvc.pattern(HttpMethod.DELETE, "/data-api/tacos/**")).denyAll() .requestMatchers(mvc.pattern(HttpMethod.POST, "/data-api/ingredients")).hasAuthority("SCOPE_ingredients.write") .requestMatchers(mvc.pattern(HttpMethod.DELETE, "/data-api/ingredients/**")).hasAuthority("SCOPE_ingredients.delete") .requestMatchers(mvc.pattern("/design"), mvc.pattern("/orders")).hasRole("ПОЛЬЗОВАТЕЛЬ") .requestMatchers(mvc.pattern("/"), mvc.pattern("/**")).permitAll() .requestMatchers(toH2Console()).permitAll() .anyRequest().аутентифицированный()) .oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults())) .formLogin((formLogin) -> formLogin .loginPage("/логин") .defaultSuccessUrl("/design")); вернуть http.build(); } } Настройки сервера авторизации...
[*]application.yml
сервер: порт: 9000 [*]AuthServerConfig @Configuration(proxyBeanMethods = false) общественный класс AuthServerConfig { @Бин @Order(Ordered.HIGHEST_PRECEDENCE) public SecurityFilterChain authServerSecurityFilterChain(HttpSecurity http) выдает исключение { OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http); http .formLogin(Customizer.withDefaults()); вернуть http.build(); } @Бин public RegisteredClientRepository зарегистрированныйClientRepository (PasswordEncoder) { RegisteredClient RegistrationClient = RegisteredClient.withId(UUID.randomUUID().toString()) .clientId("taco-cloud-client") .clientSecret(passwordEncoder.encode("секрет")) .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC) .authorizationGrantTypes(grantTypes ->grantTypes.addAll(Set.of( AuthorizationGrantType.AUTHORIZATION_CODE, АвторизацияGrantType.REFRESH_TOKEN ))) .redirectUris(redirectUris -> redirectUris.addAll(Set.of( "http://127.0.0.1:9090/авторизованный", "http://127.0.0.1:9090/login/oauth2/code ... oud-client" ))) .scopes(области -> scopes.addAll(Set.of( "ингредиенты.написать", "ингредиенты.удалить", OidcScopes.OPENID ))) .clientSettings(ClientSettings.builder().requireAuthorizationConsent(true).build()) .строить(); вернуть новый InMemoryRegisteredClientRepository(registeredClient); } @Бин public JWKSource jwkSource() выдает NoSuchAlgorithmException { RSAKey rsaKey = генерироватьRsa(); JWKSet jwkSet = новый JWKSet (rsaKey); return (jwkSelector, SecurityContext) -> jwkSelector.select(jwkSet); } @Бин public JwtDecoder jwtDecoder(JWKSource jwkSource) { вернуть OAuth2AuthorizationServerConfiguration.jwtDecoder(jwkSource); } частный статический RSAKeygenerateRsa() выдает NoSuchAlgorithmException { KeyPair keyPair = генерироватьRsaKey(); RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); RSAPrivateKey PrivateKey = (RSAPrivateKey) keyPair.getPrivate(); вернуть новый RSAKey.Builder(publicKey) .privateKey(частный ключ) .keyID(UUID.randomUUID().toString()) .строить(); } Private static KeyPairgenerateRsaKey() выдает NoSuchAlgorithmException { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(2048); вернуть keyPairGenerator.generateKeyPair(); } } [*]Конфигурация безопасности @EnableWebSecurity @Конфигурация общественный класс SecurityConfig { @Бин SecurityFilterChain securityFilterChain(HttpSecurity http) выдает исключение { http .authorizeHttpRequests(аутентификация -> аутентификация .anyRequest().аутентифицированный()) .formLogin(Customizer.withDefaults()); вернуть http.build(); } } И проблемный клиент OAuth 2.0:
[*]application.yml
сервер: порт: 9090 весна: безопасность: оаут2: клиент: Регистрация: тако-облако-клиент: провайдер: tacocloud идентификатор клиента: taco-cloud-client секрет клиента: секрет тип разрешения-авторизации: код_авторизации redirect-uri: "http://127.0.0.1:9090/login/oauth2/code/{registrationId}" объем: - открытый идентификатор - ингредиенты.читать - ингредиенты.напишите поставщик: такоклауд: эмитент-uri: http://localhost:9000 [*]Конфигурация безопасности @EnableWebSecurity @Configuration (proxyBeanMethods = false) общественный класс SecurityConfig { @Бин public SecurityFilterChain securityFilterChain(HttpSecurity http) выдает исключение { http .authorizeHttpRequests(авторизовать -> разрешать .anyRequest().аутентифицированный()) .oauth2Login(oauth2Login -> oauth2Login.loginPage("/oauth2/authorization/taco-cloud-client")) .oauth2Client(Customizer.withDefaults()); вернуть http.build(); } } Уфф... Вот и все, я думаю ;D Если кто-нибудь будет так любезен и направит меня в правильном направлении, я буду благодарен!
В целях обучения я решил создать пример приложения, состоящего из трех сервисов (модулей Java).
[*]Сервер авторизации OAuth 2 [*]сервер ресурсов [*]Клиент OAuth 2
У меня не возникло серьезных проблем с первыми двумя из них, но я потратил последние несколько часов, пытаясь понять, как создать действительный клиент OAuth 2, но продолжаю получать эту ошибку: Невозможно разрешить конфигурацию с указанным эмитентом «http://localhost:9000».
Поскольку я понятия не имею, в чем проблема, я предоставлю весь необходимый контекст всех трех сервисов.
Вот конфигурация сервера ресурсов.
[*]application.yml
сервер: порт: 8080 весна: безопасность: оаут2: сервер ресурсов: просто: эмитент-uri: "http://localhost:9000" jwk-set-uri: "http://localhost:9000/oauth2/jwks" [*]Конфигурация безопасности @Configuration @EnableWebSecurity общественный класс SecurityConfig { @Бин MvcRequestMatcher.Builder mvc(HandlerMappingIntrospector интроспектор) { вернуть новый MvcRequestMatcher.Builder(интроспектор); } @Бин @Заказ(1) public SecurityFilterChain filterChain (HttpSecurity http, MvcRequestMatcher.Builder mvc) выдает исключение { http // БЕЗОПАСНОСТЬ .csrf(CsrfConfigurer::отключить) .headers(заголовки -> заголовки .frameOptions(HeadersConfigurer.FrameOptionsConfig::disable)) // РИСК .authorizeHttpRequests((auth) -> аутентификация .requestMatchers(mvc.pattern("/data-api/users")).denyAll() .requestMatchers(mvc.pattern("/data-api/users/**")).denyAll() .requestMatchers(mvc.pattern("/data-api/taco-orders")).denyAll() .requestMatchers(mvc.pattern("/data-api/taco-orders/**")).denyAll() .requestMatchers(mvc.pattern(HttpMethod.POST, "/data-api/tacos")).authenticated() .requestMatchers(mvc.pattern(HttpMethod.DELETE, "/data-api/tacos/**")).denyAll() .requestMatchers(mvc.pattern(HttpMethod.POST, "/data-api/ingredients")).hasAuthority("SCOPE_ingredients.write") .requestMatchers(mvc.pattern(HttpMethod.DELETE, "/data-api/ingredients/**")).hasAuthority("SCOPE_ingredients.delete") .requestMatchers(mvc.pattern("/design"), mvc.pattern("/orders")).hasRole("ПОЛЬЗОВАТЕЛЬ") .requestMatchers(mvc.pattern("/"), mvc.pattern("/**")).permitAll() .requestMatchers(toH2Console()).permitAll() .anyRequest().аутентифицированный()) .oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults())) .formLogin((formLogin) -> formLogin .loginPage("/логин") .defaultSuccessUrl("/design")); вернуть http.build(); } } Настройки сервера авторизации...
[*]application.yml
сервер: порт: 9000 [*]AuthServerConfig @Configuration(proxyBeanMethods = false) общественный класс AuthServerConfig { @Бин @Order(Ordered.HIGHEST_PRECEDENCE) public SecurityFilterChain authServerSecurityFilterChain(HttpSecurity http) выдает исключение { OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http); http .formLogin(Customizer.withDefaults()); вернуть http.build(); } @Бин public RegisteredClientRepository зарегистрированныйClientRepository (PasswordEncoder) { RegisteredClient RegistrationClient = RegisteredClient.withId(UUID.randomUUID().toString()) .clientId("taco-cloud-client") .clientSecret(passwordEncoder.encode("секрет")) .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC) .authorizationGrantTypes(grantTypes ->grantTypes.addAll(Set.of( AuthorizationGrantType.AUTHORIZATION_CODE, АвторизацияGrantType.REFRESH_TOKEN ))) .redirectUris(redirectUris -> redirectUris.addAll(Set.of( "http://127.0.0.1:9090/авторизованный", "http://127.0.0.1:9090/login/oauth2/code ... oud-client" ))) .scopes(области -> scopes.addAll(Set.of( "ингредиенты.написать", "ингредиенты.удалить", OidcScopes.OPENID ))) .clientSettings(ClientSettings.builder().requireAuthorizationConsent(true).build()) .строить(); вернуть новый InMemoryRegisteredClientRepository(registeredClient); } @Бин public JWKSource jwkSource() выдает NoSuchAlgorithmException { RSAKey rsaKey = генерироватьRsa(); JWKSet jwkSet = новый JWKSet (rsaKey); return (jwkSelector, SecurityContext) -> jwkSelector.select(jwkSet); } @Бин public JwtDecoder jwtDecoder(JWKSource jwkSource) { вернуть OAuth2AuthorizationServerConfiguration.jwtDecoder(jwkSource); } частный статический RSAKeygenerateRsa() выдает NoSuchAlgorithmException { KeyPair keyPair = генерироватьRsaKey(); RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); RSAPrivateKey PrivateKey = (RSAPrivateKey) keyPair.getPrivate(); вернуть новый RSAKey.Builder(publicKey) .privateKey(частный ключ) .keyID(UUID.randomUUID().toString()) .строить(); } Private static KeyPairgenerateRsaKey() выдает NoSuchAlgorithmException { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(2048); вернуть keyPairGenerator.generateKeyPair(); } } [*]Конфигурация безопасности @EnableWebSecurity @Конфигурация общественный класс SecurityConfig { @Бин SecurityFilterChain securityFilterChain(HttpSecurity http) выдает исключение { http .authorizeHttpRequests(аутентификация -> аутентификация .anyRequest().аутентифицированный()) .formLogin(Customizer.withDefaults()); вернуть http.build(); } } И проблемный клиент OAuth 2.0:
[*]application.yml
сервер: порт: 9090 весна: безопасность: оаут2: клиент: Регистрация: тако-облако-клиент: провайдер: tacocloud идентификатор клиента: taco-cloud-client секрет клиента: секрет тип разрешения-авторизации: код_авторизации redirect-uri: "http://127.0.0.1:9090/login/oauth2/code/{registrationId}" объем: - открытый идентификатор - ингредиенты.читать - ингредиенты.напишите поставщик: такоклауд: эмитент-uri: http://localhost:9000 [*]Конфигурация безопасности @EnableWebSecurity @Configuration (proxyBeanMethods = false) общественный класс SecurityConfig { @Бин public SecurityFilterChain securityFilterChain(HttpSecurity http) выдает исключение { http .authorizeHttpRequests(авторизовать -> разрешать .anyRequest().аутентифицированный()) .oauth2Login(oauth2Login -> oauth2Login.loginPage("/oauth2/authorization/taco-cloud-client")) .oauth2Client(Customizer.withDefaults()); вернуть http.build(); } } Уфф... Вот и все, я думаю ;D Если кто-нибудь будет так любезен и направит меня в правильном направлении, я буду благодарен!
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение