golang with fastcgi如何阅读REMOTE_USER

时间:2015-11-30 20:02:40

标签: go fastcgi basic-authentication openbsd

简短:如何使用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)}
}

帮助将不胜感激!

提前致谢! 吨。

4 个答案:

答案 0 :(得分:2)

Go 1.9将公开cgi环境变量。如此关闭的票证所示:

https://go-review.googlesource.com/c/40012

答案 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正在审核中,并且即将合并。如果它与您不再相关,希望它对其他人有用。