У меня есть сервер авторизации Spring oauth с включенной функцией csrf.Клиенты будут следовать пути кода авторизации с помощью единого входа - я захожу на свой сайт, нажимаю «Войти», перенаправляю на страницу авторизации, авторизируюсь и затем возвращаюсь.
Я моделирую процесс, через который клиенты будут проходить через браузер, используя java-приложение через консоль.Это требование.В будущем нам понадобится этот код для микросервисов в нашей архитектуре.
Всякий раз, когда я пытаюсь вызвать конечную точку авторизации сервера авторизации, я получаю исключение 403 токена CSRF (см. Ниже).Это ожидается в моем уме.Тогда возникает вопрос: как мне получить токен, вставить заголовок запроса и получить этот код доступа?
Мой текущий код:
private final String clientId = "my_client_id";
private final String authorizeUrl = "http://localhost:8085/oauth/authorize";
private final String callbackURL = "";
private String getUserAuthorizationURL() {
return authorizeUrl + "?" + "response_type=code&" + "client_id=" + clientId + "&" + "redirect_uri="
+ callbackURL + "&" + "scope=openid";
}
public void getAuthorizationCode() {
String content = "";
HttpPost post = null;
CloseableHttpClient httpclient = null;
CloseableHttpResponse response = null;
BufferedReader reader = null;
try {
post = new HttpPost(getUserAuthorizationURL());
// pretty sure I need to add csrf token to post header here, but I dont know how to get it
httpclient = HttpClients.createDefault();
response = httpclient.execute(post);
String line = null;
HttpEntity entity = response.getEntity();
reader = new BufferedReader(new InputStreamReader(entity.getContent()));
while ((line = reader.readLine()) != null) {
content += line;
}
EntityUtils.consume(entity);
System.out.println(content);
}
catch (Exception ex) {
ex.printStackTrace();
}
}
Ответ JSON:
{"timestamp": 12345, "status": 403, "error": "Forbidden", "message": "Не удалось проверить предоставленный токен CSRF, поскольку сеанс не найден.", "Path":" / oauth / authorize "}
Нужно ли сделать первоначальный вызов серверу, получить токен csrf из этого вызова?Как это работает, если я использую приложение Java, в которое не встроен сеанс?Даже когда я пытаюсь сделать первоначальный вызов, я получаю исключение, что мы должны пройти полную аутентификацию для доступа http://localhost:8085/login.