Я использую Spring Boot для входа в OAuth2 в Intuit.Однако Intuit не отвечает на redirect_uri токенами доступа, а отправляет код, который затем необходимо обменять на токены.Я могу выполнить этот запрос вручную и попытался установить токены непосредственно в сеансе, но это не вызывает аутентификацию пользователя.
Вот мой redirect_uri, который затем выполняет запрос Intuit для заполнения оставшейся частиданные токена.
@RequestMapping("/redirect")
public String oAuth2Redirect(HttpSession session,
@RequestParam(value = "state", required = false) String state,
@RequestParam(value = "code", required = false) String code,
@RequestParam(value = "realmId", required = false) String realmId,
@RequestParam(value = "error", required = false) String error) throws com.intuit.oauth2.exception.OAuthException {
...
// Exchange Code for Tokens
OAuth2PlatformClient platformClient = new OAuth2PlatformClient(oAuth2Config);
BearerTokenResponse bearerTokenResponse = platformClient.retrieveBearerTokens(code, oauth2RedirectUri);
DefaultOAuth2ClientContext context = (DefaultOAuth2ClientContext) session.getAttribute("scopedTarget.oauth2ClientContext");
DefaultOAuth2AccessToken defaultOAuth2AccessToken = new DefaultOAuth2AccessToken(bearerTokenResponse.getAccessToken());
defaultOAuth2AccessToken.setExpiration(new Date(System.currentTimeMillis() + bearerTokenResponse.getExpiresIn()));
defaultOAuth2AccessToken.setRefreshToken(new DefaultExpiringOAuth2RefreshToken(bearerTokenResponse.getRefreshToken(),
new Date(System.currentTimeMillis() + bearerTokenResponse.getXRefreshTokenExpiresIn())));
context.setAccessToken(defaultOAuth2AccessToken);
...
return "success";
}
Есть ли способ аутентификации пользователя внутри конечной точки?Есть ли лучший способ выполнить этот дополнительный шаг OAuth?
EDIT:
Я попытался просто обновить контекст с помощью кода авторизации, чтобы он мог получить токены через Spring Security.Но этот контекст не работает в моем фильтре.
Это перенаправление:
DefaultOAuth2ClientContext context = (DefaultOAuth2ClientContext) session.getAttribute("scopedTarget.oauth2ClientContext");
context.getAccessTokenRequest().setAuthorizationCode(code);
Вот мой фильтр (который может использовать неправильный контекст):
@Qualifier("oauth2ClientContext")
@Autowired
private OAuth2ClientContext oauth2ClientContext;
@Bean("oauth2Filter")
public Filter oauth2Filter(@Qualifier("quickbooksResource") ResourceServerProperties quickbooksResource,
@Qualifier("quickbooksDetails") AuthorizationCodeResourceDetails quickbooksDetails) {
OAuth2ClientAuthenticationProcessingFilter quickbooksFilter = new OAuth2ClientAuthenticationProcessingFilter("/login");
OAuth2RestTemplate quickbooksTemplate = new OAuth2RestTemplate(quickbooksDetails, oauth2ClientContext);
quickbooksFilter.setRestTemplate(quickbooksTemplate);
UserInfoTokenServices tokenServices = new UserInfoTokenServices(quickbooksResource.getUserInfoUri(), quickbooksDetails.getClientId());
tokenServices.setRestTemplate(quickbooksTemplate);
quickbooksFilter.setTokenServices(tokenServices);
return quickbooksFilter;
}