Compare commits

...

5 Commits

Author SHA1 Message Date
9d902a7494 doc: update create custom layer tutorial
All checks were successful
Cadoles/bouncer/pipeline/head This commit looks good
2024-06-25 11:32:54 +02:00
ea68724635 fix: update dummy bootstrap example
All checks were successful
Cadoles/bouncer/pipeline/head This commit looks good
2024-06-25 11:25:34 +02:00
1009eb19aa feat: use destination path as prefix when rewritting url
All checks were successful
Cadoles/bouncer/pipeline/head This commit looks good
2024-06-24 17:18:31 +02:00
19fda6aa64 feat(authn-oidc): allow overwriting of cookie name
All checks were successful
Cadoles/bouncer/pipeline/head This commit looks good
2024-06-05 16:13:45 +02:00
65238f1ff3 feat(authn-oidc): include proxy in cookie name
All checks were successful
Cadoles/bouncer/pipeline/head This commit looks good
2024-06-05 16:00:23 +02:00
5 changed files with 28 additions and 21 deletions

View File

@ -10,13 +10,13 @@ Avoir un environnement de développement local fonctionnel. Voir tutoriel ["Dém
### Préparer la structure de base du nouveau layer ### Préparer la structure de base du nouveau layer
Une implémetation d'un layer se compose majoritairement de 3 éléments: Une implémentation d'un layer se compose majoritairement de 3 éléments:
- Une structure qui implémente une ou plusieurs interfaces (`director.MiddlewareLayer`, `director.RequestTransformerLayer` et/ou `director.ResponseTransformerLayer`); - Une structure qui implémente une ou plusieurs interfaces (`director.MiddlewareLayer`, `director.RequestTransformerLayer` et/ou `director.ResponseTransformerLayer`);
- Un schéma au format [JSON Schema](http://json-schema.org/) qui permettra de valider les "options" de notre layer; - Un schéma au format [JSON Schema](http://json-schema.org/) qui permettra de valider les "options" de notre layer;
- Un fichier d'amorçage qui permettra à Bouncer de référencer notre nouveau layer. - Un fichier d'amorçage qui permettra à Bouncer de référencer notre nouveau layer.
1. Créer le répertoire du `package` Go qui contiendra le code de votre layer. Celui ci s'appelera `basicauth`: 1. Créer le répertoire du `package` Go qui contiendra le code de votre layer. Celui ci sappellera `basicauth`:
``` ```
mkdir -p internal/proxy/director/layer/basicauth mkdir -p internal/proxy/director/layer/basicauth
@ -133,26 +133,22 @@ Une implémetation d'un layer se compose majoritairement de 3 éléments:
## Tester l'intégration de notre nouveau layer ## Tester l'intégration de notre nouveau layer
À ce stade, notre nouveau layer est normalement référencé et donc "utilisable" dans Bouncer (si on omet le fait qu'il déclenchera une `panic()`). À ce stade, notre nouveau layer est normalement référencé et donc "utilisable" dans Bouncer (si on omet le fait qu'il déclenchera un `panic()`).
1. Vérifier que notre layer est bien référencé en exécutant la commande: 1. Vérifier que notre layer est bien référencé en exécutant la commande:
``` ```
./bin/bouncer admin layer create --help ./bin/bouncer admin definition layer query --with-type basicauth
``` ```
La sortie devrait ressembler à: La sortie devrait ressembler à:
``` ```
NAME: +-----------+-----------------------------------+
bouncer admin layer create - Create layer | TYPE | OPTIONS |
+-----------+-----------------------------------+
USAGE: | basicauth | {"type":"object","properties":... |
bouncer admin layer create [command options] [arguments...] +-----------+-----------------------------------+
OPTIONS:
--layer-type LAYER_TYPE Set LAYER_TYPE as layer's type (available: [basicauth queue])
[...]
``` ```
Comme vous devriez le voir nous pouvons désormais créer des layers de type `basicauth`. Comme vous devriez le voir nous pouvons désormais créer des layers de type `basicauth`.

View File

@ -70,6 +70,7 @@ MAIN:
r.URL.Host = toURL.Host r.URL.Host = toURL.Host
r.URL.Scheme = toURL.Scheme r.URL.Scheme = toURL.Scheme
r.URL.Path = toURL.JoinPath(r.URL.Path).Path
ctx = logger.With(ctx, ctx = logger.With(ctx,
logger.F("proxy", match.Name), logger.F("proxy", match.Name),
@ -77,6 +78,11 @@ MAIN:
logger.F("remoteAddr", r.RemoteAddr), logger.F("remoteAddr", r.RemoteAddr),
) )
logger.Debug(
ctx, "rewritten url",
logger.F("rewrittenURL", r.URL.String()),
)
metricProxyRequestsTotal.With(prometheus.Labels{metricLabelProxy: string(match.Name)}).Add(1) metricProxyRequestsTotal.With(prometheus.Labels{metricLabelProxy: string(match.Name)}).Add(1)
ctx = withProxy(ctx, match) ctx = withProxy(ctx, match)

View File

@ -42,7 +42,7 @@ func (a *Authenticator) PreAuthentication(w http.ResponseWriter, r *http.Request
return errors.WithStack(err) return errors.WithStack(err)
} }
sess, err := a.store.Get(r, a.getCookieName(options.Cookie.Name, layer.Name)) sess, err := a.store.Get(r, a.getCookieName(options.Cookie.Name, layer.Proxy, layer.Name))
if err != nil { if err != nil {
logger.Error(ctx, "could not retrieve session", logger.E(errors.WithStack(err))) logger.Error(ctx, "could not retrieve session", logger.E(errors.WithStack(err)))
} }
@ -121,7 +121,7 @@ func (a *Authenticator) Authenticate(w http.ResponseWriter, r *http.Request, lay
return nil, errors.WithStack(err) return nil, errors.WithStack(err)
} }
sess, err := a.store.Get(r, a.getCookieName(options.Cookie.Name, layer.Name)) sess, err := a.store.Get(r, a.getCookieName(options.Cookie.Name, layer.Proxy, layer.Name))
if err != nil { if err != nil {
return nil, errors.WithStack(err) return nil, errors.WithStack(err)
} }
@ -401,8 +401,14 @@ func (a *Authenticator) getClient(options *LayerOptions, redirectURL string) (*C
return client, nil return client, nil
} }
func (a *Authenticator) getCookieName(cookieName string, layerName store.LayerName) string { const defaultCookieNamePrefix = "_bouncer_authn_oidc"
return fmt.Sprintf("%s_%s", cookieName, layerName)
func (a *Authenticator) getCookieName(cookieName string, proxyName store.ProxyName, layerName store.LayerName) string {
if cookieName != "" {
return cookieName
}
return strings.ToLower(fmt.Sprintf("%s_%s_%s", defaultCookieNamePrefix, proxyName, layerName))
} }
var ( var (

View File

@ -8,8 +8,6 @@ import (
"github.com/pkg/errors" "github.com/pkg/errors"
) )
const defaultCookieName = "_bouncer_authn_oidc"
type LayerOptions struct { type LayerOptions struct {
authn.LayerOptions authn.LayerOptions
OIDC OIDCOptions `mapstructure:"oidc"` OIDC OIDCOptions `mapstructure:"oidc"`
@ -57,7 +55,7 @@ func fromStoreOptions(storeOptions store.LayerOptions) (*LayerOptions, error) {
Scopes: []string{"openid"}, Scopes: []string{"openid"},
}, },
Cookie: CookieOptions{ Cookie: CookieOptions{
Name: defaultCookieName, Name: "",
Path: "/", Path: "/",
HTTPOnly: true, HTTPOnly: true,
MaxAge: time.Hour, MaxAge: time.Hour,

View File

@ -19,7 +19,8 @@ layers:
# clientId: my-client-id # clientId: my-client-id
# clientSecret: my-client-id # clientSecret: my-client-id
# issuerURL: https://forge.cadoles.com/ # issuerURL: https://forge.cadoles.com/
# postLogoutRedirectURL: http://localhost:8080 # postLogoutRedirectURLs:
# - http://localhost:8080
# scopes: ["profile", "openid", "email"] # scopes: ["profile", "openid", "email"]
# authParams: # authParams:
# acr_values: "eidas2" # acr_values: "eidas2"