Spring Security - аутентификация токена с запросом имени хоста - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть приложение, реализованное с помощью Spring Boot, где я использую Spring Security для аутентификации. У меня уже есть аутентификация на основе токенов, когда клиенты должны получить токен, а затем использовать этот токен для аутентификации в последующих запросах.

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

Вот код, который я реализовал, чтобы попытаться получить имя хоста запроса

public String getClientHostName(HttpServletRequest request) {
    String hostName = null;
    // get the request's IP address
    String clientAddress = httpRequest.getRemoteAddr();
    String xfHeader = httpRequest.getHeader("X-Forwarded-For");
    if (xfHeader != null) {
        clientAddress = xfHeader.split(",")[0];
    }   

    // try to resolve the host name from the IP address
    try {
        InetAddress address = InetAddress.getByName(clientAddress);
        hostName = address.getHostName();
    } catch (UnknownHostException e) {
        logger.error("Failed to get the host name from the request's remote address. ", e);
    }

    return hostName;
}

У меня сейчас 2 проблемы:

  1. Это Код не всегда удается получить имя хоста. Иногда он просто возвращает IP-адрес. Я понимаю, что это может быть связано с какой-то проверкой IP-спуфинга, которую класс InetAddress делает .

  2. При тестировании запросов от разных хостов я не всегда получаю ожидаемый IP-адрес. Я часто получаю IP-адрес другого хоста, который пересылает запрос (который, я думал, будет решен путем проверки «X-Forwarded-For»). Это заставляет меня задуматься, как даже получить IP хоста, который является реальным отправителем запроса.

Есть ли надежный способ проверить имя хоста отправителя запроса ?

1 Ответ

0 голосов
/ 05 апреля 2020

вы пытались получить имя хоста с помощью String referrer = request.getHeader("referer");?

Кроме того, на стороне клиента также можно добавить фрагмент, чтобы узнать имя хоста в заголовках.

You can get the hostname on the server side by adding a snippet.

Или вы можете предоставить ниже код, который будет добавлен на стороне клиента, а на сервере вы можете прочитать значение домена, которое будет возвращать имя хоста

<input type="button" value="Register" onClick="call()"/>
<script>
function call(){
    var domain=window.location.hostname;
    window.open('http://<your-hostname>/register?domain='+domain,'_self');
}
</script>
...