Коротко: как я могу прочитать переменную CGI REMOTE_USER на golang с помощью fastcgi?
Длинный: я пытаюсь написать программу для работы за httpd, используя fcgi через сокет. httpd выполняет завершение ssl и обеспечивает базовую аутентификацию. Мне нужно прочитать $REMOTE_USER, но я не могу в golang, а в perl могу.
Мой код основан на этом примере fcgi. а>. я пытаюсь
func homeView(w http.ResponseWriter, r *http.Request) {
user, pass, authok := r.BasicAuth()
Но authok всегда ложный, user и pass остаются пустыми, хотя я точно знаю, что авторизация (сделанная по httpd) прошла нормально. Чтобы устранить другие ошибки, я сделал это в perl:
my $socket = FCGI::OpenSocket("/run/fcgi-check.sock", 5);
my $q = FCGI::Request(\*STDIN, \*STDOUT, \*STDERR, \%ENV, $socket);
while ($q->Accept() >= 0) {
my $c = CGI::Simple->new;
my $user_id = $c->remote_user();
и он отлично работает в perl.
Для отладки я распечатал вывод r.Header и получил:
map[Authorization:[]
Я прав, что заголовок, который видит go, не содержит никакой информации о какой-либо авторизации? Но это происходит в Perl.
Вот полный, но минимальный пример кода golang, демонстрирующий проблему (в OpenBSD 5.8 с версией go go1.4.2 openbsd/amd64 и OpenBSD httpd с «аутентификацией «/» с ограниченными_пользователями» в httpd.conf.
package main
import (
"github.com/gorilla/mux"
"io"
"log"
"fmt"
"net"
"net/http"
"net/http/fcgi"
)
func homeView(w http.ResponseWriter, r *http.Request) {
headers := w.Header()
headers.Add("Content-Type", "text/html")
headers.Add("Cache-Control", "no-cache, no-store, must-revalidate")
headers.Add("Pragma", "no-cache")
headers.Add("Expires", "0")
r.ParseForm()
user, pass, authok := r.BasicAuth()
if authok {
io.WriteString(w, fmt.Sprintln("Auth OK"))
io.WriteString(w, fmt.Sprintln("user is: "+user+", pass is: "+pass))
} else {
io.WriteString(w, fmt.Sprintln("Auth NOT OK"))
}
}
func main() {
r := mux.NewRouter()
r.HandleFunc("/check/", homeView)
var err error
listener, err := net.Listen("unix", "/run/fcgi-check.sock")
if err != nil {
log.Fatal(err)
}
defer listener.Close()
err = fcgi.Serve(listener, r)
if err != nil { log.Fatal(err)}
}
Помощь будет оценена!
Заранее спасибо! Т.
r.BasicAuth()
- неправильный способ сделать это). Как сказано в моем сообщении, я напечатал полные заголовки, используяio.WriteString(w, fmt.Sprintf("Header: %s", r.Header))
, подтвердив, что карта Authorization:[] пуста и в этом заголовке нет REMOTE_USER. Я застрял. (И есть причины, которые я не могу обсуждать здесь, которые вынуждают меня использовать fcgi.) - person user208383   schedule 01.12.2015r.BasicAuth()
неверна просто потому, что чтение CGI-переменнойREMOTE_USER
означает, что ожидается, что аутентификация будет выполняться веб-сервером, и вы не можете это контролировать. Итак, вам нужно просто правильно прочитать значение этой переменной. Я дал ответ, как это сделать. - person kostix   schedule 01.12.2015REMOTE_USER
используется в пакете fcgi. Я бы хотел, чтобы веб-сервер, выполняющий аутентификацию, поместил его в заголовок или переменнуюHTTP_REMOTE_USER
. - person JimB   schedule 01.12.2015HTTP_REMOTE_USER
или какую-либо другую пользовательскую переменную. Назначение его после аутентификации было в порядке вещей. - person JimB   schedule 02.12.2015