gpt4 book ai didi

spring-boot - 如何使用 Spring Security 5 和 OAuth2 Client 获取刷新 token 并进行 API 调用?

转载 作者:行者123 更新时间:2023-12-04 12:59:01 28 4
gpt4 key购买 nike

我目前正在使用 Spring Security + OAUth2 协议(protocol)构建一个 Spring Boot 应用程序。

Here is the Authorization Guide from Spotify I'm following

我无法理解如何执行授权代码流的步骤 2 - 4。我能够获得授权并获得授权代码来交换访问和刷新 token ,但我不确定如何获取 token 然后开始进行 API 调用。

阅读 Spring 文档让我对某些事情感到困惑。

  • 我如何获得 token ?我注意到它在登录后存储在我的重定向 URL 中,我是使用查询参数获取它还是存储在 OAuth2ClientService 对象中?
  • 授权指南指出我必须对 token 端点进行 POST 调用以获取刷新和访问 token 。我假设我没有使用 WebClient/RestTemplate 执行此操作,因为我能够使用应用程序属性执行 GET 登录请求。如果是这样,我该如何实现?
  • 然后我如何使用这些 token 来访问 API 数据?如果不需要 token ,通常我会使用 WebClient 进行 REST API 调用。如果我得到一个 token ,我会像往常一样继续,但使用访问 token 作为我的查询。

  • 这是我的 application.properties
    #
    # OAuth ClientRegistration Properties
    #
    spring.security.oauth2.client.registration.spotify.client-id=#
    spring.security.oauth2.client.registration.spotify.client-secret=#
    spring.security.oauth2.client.registration.spotify.provider=spotify-provider
    spring.security.oauth2.client.registration.spotify.client-authentication-method=basic
    spring.security.oauth2.client.registration.spotify.authorization-grant-type=authorization_code
    spring.security.oauth2.client.registration.spotify.redirect-uri=http://localhost:8080/redirect
    spring.security.oauth2.client.registration.spotify.scope=user-read-private,user-read-email

    #
    # OAuth ProviderDetails Properties
    #
    spring.security.oauth2.client.provider.spotify-provider.authorization-
    uri=https://accounts.spotify.com/authorize?show_dialog=true

    spring.security.oauth2.client.provider.spotify-provider.token-
    uri=https://accounts.spotify.com/api/token

    spring.security.oauth2.client.provider.spotify-provider.user-info-uri=https://api.spotify.com/v1/me
    spring.security.oauth2.client.provider.spotify-provider.user-name-attribute=id

    这是我的 WebSecurityConfig
    @Configuration
    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {

    http.authorizeRequests()
    .antMatchers("/redirect")
    .permitAll()

    .and()

    .authorizeRequests()
    .anyRequest().authenticated()

    .and()

    .oauth2Login()
    .loginPage("/login")
    .permitAll();
    }
    }

    Controller
    @Controller
    public class HomeController {

    @Autowired
    private OAuth2AuthorizedClientService authorizedClientService;

    @GetMapping("/login")
    public String getLogin()
    {
    return "login";
    }

    ///login/oauth2/code/spotify

    @GetMapping("/redirect")
    public String getRedirect()
    {
    return "redirect";
    }

    @GetMapping("/home")
    public String getHome()
    {
    return "home";
    }
    }

    我仍然是这方面的初学者,我需要一段时间才能理解,所以我先感谢您的帮助。

    最佳答案

    得到它的工作。显然,我应该将 WebClient 与 ExchangeFilterFunction 集成,该功能利用 OAuth2AuthorizedClientManager 处理访问 token 和刷新 token 的授权代码交换。我遵循并阅读文档,直到我理解它。 Here's the section that helped me the most .

    这是我对代码所做的更改...

    我添加了一个新的配置类来将 webclient 与 exchangefilterfunction 集成。

    @Configuration
    public class WebClientConfig {

    @Bean
    public OAuth2AuthorizedClientManager authorizedClientManager(
    ClientRegistrationRepository clientRegistrationRepository,
    OAuth2AuthorizedClientRepository authorizedClientRepository) {

    OAuth2AuthorizedClientProvider authorizedClientProvider =
    OAuth2AuthorizedClientProviderBuilder.builder()
    .authorizationCode()
    .refreshToken()
    .build();

    DefaultOAuth2AuthorizedClientManager authorizedClientManager =
    new DefaultOAuth2AuthorizedClientManager(
    clientRegistrationRepository, authorizedClientRepository);

    authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider);

    return authorizedClientManager;
    }


    @Bean
    public WebClient webClient(OAuth2AuthorizedClientManager authorizedClientManager) {

    ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2Client =
    new ServletOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager);

    oauth2Client.setDefaultClientRegistrationId("spotify");

    return WebClient.builder()
    .apply(oauth2Client.oauth2Configuration())
    .build();
    }
    }

    然后我只是使用了 WebClient ,而不是在我的 Controller 中使用 OAuth2 :
    @GetMapping("/redirect")
    public String getRedirect()
    {
    String resourceUri = "https://api.spotify.com/v1/me/top/artists";

    String body = webClient
    .get()
    .uri(resourceUri)
    .retrieve()
    .bodyToMono(String.class)
    .block();

    System.out.println(body);

    return "redirect";
    }

    关于spring-boot - 如何使用 Spring Security 5 和 OAuth2 Client 获取刷新 token 并进行 API 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61704588/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com