我目前正在编写一个 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)
}
}
开满天机
相关分类