Я впервые реализую этот тип аутентификации, и мне не удается заставить его работать.
Я пытаюсь понять, что делать, просматривая документацию здесь.
Мне предоставили 2 API:
- https://myapi/.../openid-connect/token (это единственный URI, который у меня есть, у меня нет эмитента-uri)
запрос:
- grant_type -> client_credentials
- client_secret -> mysecret
- область -> openid
- client_id -> имя_моей компании
ответ: - access_token
- https://anotherapi/mylist
запрос:
- Токен на предъявителя access_token
- создайте приложение весенней загрузки с oaut2client и стартовым веб-сайтом
- yaml-файл следующим образом:
Код: Выделить всё
security: oauth2: client: registration: my-client: provider: my-provider client-id: mycompanyname client-secret: mysecret authorization-grant-type: client_credentials scope: openid provider: day-provider: token-uri: https://myapi/.../openid-connect/token - затем я следую этой части
поэтому я настраиваю следующие bean-компонентыЯ не думаю, что мне нужно настраивать свой запрос/ответ, поэтому я перехожу к созданию следующего bean-компонентаКод: Выделить всё
@Bean public OAuth2AccessTokenResponseClient accessTokenResponseClient() { return new RestClientClientCredentialsTokenResponseClient(); }Затем, когда я создамКод: Выделить всё
@Bean public OAuth2AuthorizedClientManager authorizedClientManager( ClientRegistrationRepository clientRegistrationRepository, OAuth2AuthorizedClientRepository authorizedClientRepository) { OAuth2AuthorizedClientProvider authorizedClientProvider = OAuth2AuthorizedClientProviderBuilder.builder() .clientCredentials() .build(); DefaultOAuth2AuthorizedClientManager authorizedClientManager = new DefaultOAuth2AuthorizedClientManager( clientRegistrationRepository, authorizedClientRepository); authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider); return authorizedClientManager; }и я попытаюсь получить доступ к конечной точке "/", но получу исключение:Код: Выделить всё
@Controller public class OAuth2ClientController { @Autowired private OAuth2AuthorizedClientManager authorizedClientManager; @GetMapping("/") public String index(Authentication authentication, HttpServletRequest servletRequest, HttpServletResponse servletResponse) { OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest.withClientRegistrationId("okta") .principal(authentication) .attributes(attrs -> { attrs.put(HttpServletRequest.class.getName(), servletRequest); attrs.put(HttpServletResponse.class.getName(), servletResponse); }) .build(); OAuth2AuthorizedClient authorizedClient = this.authorizedClientManager.authorize(authorizeRequest); OAuth2AccessToken accessToken = authorizedClient.getAccessToken(); // ... return "index"; } }
если я попытаюсь получить доступ к /oauth2/authorization/my-client, вместо этого я получу это исключениеКод: Выделить всё
IllegalArgumentException: principal cannot be null.
И, конечно, если я попытаюсь получить доступ ко второму API, я снова получу исключение.Код: Выделить всё
Invalid Authorization Grant Type (client_credentials) for Client Registration with Id: my-client
Я не использую реактивное программирование, поэтому не использую Spring WebClientЯ не самый быстрый ученик, я больше обучаюсь визуально, и поначалу мне трудно понять документацию, поэтому, пожалуйста, не будьте злыми, спасибо.Код: Выделить всё
@RestController public class TestController { private final RestClient restClient; public TestController(RestClient restClient) { this.restClient = restClient; } @GetMapping("/sites") public SiteListResponse listaLocali(@RequestParam String vat) { return this.restClient.get() .uri("https://anotherapi/mylist?vat_number=" + vat) .attributes(clientRegistrationId("my-client")) .retrieve() .body(SiteListResponse.class); } }
Я пытался просмотреть некоторые видео, подобные этому, но, похоже, это не помогло решить мою проблему.
Подробнее здесь: https://stackoverflow.com/questions/798 ... -in-spring