本文是go-zero開發入門-API網關開發示例一文的延伸,繼續之前請先閱讀此文。
在項目根目錄下創建子目錄 middleware,在此目錄下創建文件 auth.go,內容如下:
// 鑒權中間件
package middlewareimport ("context""errors""net/http"
)var ErrInvalidToken = errors.New("invalid token")func AuthMiddleware(next http.HandlerFunc) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {token := r.Header.Get("Authorization")// 調用登錄服務接口生成鑒權信息// 這里只是一個示例,實際需替換為實際的登錄服務調用if token != "valid-token" {w.Write([]byte("invalid token"))return}// 將鑒權信息添加到請求上下文中ctx := context.WithValue(r.Context(), "token", token)next.ServeHTTP(w, r.WithContext(ctx))}
}
在網關 main.go 文件中加入鑒權中間件:
package mainimport ("flag""fmt""gateway/middleware""github.com/zeromicro/go-zero/core/conf""github.com/zeromicro/go-zero/gateway"
)var configFile = flag.String("f", "etc/gateway.yaml", "the config file")func main() {var c gateway.GatewayConfflag.Parse()conf.MustLoad(*configFile, &c)server := gateway.MustNewServer(c)server.Use(middleware.AuthMiddleware) // 使用 server 的 Use() 方法添加全局中間件defer server.Stop()fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port)server.Start()
}
在網關的配置文件 etc/gateway.yaml 中加入鑒權:
Name: go-zero-gateway
Host: 0.0.0.0
Port: 9999
Upstreams:- Grpc:Etcd:Hosts:- 127.0.0.1:2379Key: add.rpcProtoSets:- /root/go-zero/gateway/proto/add.pbMappings: # Mappings can also be written in proto options- Method: getPath: /addRpcPath: add.Adder/addHeaders: - Authorization
編譯生成網關可執行程序文件:
# cat Makefile
all: gateway
gateway: main.gogo build -o gateway main.go clean:rm -f gatewayrpc:goctl gateway -dir gateway
啟動網關:
./gateway
請求網關:
# curl -i '127.0.0.1:9999/add?a=1&b=2'
HTTP/1.1 200 OK
Traceparent: 00-1cd6f9f8c902193d8dd7da646f775d0d-4959382686bbb075-00
Date: Sun, 10 Dec 2023 12:04:40 GMT
Content-Length: 13
Content-Type: text/plain; charset=utf-8invalid token