Google App Engine Golang - как получить IP-адрес пользователя?

Я хочу интегрировать ReCAPTCHA в свое веб-приложение GAE Golang. Для проверки капчи мне нужно получить пользователяс IP-адрес. Как я могу получить пользователя?S IP-адрес из формы сообщения?

Ответы на вопрос(4)

Это сработало для меня. Я бегу идти в 8081 и с ума сошла, запрос от порта 8080.

fmt.Printf("r: %+v\n", r) // Print all fields that you get in request

Выход:

р: &{Метод: POST URL: / электронная почта Proto: HTTP / 1.1 ProtoMajor: 1 ProtoMinor: 1 Заголовок: карта [Пользователь-агент: [Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit / 602.2.11 (KHTML, как Gecko) ) Версия / 10.0.1 Safari / 602.2.11] Accept-Language: [en-us] Accept-Encoding: [gzip, deflate] Соединение: [keep-alive] Accept: [/] Рефери: [http://127.0.0.1:8080/] Длина содержимого: [9] Тип содержимого: [application / x-www-form-urlencoded; charset = UTF-8] Происхождение: [http://127.0.0.1:8080]] Тело: 0xc420012800 ContentLength: 9 TransferEncoding: [] Закрыть: false Хост: 127.0.0.1: 8081 Форма: map [] PostForm: map [] MultipartForm: Trailer: map [] RemoteAddr: 127.0.0.1: 62232 RequestURI: / email TLS: Отмена: Ответ: ctx: 0xc420017860}

У Referer и Origin есть мой клиентский IP.

ip := r.Referer() // Get Referer value
fmt.Println(ip) // print ip

Выход:

http://127.0.0.1:8080/

Ответы выше не учитывают, если пользовательIP-адрес пересылается через прокси. Во многих случаях IP-адрес, который вы найдете в RemoteAddr, является IP-адресом прокси-сервера, который пересылает пользователя.с просьбой к вам - не пользователяс IP-адрес!

Более точное решение будет выглядеть так:

package main

import (
    "net"
    "net/http"
)

func GetIP(r *http.Request) string {
    if ipProxy := r.Header.Get("X-FORWARDED-FOR"); len(ipProxy) > 0 {
        return ipProxy
    }
    ip, _, _ := net.SplitHostPort(r.RemoteAddr)
    return ip
}
 Eran Chetzroni09 мая 2015 г., 01:19
@orcaman это действительно так, если запрос передается через несколько прокси-серверов, как в Elastic Load Balancer в AWS, к контенту будет список IP-адресов. самый левый ip должен быть IP-адресом клиента. Вы можете найти больше информации здесьdocs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/...
 bugloaf25 февр. 2015 г., 17:16
Этот ответ предполагает, что X-Forwarded-For может быть списком:stackoverflow.com/a/27235620/214070
 Patrick Boos03 авг. 2015 г., 08:46
При регистрации IP-адрес. Убедитесь, что вы зарегистрировали оба RemoteAddr И X-Forwarded-For. Причина? Хакер всегда может установить заголовок X-Forwarded-For ;-). С другой стороны. Хакер, скорее всего, будет использовать TOR или другой способ скрыть свой IP.

использованиеnet.SplitHostPort:

ip, _, _ := net.SplitHostPort(r.RemoteAddr)
 Ory Band22 окт. 2014 г., 10:55
+1, отличный ответ. Лучше повторно использовать код, чем разделять вручную.
 Xeoncross27 июн. 2014 г., 00:04
 styler197218 июл. 2014 г., 00:42
Дон»забытьimport "net"
 Stian OK30 сент. 2015 г., 06:47
Это должен быть принятый ответ.
Решение Вопроса

внутри вашего обработчика вызов функции r.RemoteAddr для получения ip: port

как это:

func renderIndexPage(w http.ResponseWriter, r *http.Request) {
  ip := strings.Split(r.RemoteAddr,":")[0] 

}

обновление от 15.02.2017 как@Aigars Matulis указал, в текущей версии уже есть функция, чтобы сделать это

ip, _, _ := net.SplitHostPort(r.RemoteAddr)
 yumaikas16 нояб. 2016 г., 06:53
Это будет работать только на IPv4-адресах.
 deepakssn02 окт. 2016 г., 06:33
у меня работает ip: = r.Referer ()
 bsr22 июн. 2013 г., 17:00
+1 Для полноты у меня возникла проблема, так как я использовал localhost в своем URL. смотрите обсуждение здесь.groups.google.com/forum/#!topic/golang-nuts/rqo1--qR-8Y
 fmt.Println.MKO23 июн. 2013 г., 13:56
да localhost всегда особенный, и я думаю, что вы используете Mac, который разрешает ipv6, который вызывает проблемы с localhost и ip с годами
 Greivin López02 июн. 2015 г., 04:04
Добавьте в конец то, что для меня сработало: просто использоватьr.RemoteAddr».

Ваш ответ на вопрос