向基于 Go 的反向代理服务器添加基本身份验证
Adding basic authentication to Go based reverse proxy server
我想使用 Go 反向代理服务器保护 Docker 守护进程 REST API。我发现这篇文章非常相关。我从未使用过 Go,所以不确定如何使用静态用户名和密码对此进行基本身份验证。我尝试了碰巧在 Google 上找到的所有可能方法,但 none 对我有用。
有人可以帮助将静态 basicAuth 身份验证添加到以下代码中,以便请求 Docker 守护进程 API 只有在请求包含用户名和密码时才能访问:
https://github.com/ben-lab/blog-material/blob/master/golang-reverse-proxy-2/reverse-proxy.go
package main
import (
"fmt"
"io"
"log"
"net/http"
"time"
"github.com/tv42/httpunix"
)
func handleHTTP(w http.ResponseWriter, req *http.Request) {
fmt.Printf("Requested : %s\n", req.URL.Path)
u := &httpunix.Transport{
DialTimeout: 100 * time.Millisecond,
RequestTimeout: 1 * time.Second,
ResponseHeaderTimeout: 1 * time.Second,
}
u.RegisterLocation("docker-socket", "/var/run/docker.sock")
req.URL.Scheme = "http+unix"
req.URL.Host = "docker-socket"
resp, err := u.RoundTrip(req)
if err != nil {
http.Error(w, err.Error(), http.StatusServiceUnavailable)
return
}
defer resp.Body.Close()
copyHeader(w.Header(), resp.Header)
w.WriteHeader(resp.StatusCode)
io.Copy(w, resp.Body)
}
func copyHeader(dst, src http.Header) {
for k, vv := range src {
for _, v := range vv {
dst.Add(k, v)
}
}
}
func main() {
server := &http.Server{
Addr: ":8888",
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { handleHTTP(w, r) }),
}
log.Fatal(server.ListenAndServe())
}
https://github.com/ben-lab/blog-material/blob/master/golang-reverse-proxy-2/reverse-proxy.go
给你,你可以从我下面的小项目中复制逻辑。
首先你需要一个服务器来存储用户(我用过Redis)。
你需要为用户提供 3 个功能
- 登录用户
- 注册用户
- 删除用户
在 login/register 阶段,您生成一个 cookie 散列 username/password 并将 cookie 设置到 Redis table
比起每次调用 API 都要验证。
随时复制您需要的代码。
如果有什么地方不太好理解,请提出问题。
您可以通过在
上调用 BasicAuth()
来访问基本身份验证 header 值
req *http.Request object
喜欢:
user, pass, _ := req.BasicAuth()
然后将 user 和 pass 与您拥有的静态值进行比较。
https://golang.org/pkg/net/http/#Request.BasicAuth
更新:
func handleHTTP(w http.ResponseWriter, req *http.Request) {
user, pass, _ := req.BasicAuth()
if user != "muuser" || pass != "mysecret" {
// you have to import "errors"
http.Error(w, errors.New("not authoized!!"), http. StatusUnauthorized)
return
}
fmt.Printf("Requested : %s\n", req.URL.Path)
u := &httpunix.Transport{
DialTimeout: 100 * time.Millisecond,
RequestTimeout: 1 * time.Second,
ResponseHeaderTimeout: 1 * time.Second,
}
u.RegisterLocation("docker-socket", "/var/run/docker.sock")
req.URL.Scheme = "http+unix"
req.URL.Host = "docker-socket"
resp, err := u.RoundTrip(req)
if err != nil {
http.Error(w, err.Error(), http.StatusServiceUnavailable)
return
}
defer resp.Body.Close()
copyHeader(w.Header(), resp.Header)
w.WriteHeader(resp.StatusCode)
io.Copy(w, resp.Body)
}
我想使用 Go 反向代理服务器保护 Docker 守护进程 REST API。我发现这篇文章非常相关。我从未使用过 Go,所以不确定如何使用静态用户名和密码对此进行基本身份验证。我尝试了碰巧在 Google 上找到的所有可能方法,但 none 对我有用。
有人可以帮助将静态 basicAuth 身份验证添加到以下代码中,以便请求 Docker 守护进程 API 只有在请求包含用户名和密码时才能访问: https://github.com/ben-lab/blog-material/blob/master/golang-reverse-proxy-2/reverse-proxy.go
package main
import (
"fmt"
"io"
"log"
"net/http"
"time"
"github.com/tv42/httpunix"
)
func handleHTTP(w http.ResponseWriter, req *http.Request) {
fmt.Printf("Requested : %s\n", req.URL.Path)
u := &httpunix.Transport{
DialTimeout: 100 * time.Millisecond,
RequestTimeout: 1 * time.Second,
ResponseHeaderTimeout: 1 * time.Second,
}
u.RegisterLocation("docker-socket", "/var/run/docker.sock")
req.URL.Scheme = "http+unix"
req.URL.Host = "docker-socket"
resp, err := u.RoundTrip(req)
if err != nil {
http.Error(w, err.Error(), http.StatusServiceUnavailable)
return
}
defer resp.Body.Close()
copyHeader(w.Header(), resp.Header)
w.WriteHeader(resp.StatusCode)
io.Copy(w, resp.Body)
}
func copyHeader(dst, src http.Header) {
for k, vv := range src {
for _, v := range vv {
dst.Add(k, v)
}
}
}
func main() {
server := &http.Server{
Addr: ":8888",
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { handleHTTP(w, r) }),
}
log.Fatal(server.ListenAndServe())
}
https://github.com/ben-lab/blog-material/blob/master/golang-reverse-proxy-2/reverse-proxy.go
给你,你可以从我下面的小项目中复制逻辑。
首先你需要一个服务器来存储用户(我用过Redis)。
你需要为用户提供 3 个功能
- 登录用户
- 注册用户
- 删除用户
在 login/register 阶段,您生成一个 cookie 散列 username/password 并将 cookie 设置到 Redis table
比起每次调用 API 都要验证。
随时复制您需要的代码。
如果有什么地方不太好理解,请提出问题。
您可以通过在
上调用BasicAuth()
来访问基本身份验证 header 值
req *http.Request object
喜欢:
user, pass, _ := req.BasicAuth()
然后将 user 和 pass 与您拥有的静态值进行比较。
https://golang.org/pkg/net/http/#Request.BasicAuth
更新:
func handleHTTP(w http.ResponseWriter, req *http.Request) {
user, pass, _ := req.BasicAuth()
if user != "muuser" || pass != "mysecret" {
// you have to import "errors"
http.Error(w, errors.New("not authoized!!"), http. StatusUnauthorized)
return
}
fmt.Printf("Requested : %s\n", req.URL.Path)
u := &httpunix.Transport{
DialTimeout: 100 * time.Millisecond,
RequestTimeout: 1 * time.Second,
ResponseHeaderTimeout: 1 * time.Second,
}
u.RegisterLocation("docker-socket", "/var/run/docker.sock")
req.URL.Scheme = "http+unix"
req.URL.Host = "docker-socket"
resp, err := u.RoundTrip(req)
if err != nil {
http.Error(w, err.Error(), http.StatusServiceUnavailable)
return
}
defer resp.Body.Close()
copyHeader(w.Header(), resp.Header)
w.WriteHeader(resp.StatusCode)
io.Copy(w, resp.Body)
}