【发布时间】:2020-07-11 16:18:41
【问题描述】:
我目前正在编写一个 HTTP 服务器(net/http),它托管多个端点,并且在访问这些端点之前需要客户端身份验证(步骤 1)。成功验证后,服务器会发出一个短期令牌,然后客户端使用该令牌访问这些端点。当客户端发送令牌(通过 HTTP 标头)时,在每个处理函数的开头都有一段代码来检查客户端是否经过身份验证并且提供的令牌是有效的。我正在寻找一个钩子/包装器,它可以拦截和验证客户端,而不是从每个端点函数调用isAuthenticated(r)。
func getMyEndpoint(w http.ResponseWriter, r *http.Request) {
if valid := isAuthenticated(r); !valid {
w.WriteHeader(http.StatusUnauthorized)
io.WriteString(w, "Invalid token or Client not authenticated."
return
}
...
}
func server() {
http.HandleFunc("/login", clientLoginWithCertAuth)
http.HandleFunc("/endpoint1", getMyEndpoint)
http.HandleFunc("/endpoint2", putMyEndpoint)
server := &http.Server{
Addr: ":443",
TLSConfig: &tls.Config{
ClientCAs: caCertPool,
ClientAuth: tls.VerifyClientCertIfGiven,
},
}
if err := server.ListenAndServeTLS("cert.pem", "key.pem"); err != nil {
panic(err)
}
}
【问题讨论】:
-
“我正在寻找一个钩子/包装器,它可以拦截和验证客户端,而不是从每个端点函数调用 isAuthenticated(r)。”那是什么意思?如果不是通过调用 isAuthenticated,钩子将如何验证客户端?或者您是在问如何编写一个 http.HandlerFunc 作为这样的包装器?
-
我猜这就是 OP 的要求。
标签: http go ssl ssl-client-authentication