thomseddon/traefik-forward-auth

Loop when authorising user?

PixNyb opened this issue · 3 comments

I've tried to follow the setup and examples as closely as i can, and look through the issues as much as possible but i can't seem to get the forward auth container to work properly. Everything works up until the redirect back to the auth service, which sends me back to the login page and eventually enters a loop until the provider has had enough and logs me back out. I'm probably missing something, anyone willing to help me out?

Docker compose:

services:
  traefik:
    image: traefik:2.11
    command:
      - --providers.docker
      - --providers.docker.exposedbydefault=false
      - --providers.docker.swarmmode
      - --providers.file.filename=/config/dynamic.yml
      - --entrypoints.http.address=:80
      - --entrypoints.https.address=:443
      - --certificatesresolvers.le.acme.email=xxx@xxx.xxx
      - --certificatesresolvers.le.acme.storage=/config/acme.json
      - --certificatesresolvers.le.acme.tlschallenge=true
      - --certificatesresolvers.le.acme.dnschallenge=true
      - --certificatesresolvers.le.acme.dnschallenge.provider=cloudflare
      - --certificatesResolvers.le.acme.dnsChallenge.resolvers=1.1.1.1:53,1.0.0.1:53
      - --accesslog
      - --log
      - --api
    ports:
      - 80:80
      - 443:443
      - 2222:2222
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - traefik:/config
    networks:
      - traefik
    environment:
      - LEGO_DISABLE_CNAME_SUPPORT=true
      - CF_API_EMAIL=xxx@xxx.xxx
      - CF_API_KEY=xxx
      - CLOUDFLARE_PROPAGATION_TIMEOUT=3600
    deploy:
      placement:
        constraints:
          - node.role == manager
      labels:
        - traefik.enable=true
        - traefik.docker.network=traefik
        - traefik.http.middlewares.https-redirect.redirectscheme.scheme=https
        - traefik.http.middlewares.https-redirect.redirectscheme.permanent=true
        - traefik.http.middlewares.extended-headers.headers.accesscontrolallowheaders=*
        - traefik.http.middlewares.extended-headers.headers.contentSecurityPolicy=upgrade-insecure-requests
        - traefik.http.middlewares.extended-headers.headers.referrerPolicy=no-referrer-when-downgrade
        - traefik.http.routers.http-catchall.rule=HostRegexp(`{host:.+}`)
        - traefik.http.routers.http-catchall.entrypoints=http
        - traefik.http.routers.http-catchall.middlewares=https-redirect
        - traefik.http.routers.http-catchall.priority=1
        - traefik.http.routers.traefik-https.rule=Host(`traefik.xxx.xxx`)
        - traefik.http.routers.traefik-https.entrypoints=https
        - traefik.http.routers.traefik-https.tls=true
        - traefik.http.routers.traefik-https.tls.certresolver=le
        - traefik.http.routers.traefik-https.service=api@internal
        - traefik.http.routers.traefik-https.middlewares=auth
        - traefik.http.services.traefik.loadbalancer.server.port=8080

  auth:
    image: thomseddon/traefik-forward-auth:2
    command:
      - --cookie-domain=xxx.xxx
      - --cookie-domain=yyy.yyy
    environment:
      - SECRET=xxx
      - INSECURE_COOKIE=false
      - DOMAIN=xxx.xxx
      - DEFAULT_PROVIDER=generic-oauth
      - PROVIDERS_GENERIC_OAUTH_AUTH_URL=https://github.com/login/oauth/authorize
      - PROVIDERS_GENERIC_OAUTH_TOKEN_URL=https://github.com/login/oauth/access_token
      - PROVIDERS_GENERIC_OAUTH_USER_URL=https://api.github.com/user
      - PROVIDERS_GENERIC_OAUTH_CLIENT_ID=xxx
      - PROVIDERS_GENERIC_OAUTH_CLIENT_SECRET=xxx
      - AUTH_HOST=auth.xxx.xxx
    networks:
      - traefik
    deploy:
      mode: replicated
      replicas: 1
      labels:
        - traefik.enable=true
        - traefik.docker.network=traefik
        - traefik.http.routers.auth.rule=Host(`auth.xxx.xxx`)
        - traefik.http.routers.auth.entrypoints=https
        - traefik.http.routers.auth.tls=true
        - traefik.http.routers.auth.tls.certresolver=le
        - traefik.http.routers.auth.service=auth
        - traefik.http.middlewares.auth.forwardauth.address=http://auth:4181
        - traefik.http.middlewares.auth.forwardauth.authResponseHeaders=X-Forwarded-User
        - traefik.http.middlewares.auth.forwardauth.trustForwardHeader=true
        - traefik.http.services.auth.loadbalancer.server.port=4181

  whoami:
    image: containous/whoami
    networks:
      - traefik
    deploy:
      mode: replicated
      replicas: 1
      labels:
        - traefik.enable=true
        - traefik.docker.network=traefik
        - traefik.http.routers.whoami.rule=Host(`whoami.xxx.xxx`)
        - traefik.http.routers.whoami.entrypoints=https
        - traefik.http.routers.whoami.tls=true
        - traefik.http.routers.whoami.tls.certresolver=le
        - traefik.http.routers.whoami.middlewares=auth
        - traefik.http.services.whoami.loadbalancer.server.port=80

Please note xxx.xxx is the same domain, but i've decided to redact it. yyy.yyy is a similar domain which also routes to the same traefik instance

The authorisation url i've set up in my github application is https://auth.xxx.xxx/_oauth

I've decided to try adding a different provider and the issue still remains. When i use Google it loops back to the google login page

I ended up being able to fix it by adding the auth middleware to the auth service as briefly mentioned in #362. I strongly recommend updating the examples in the example folder since the current stacks are incompatible with swarm.

My working docker stack looks like this:

services:
  traefik:
    image: traefik:2.11
    command:
      - --providers.docker
      - --providers.docker.exposedbydefault=false
      - --providers.docker.swarmmode
      - --providers.file.filename=/config/dynamic.yml
      - --entrypoints.http.address=:80
      - --entrypoints.https.address=:443
      - --entrypoints.ssh.address=:2222
      - --certificatesresolvers.le.acme.email=xxx@xxx.xxx
      - --certificatesresolvers.le.acme.storage=/config/acme.json
      - --certificatesresolvers.le.acme.tlschallenge=true
      - --certificatesresolvers.le.acme.dnschallenge=true
      - --certificatesresolvers.le.acme.dnschallenge.provider=cloudflare
      - --certificatesResolvers.le.acme.dnsChallenge.resolvers=1.1.1.1:53,1.0.0.1:53
      - --accesslog
      - --log
      - --api
    ports:
      - 80:80
      - 443:443
      - 2222:2222
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - traefik:/config
    networks:
      - traefik
    environment:
      - LEGO_DISABLE_CNAME_SUPPORT=true
      - CF_API_EMAIL=xxx@xxx.xxx
      - CF_API_KEY=xxx
      - CLOUDFLARE_PROPAGATION_TIMEOUT=3600
    deploy:
      placement:
        constraints:
          - node.role == manager
      labels:
        - traefik.enable=true
        - traefik.docker.network=traefik
        # Middleware to add security headers
        - traefik.http.middlewares.extended-headers.headers.accesscontrolallowheaders=*
        - traefik.http.middlewares.extended-headers.headers.contentSecurityPolicy=upgrade-insecure-requests
        - traefik.http.middlewares.extended-headers.headers.referrerPolicy=no-referrer-when-downgrade
        # Catch all http requests and redirect to https
        - traefik.http.routers.http-catchall.rule=HostRegexp(`{host:.+}`)
        - traefik.http.routers.http-catchall.entrypoints=http
        - traefik.http.routers.http-catchall.middlewares=https-redirect
        - traefik.http.routers.http-catchall.priority=1
        - traefik.http.middlewares.https-redirect.redirectscheme.scheme=https
        - traefik.http.middlewares.https-redirect.redirectscheme.permanent=true
        # Traefik dashboard
        - traefik.http.routers.traefik-https.rule=Host(`traefik.xxx.xxx`)
        - traefik.http.routers.traefik-https.entrypoints=https
        - traefik.http.routers.traefik-https.tls=true
        - traefik.http.routers.traefik-https.tls.certresolver=le
        - traefik.http.routers.traefik-https.service=api@internal
        - traefik.http.routers.traefik-https.middlewares=traefik-auth
        - traefik.http.services.traefik.loadbalancer.server.port=8080
        - traefik.http.middlewares.traefik-auth.basicAuth.usersFile=/config/users
        # Redirect yyy.yyy to xxx.xxx
        - traefik.http.routers.redirect-https.rule=Host(`yyy.yyy`)
        - traefik.http.routers.redirect-https.entrypoints=https
        - traefik.http.routers.redirect-https.middlewares=redirect-dev
        - traefik.http.routers.redirect-https.tls=true
        - traefik.http.routers.redirect-https.tls.certresolver=le
        - traefik.http.middlewares.redirect-dev.redirectregex.regex=yyy.yyy
        - traefik.http.middlewares.redirect-dev.redirectregex.replacement=xxx.xxx
        - traefik.http.middlewares.redirect-dev.redirectregex.permanent=true

  auth:
    image: thomseddon/traefik-forward-auth:2
    command:
      - --match-whitelist-or-domain
    environment:
      - LOG_LEVEL=debug
      - LOG_FORMAT=pretty
      # - DOMAIN=xxx.xxx
      - COOKIE_DOMAIN=xxx.xxx,yyy.yyy
      - AUTH_HOST=auth.xxx.xxx
      - DEFAULT_PROVIDER=google
      - SECRET=xxx
      - PROVIDERS_GOOGLE_CLIENT_ID=xxx
      - PROVIDERS_GOOGLE_CLIENT_SECRET=xxx
      - PROVIDERS_GENERIC_OAUTH_AUTH_URL=https://github.com/login/oauth/authorize
      - PROVIDERS_GENERIC_OAUTH_TOKEN_URL=https://github.com/login/oauth/access_token
      - PROVIDERS_GENERIC_OAUTH_USER_URL=https://api.github.com/user
      - PROVIDERS_GENERIC_OAUTH_CLIENT_ID=xxx
      - PROVIDERS_GENERIC_OAUTH_CLIENT_SECRET=xxx
    networks:
      - traefik
    deploy:
      mode: replicated
      replicas: 1
      labels:
        - traefik.enable=true
        - traefik.docker.network=traefik
        - traefik.http.routers.auth.rule=Host(`auth.xxx.xxx`)
        - traefik.http.routers.auth.entrypoints=https
        - traefik.http.routers.auth.tls=true
        - traefik.http.routers.auth.tls.certresolver=le
        - traefik.http.routers.auth.service=auth
        - traefik.http.routers.auth.middlewares=auth
        - traefik.http.middlewares.auth.forwardauth.address=http://auth:4181
        - traefik.http.middlewares.auth.forwardauth.authResponseHeaders=X-Forwarded-User
        - traefik.http.middlewares.auth.forwardauth.trustForwardHeader=true
        - traefik.http.services.auth.loadbalancer.server.port=4181

  whoami:
    image: containous/whoami
    networks:
      - traefik
    deploy:
      mode: replicated
      replicas: 1
      labels:
        - traefik.enable=true
        - traefik.docker.network=traefik
        - traefik.http.routers.whoami.rule=Host(`whoami.xxx.xxx`)
        - traefik.http.routers.whoami.entrypoints=https
        - traefik.http.routers.whoami.tls=true
        - traefik.http.routers.whoami.tls.certresolver=le
        - traefik.http.routers.whoami.middlewares=auth
        - traefik.http.services.whoami.loadbalancer.server.port=80