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

lin*_*dro 2 java spring-security google-oauth spring-boot spring-security-oauth2

我正在尝试从登录系统的用户获取刷新令牌,并将其存储在数据库中。因此,我的生态系统中的不同系统可以访问存储的刷新令牌,用它生成访问令牌,并使用谷歌日历 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();
    }
}
Run Code Online (Sandbox Code Playgroud)


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();
    }

}
Run Code Online (Sandbox Code Playgroud)

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

Sta*_*mir 5

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

这是获取刷新令牌的两种方法(或者更确切地说OAuth2AuthorizedClient,您可以从中获取刷新令牌)。您使用哪一种取决于您的需要。

  1. OAuth2AuthorizedClient将请求用户注入并表示到端点方法中:
@GetMapping("/foo")
void foo(@RegisteredOAuth2AuthorizedClient("google") OAuth2AuthorizedClient user) {
    OAuth2RefreshToken refreshToken = user.getRefreshToken();
}
Run Code Online (Sandbox Code Playgroud)
  1. 在请求上下文之外,您可以注入OAuth2AuthorizedClientService托管组件,并OAuth2AuthorizedClient使用客户端注册 ID 和主体名称获取所需的实例:
@Autowired
private OAuth2AuthorizedClientService clientService;

public void foo() {
    OAuth2AuthorizedClient user = clientService.loadAuthorizedClient("google", "principal-name");
    OAuth2RefreshToken refreshToken = user.getRefreshToken();
}
Run Code Online (Sandbox Code Playgroud)