我在(内部)Traefik - 提供商面前使用OAuth2作为API网关。
直接使用我的OAuth2提供程序可以正常工作:
curl -XPOST -H 'Content-Type: application/x-www-form-urlencoded' \
-H 'Accept: application/json' -d 'username=username&password=password' \
'http://my-oauth-provider/oauth/token?grant_type=password&client_id=client_id&client_secret=client_secret
// 200 OK, getting a Bearer-token
在我的用例中,我想在Traefik配置中隐藏Oauth2 client_id。 API-consumer只提供用户名/密码,client_id等将被Traefik添加到HTTP请求中。
curl -XPOST -H 'Content-Type: application/x-www-form-urlencoded' \
-H 'Accept: application/json' -d 'username=username&password=password' \
'http://my-traefik-api-gateway/oauth/token
(如何)可以使用Traefik完成?
到目前为止我尝试了什么
我希望使用Traefik's ReplacePathRegex-modifiers来解决我的挑战:
[frontends]
[frontends.oauth-provider]
backend = "my-oauth-provider"
[frontends.oauth-provider.routes.route1]
rule = "ReplacePathRegex: ^(.*)$ $1?grant_type=client_credentials&client_id=client_id&client_secret=client_secret; Path: /oauth/token"
这不起作用。从我假设的Traefik日志中,附加的参数不会添加到到后端的实际查询参数中。
答案 0 :(得分:1)
path
与query parameters
不同。
没有办法做你想做的事。
您只能使用修饰符更改路径。
答案 1 :(得分:0)
如果您愿意将此更改应用于traefik,则可以使用:
diff --git middlewares/replace_path_regex.go middlewares/replace_path_regex.go
index d753e86c..da21a259 100644
--- middlewares/replace_path_regex.go
+++ middlewares/replace_path_regex.go
@@ -33,7 +33,13 @@ func (s *ReplacePathRegex) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if s.Regexp != nil && len(s.Replacement) > 0 && s.Regexp.MatchString(r.URL.Path) {
r = r.WithContext(context.WithValue(r.Context(), ReplacePathKey, r.URL.Path))
r.Header.Add(ReplacedPathHeader, r.URL.Path)
- r.URL.Path = s.Regexp.ReplaceAllString(r.URL.Path, s.Replacement)
+ replacement := s.Regexp.ReplaceAllString(r.URL.Path, s.Replacement)
+ u, err := r.URL.Parse(replacement)
+ if err != nil {
+ log.Errorf("bad replacement %s: %s", replacement, err)
+ } else {
+ r.URL = u
+ }
r.RequestURI = r.URL.RequestURI()
}
s.Handler.ServeHTTP(w, r)