Можно ли настроить OAuth2 в Spring Boot для ответа JSON вместо HTML для InvalidTokenException? - PullRequest
1 голос
/ 10 апреля 2020

Приложение My Spring Boot использует OAuth2 для управления безопасностью и токенами. Я запрашиваю одну из моих конечных точек REST с недействительным токеном, чтобы проверить его ответ с помощью Postman. Конечная точка правильно отвечает 401 InvalidTokenException, но содержимое ответа равно HTML, когда я хочу, чтобы оно ответило JSON. Можно ли это сделать с помощью кода?

Пример ответа

<InvalidTokenException> 
    <error>invalid_token</error> 
    <error_description>Access token expired: … my token… </error_description> 
</InvalidTokenException>

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Чтобы уточнить ответ zfChaos, который является хорошим примером, но не предоставляет достаточной информации для ответа, который будет JSON ответом:

Вы также должны установить тип содержимого и кодировку символов. Затем напишите свой ответ JSON (в этом примере я использовал простую строку, конечно, было бы удобнее использовать класс и ObjectMapper).

Вот полный пример:

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
                .oauth2Login(login -> login
                        .failureHandler((request, response, exception) -> {
                            response.setContentType("application/json");
                            response.setStatus(401);
                            response.setCharacterEncoding("UTF-8");
                            response.getWriter().write("{ \"msg\": \"foo\" }");
                        })
                );
    }
}
1 голос
/ 10 апреля 2020

Добавьте пользовательский AuthenticationFailureHandler в свою конфигурацию безопасности и затем подготовьте ответ в своей пользовательской реализации:

http.oauth2Login()
    .failureHandler(customFailureHandler)

Пример обработчика ошибок:

public class CustomFailureHandler extends SimpleUrlAuthenticationFailureHandler {
    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException {
        response.sendError(401, "XML HERE");
    }
}
...