Traefik,如何将参数追加到路径?

时间:2018-01-31 15:21:18

标签: traefik

我在(内部)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日志中,附加的参数不会添加到到后端的实际查询参数中。

2 个答案:

答案 0 :(得分:1)

pathquery 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)