将授权和来源标头添加到traefik反向代理

时间:2019-01-25 07:28:33

标签: docker-compose traefik

我使用Traefik进行了非常简单的设置,使用Docker和Let's Encrypt将传入请求代理到API服务。

除了客户端由于CORS无法向API发出请求之外,其他所有程序都运行良好。

如何添加Origin,Content-Type和Authorization标头,以确保它们到达运行在代理后面的Node API,并确保Access-Control-Allow-Origin保留在响应标头中? strong>

我的traefik.toml文件:

        debug = false

        logLevel = "ERROR"
        defaultEntryPoints = ["https","http"]

        [entryPoints]
        [entryPoints.http]
        address = ":80"
            [entryPoints.http.redirect]
            entryPoint = "https"
        [entryPoints.https]
        address = ":443"
        [entryPoints.https.tls]

        [retry]

        [docker]
        endpoint = "unix:///var/run/docker.sock"
        domain = "<hostname-here>"
        watch = true
        exposedByDefault = false

        [acme]
        email = "<your-email-here>"
        storage = "acme.json"
        entryPoint = "https"
        onHostRule = true
        [acme.httpChallenge]
        entryPoint = "http"

运行我的API的我的docker-compose.yml

version: "2"
services:

  app: 
    build:
      context: .
      dockerfile: Dockerfile-App
    environment:
      - NODE_ENV=${NODE_ENV}
    restart: always
    networks:
      - web
      - default
    expose:
      - "5000"
    labels:
      - "traefik.docker.network=web"
      - "traefik.enable=true"
      - "traefik.basic.frontend.rule=Host:${HOSTNAME}"
      - "traefik.frontend.auth.forward.trustForwardHeader=true"
      - "traefik.frontend.passHostHeader=true"
      - "traefik.basic.port=5000"
      - "traefik.basic.protocol=http"

networks:
  web:
    external: true

文档暗示您可以添加customHeaders

  

traefik.frontend.headers.customResponseHeaders = EXPR在将响应转发给客户端之前,将标头附加到容器返回的每个响应中。   格式:HEADER:value || HEADER2:value2

但是我应该如何知道动态值(例如授权令牌)的值?

编辑:

我尝试添加这样的自定义标头:

- "traefik.frontend.headers.customResponseHeaders=Access-Control-Allow-Origin: *"

但这根本没有被附加到响应头中。

2 个答案:

答案 0 :(得分:0)

我正在根据请求的来源有条件地在我的nodejs应用程序中解析CORS,以试图将主机名列入白名单,但是Traefik没有正确设置来源。我改用Traefik删除了条件主机和列入白名单的主机名。

完成此操作后,CORS可以正常工作,并且上面的标签都正确。

答案 1 :(得分:0)

入口点>路由器>中间件>服务

我认为您应该首先创建中间件,然后将其附加到特定的路由器: 通过将这些标签添加到服务中,我将标题添加到了响应中:

        ...
        - "traefik.http.routers.frontend.entrypoints=http"
#creating middleware for headers
        - "traefik.http.middlewares.frontend.headers.customresponseheaders.Access-Control-Allow-Methods=POST, GET, PUT, OPTIONS, DELETE"
        - "traefik.http.middlewares.frontend.headers.customresponseheaders.Access-Control-Allow-Origin=*"
        - "traefik.http.middlewares.frontend.headers.customresponseheaders.Access-Control-Allow-Headers=x-requested-with, Content-Type,Authorization"
#attach middleware to the frontend router
        - "traefik.http.routers.frontend.middlewares=frontend"