Spring boot - Google oauth2, магазин refre sh токен в базе данных - PullRequest
1 голос
/ 02 мая 2020

Я пытаюсь получить токен refre sh от пользователя, вошедшего в мою систему, и сохранить его в базе данных. Таким образом, другая система в моей экосистеме может получить доступ к сохраненному токену refre sh, сгенерировать с ним токен доступа и использовать API календаря Google с учетными данными пользователя.

Пока мне удалось выполнить вход с

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

}

как и где я могу получить доступ к токену refre sh зарегистрированного пользователя?

1 Ответ

2 голосов
/ 02 мая 2020

Я ответил на аналогичный вопрос здесь , но он находится в kotlin, поэтому я добавлю версию java для вас.

Это два подхода, чтобы получить refre sh token (точнее OAuth2AuthorizedClient, из которого вы можете получить refre sh token). Какой из них вы используете, зависит от ваших потребностей.

  1. Inject и OAuth2AuthorizedClient, представляющие запрашивающего пользователя в метод конечной точки:
@GetMapping("/foo")
void foo(@RegisteredOAuth2AuthorizedClient("google") OAuth2AuthorizedClient user) {
    OAuth2RefreshToken refreshToken = user.getRefreshToken();
}
Вне контекста запроса вы можете внедрить OAuth2AuthorizedClientService в управляемый компонент и получить необходимый экземпляр OAuth2AuthorizedClient с идентификатором регистрации клиента и именем участника:
@Autowired
private OAuth2AuthorizedClientService clientService;

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