Merge pull request #1504 from MarcDufresne/template-custom-data
Allow arbitrary data to be passed to templates
This commit is contained in:
		
							
								
								
									
										24
									
								
								Documentation/templates.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								Documentation/templates.md
									
									
									
									
									
										Normal 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.
 | 
				
			||||||
@@ -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",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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...)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user