Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

вот так:

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

}

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

ip, _, _ := net.SplitHostPort(r.RemoteAddr)

Ответ 2

Используйте net.SplitHostPort:

ip, _, _ := net.SplitHostPort(r.RemoteAddr)

Ответ 3

Ответы выше пренебрегают проверкой того, пересылается ли пользовательский 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
}

Ответ 4

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

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

Вывод:

r: & {Метод: POST URL:/email Прото: HTTP/1.1 ProtoMajor: 1 ProtoMinor: 1 Заголовок: карта [User-Agent: [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: [/] Referer: [http://127.0.0.1:8080/] Content-Length: [9] Content-Type: [применение/х-WWW-форм-urlencoded; charset = UTF-8] Происхождение: [http://127.0.0.1:8080]] Тело: 0xc420012800 ContentLength: 9 TransferEncoding: [] Закрыть: false Хост: 127.0.0.1: 8081 Форма: map [] PostForm: map [] MultipartForm: Трейлер: map [] RemoteAddr: 127.0.0.1: 62232 RequestURI:/email TLS: Отменить: ответ: ctx: 0xc420017860}

У рефератора и источника есть мой клиентский IP-адрес.

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

Вывод:

http://127.0.0.1:8080/