Allow arbitrary data to be passed to templates

This commit is contained in:
Marc-André Dufresne 2019-08-06 13:14:53 -04:00
parent 6ae11a1cfe
commit d458e882aa
No known key found for this signature in database
GPG key ID: FA1CA2A4D65F5313
4 changed files with 43 additions and 0 deletions

View file

@ -0,0 +1,24 @@
# Templates
## Using your own templates
Dex supports using your own templates and passing arbitrary data to them to help customize your installation.
Steps:
1. Copy contents of the `web` directory over to a new directory.
2. Customize the templates as needed, be sure to retain all the existing variables so Dex continues working correctly.
a. Use this syntax `{{ "your_key" | extra }}` to use values from `frontend.extra`.
3. Write a theme for your templates in the `themes` directory.
4. Add your custom data to the Dex configuration `frontend.extra`.
```yaml
frontend:
dir: /path/to/custom/web
extra:
tos_footer_link: "https://example.com/terms"
client_logo_url: "../theme/client-logo.png"
foo: "bar"
```
5. Set the `frontend.dir` value to your own `web` directory.
To test your templates simply run Dex with a valid configuration and go through a login flow.

View file

@ -1,6 +1,7 @@
package main package main
import ( import (
"github.com/dexidp/dex/server"
"testing" "testing"
"github.com/ghodss/yaml" "github.com/ghodss/yaml"
@ -69,6 +70,12 @@ storage:
connectionTimeout: 3 connectionTimeout: 3
web: web:
http: 127.0.0.1:5556 http: 127.0.0.1:5556
frontend:
dir: ./web
extra:
foo: bar
staticClients: staticClients:
- id: example-app - id: example-app
redirectURIs: redirectURIs:
@ -130,6 +137,12 @@ logger:
Web: Web{ Web: Web{
HTTP: "127.0.0.1:5556", HTTP: "127.0.0.1:5556",
}, },
Frontend: server.WebConfig{
Dir: "./web",
Extra: map[string]string{
"foo": "bar",
},
},
StaticClients: []storage.Client{ StaticClients: []storage.Client{
{ {
ID: "example-app", ID: "example-app",

View file

@ -107,6 +107,9 @@ type WebConfig struct {
// Defaults to "coreos" // Defaults to "coreos"
Theme string Theme string
// Map of extra values passed into the templates
Extra map[string]string
} }
func value(val, defaultValue time.Duration) time.Duration { func value(val, defaultValue time.Duration) time.Duration {
@ -181,6 +184,7 @@ func newServer(ctx context.Context, c Config, rotationStrategy rotationStrategy)
issuerURL: c.Issuer, issuerURL: c.Issuer,
issuer: c.Web.Issuer, issuer: c.Web.Issuer,
theme: c.Web.Theme, theme: c.Web.Theme,
extra: c.Web.Extra,
} }
static, theme, tmpls, err := loadWebConfig(web) static, theme, tmpls, err := loadWebConfig(web)

View file

@ -42,6 +42,7 @@ type webConfig struct {
issuer string issuer string
theme string theme string
issuerURL string issuerURL string
extra map[string]string
} }
func join(base, path string) string { func join(base, path string) string {
@ -140,6 +141,7 @@ func loadTemplates(c webConfig, templatesDir string) (*templates, error) {
"logo": func() string { return c.logoURL }, "logo": func() string { return c.logoURL },
"url": func(s string) string { return join(c.issuerURL, s) }, "url": func(s string) string { return join(c.issuerURL, s) },
"lower": strings.ToLower, "lower": strings.ToLower,
"extra": func(k string) string { return c.extra[k] },
} }
tmpls, err := template.New("").Funcs(funcs).ParseFiles(filenames...) tmpls, err := template.New("").Funcs(funcs).ParseFiles(filenames...)