Spring boot - google oauth2,在数据库中存储刷新令牌。

问题描述 投票:1回答:1

我试图从登录在我的系统中的用户那里获取刷新令牌,并将其存储在数据库中。因此,我的生态系统中的不同系统可以访问存储的刷新令牌,用它生成一个访问令牌,并使用用户凭证使用谷歌日历api。

到目前为止,我已经成功地做到了用

@Configuration
public class AppConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private ClientRegistrationRepository clientRegistrationRepository;

    @Override
    public void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
                .authorizeRequests()
                .antMatchers("/**").authenticated()
                .anyRequest().permitAll()
                .and()
                .oauth2Login()
                .authorizationEndpoint()
                .authorizationRequestResolver(new CustomAuthorizationRequestResolver(
                        this.clientRegistrationRepository))
                .and()
                .and()
                .rememberMe();
    }
}

还有


public class CustomAuthorizationRequestResolver implements OAuth2AuthorizationRequestResolver {
    private final OAuth2AuthorizationRequestResolver defaultAuthorizationRequestResolver;

    public CustomAuthorizationRequestResolver(
            ClientRegistrationRepository clientRegistrationRepository) {

        this.defaultAuthorizationRequestResolver =
                new DefaultOAuth2AuthorizationRequestResolver(
                        clientRegistrationRepository, "/oauth2/authorization");
    }

    @Override
    public OAuth2AuthorizationRequest resolve(HttpServletRequest request) {
        OAuth2AuthorizationRequest authorizationRequest =
                this.defaultAuthorizationRequestResolver.resolve(request);

        return authorizationRequest != null ?
        customAuthorizationRequest(authorizationRequest) :
        null;
    }

    @Override
    public OAuth2AuthorizationRequest resolve(
            HttpServletRequest request, String clientRegistrationId) {

        OAuth2AuthorizationRequest authorizationRequest =
                this.defaultAuthorizationRequestResolver.resolve(
                        request, clientRegistrationId);

        return authorizationRequest != null ?
        customAuthorizationRequest(authorizationRequest) :
        null;
    }

    private OAuth2AuthorizationRequest customAuthorizationRequest(
            OAuth2AuthorizationRequest authorizationRequest) {

        Map<String, Object> additionalParameters = new LinkedHashMap<>(authorizationRequest.getAdditionalParameters());
        additionalParameters.put("access_type", "offline");

        return OAuth2AuthorizationRequest.from(authorizationRequest)
                .additionalParameters(additionalParameters)
                .build();
    }

}

我如何以及在哪里可以访问已登录用户的刷新令牌?

java spring-boot spring-security spring-security-oauth2 google-oauth2
1个回答
2
投票

我回答了一个类似的问题 此处但它是在kotlin中,所以我将为你添加一个java版本。

这是两种获取刷新令牌的方法(或者说是获取 OAuth2AuthorizedClient,你可以从这里获得刷新令牌)。) 你使用哪一个取决于你的需求。

  1. 注入和 OAuth2AuthorizedClient 代表请求用户,注入端点方法中。
@GetMapping("/foo")
void foo(@RegisteredOAuth2AuthorizedClient("google") OAuth2AuthorizedClient user) {
    OAuth2RefreshToken refreshToken = user.getRefreshToken();
}
  1. 在请求的上下文之外,你可以注入 OAuth2AuthorizedClientService 到一个托管组件中,并获得所需的 OAuth2AuthorizedClient 实例,其中包含客户注册id和委托人名称。
@Autowired
private OAuth2AuthorizedClientService clientService;

public void foo() {
    OAuth2AuthorizedClient user = clientService.loadAuthorizedClient("google", "principal-name");
    OAuth2RefreshToken refreshToken = user.getRefreshToken();
}
© www.soinside.com 2019 - 2024. All rights reserved.