简短:如何使用fastcgi读取Golang上的CGI var REMOTE_USER?
长: 我试图通过套接字使用fcgi在httpd后面写一个程序。 httpd执行ssl终止并提供基本身份验证。我需要阅读$ REMOTE_USER,但我不能在golang,而我可以在perl。
我的代码基于this fcgi example。我试试
func homeView(w http.ResponseWriter, r *http.Request) {
user, pass, authok := r.BasicAuth()
但是authok总是假的,用户和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:[]
我认为看到的标题没有任何关于任何授权的信息吗?但它确实在perl。
这是一个完整但极少的golang代码示例,演示了这个问题(在OpenBSD 5.8上使用go版本go1.4.2 openbsd / amd64和OpenBSDs httpd使用' authenticate" /"使用restricted_users&# 39;在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)}
}
帮助将不胜感激!
提前致谢! 吨。
答案 0 :(得分:2)
Go 1.9将公开cgi环境变量。如此关闭的票证所示:
答案 1 :(得分:1)
虽然@JimB
对您的方法有误,但我会回答上述问题。
net/http/fcgi
包使用net/http/cgi
的机制来填充http.Request
的实例 - 它将传递给您的处理程序 - 使用"参数" (Web /服务器)在FastCGI会话(调用)期间提交的(键/值对)。
这样做here。
现在,如果您要检查the relevant bit of the net/http/cgi
code,您会看到未映射到http.Request
get converted to HTTP "headers"的特定专用字段的变量。
这意味着,您的代码应该能够使用
ruser := r.Header.Get("Remote-User")
更新2015-12-02:由@JimB
执行的研究和OP显示,在FastCGI下显然无法读取REMOTE_USER
变量。对不起噪音。
答案 2 :(得分:1)
简单的答案(截至版本1.4.2)是go目前不支持传输CGI变量REMOTE_USER。
答案 3 :(得分:1)
这个fcgi包的core change正在审核中,并且即将合并。如果它与您不再相关,希望它对其他人有用。