Compare commits
5 Commits
v2024.6.5-
...
v2024.6.25
Author | SHA1 | Date | |
---|---|---|---|
9d902a7494 | |||
ea68724635 | |||
1009eb19aa | |||
19fda6aa64 | |||
65238f1ff3 |
@ -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 s’appellera `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`.
|
||||||
|
@ -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)
|
||||||
|
@ -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 (
|
||||||
|
@ -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,
|
||||||
|
@ -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"
|
||||||
|
Reference in New Issue
Block a user