0 前言
Oathkeeper主要基于HTTP server接收的HTTP/HTTPS请求,并进行认证,授权等操作。因此,对于其服务端的启动、Handler注册、Handler执行过程需要更加的了解才能够进行后续的开发。
1 HTTP(s)handle的注册
Oathkeeper通过以下代码完成HTTP处理函数的注册。
handler := &httputil.ReverseProxy{
Director: proxy.Director, //通过Director将请求将客户端请求转发出去
Transport: proxy,
}
/*
n为*negroni.Negroni对象,n.Use和n.UseHandler函数按着使用顺序形成一条函数调用链[fun1,fun2,...,funx]
其中,fun1的参数有三个:请求数据,响应数据,以及next
UseHandler函数会对http.Handler类型的变量(设为handler)进行装饰,在执行完handler.ServeHTTP后,会自动执行调用链接下来的函数
*/
n.Use(metrics.NewMiddleware(prom, "oathkeeper-proxy").ExcludePaths(healthx.ReadyCheckPath, healthx.AliveCheckPath).CollapsePaths(promCollapsePaths))
n.Use(reqlog.NewMiddlewareFromLogger(logger, "oathkeeper-proxy").ExcludePaths(healthx.ReadyCheckPath, healthx.AliveCheckPath))
/*
执行完n.UseHandler后,warp(handler.ServeHTTP)会加入函数调用链
*/
n.UseHandler(handler)
由于Negroni实现了ServeHTTP接口,所以它也是一个http.Handler,他的ServeHTTP接口实现如下:
/*
对一个请求,该ServeHTTP最先被调用
*/
func (n *Negroni) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
n.middleware.ServeHTTP(NewResponseWriter(rw), r)
}
/*
由Negroni调用,middleware会从前往后调用由n.Use和n.UseHandler注册的内容
*/
func (m middleware) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
m.handler.ServeHTTP(rw, r, m.nextfn)
}
在执行完三个use函数后,Negroni的handles成员会有三个Handler,在执行Negroni.ServeHTTP时,会依次执行这三个Handler的ServeHTTP函数,在执行到第三个Handler(即:httputil.ReverseProxy)时,就会执行认证授权及转发流程。
2 HTTP请求的处理流程
借鉴一个大佬的博客《深入理解Golang之http server》,HTTP数据包到达服务器后的整体流程如下图所示:
图1 HTTP server整体处理流程
在Oathkeeper启动服务器的流程中,可以通过验证证书是否有效从而确定是启动HTTP服务还是启动HTTPS服务。
就HTTPS服务器启动而言,主要经过了如下流程:
图2 TLS服务器整体运行流程框架流程
由图2所示,在最开始的启动阶段,服务器将监听端口直到收到请求。在收到HTTPS请求后,则会开一个协程,完成TLS的握手、获取请求数据并调用服务端的ServeHTTP,对于Oathkeeper,即第一节中的Negroni.ServeHTTP。