mirror of https://github.com/dexidp/dex.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.7 KiB
96 lines
2.7 KiB
package main |
|
|
|
import ( |
|
"html/template" |
|
"log" |
|
"net/http" |
|
) |
|
|
|
var indexTmpl = template.Must(template.New("index.html").Parse(`<html> |
|
<body> |
|
<form action="/login" method="post"> |
|
<p> |
|
Authenticate for:<input type="text" name="cross_client" placeholder="list of client-ids"> |
|
</p> |
|
<p> |
|
Extra scopes:<input type="text" name="extra_scopes" placeholder="list of scopes"> |
|
</p> |
|
<p> |
|
Connector ID:<input type="text" name="connector_id" placeholder="connector id"> |
|
</p> |
|
<p> |
|
Request offline access:<input type="checkbox" name="offline_access" value="yes" checked> |
|
</p> |
|
<input type="submit" value="Login"> |
|
</form> |
|
</body> |
|
</html>`)) |
|
|
|
func renderIndex(w http.ResponseWriter) { |
|
renderTemplate(w, indexTmpl, nil) |
|
} |
|
|
|
type tokenTmplData struct { |
|
IDToken string |
|
AccessToken string |
|
RefreshToken string |
|
RedirectURL string |
|
Claims string |
|
} |
|
|
|
var tokenTmpl = template.Must(template.New("token.html").Parse(`<html> |
|
<head> |
|
<style> |
|
/* make pre wrap */ |
|
pre { |
|
white-space: pre-wrap; /* css-3 */ |
|
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ |
|
white-space: -pre-wrap; /* Opera 4-6 */ |
|
white-space: -o-pre-wrap; /* Opera 7 */ |
|
word-wrap: break-word; /* Internet Explorer 5.5+ */ |
|
} |
|
</style> |
|
</head> |
|
<body> |
|
<p> ID Token: <pre><code>{{ .IDToken }}</code></pre></p> |
|
<p> Access Token: <pre><code>{{ .AccessToken }}</code></pre></p> |
|
<p> Claims: <pre><code>{{ .Claims }}</code></pre></p> |
|
{{ if .RefreshToken }} |
|
<p> Refresh Token: <pre><code>{{ .RefreshToken }}</code></pre></p> |
|
<form action="{{ .RedirectURL }}" method="post"> |
|
<input type="hidden" name="refresh_token" value="{{ .RefreshToken }}"> |
|
<input type="submit" value="Redeem refresh token"> |
|
</form> |
|
{{ end }} |
|
</body> |
|
</html> |
|
`)) |
|
|
|
func renderToken(w http.ResponseWriter, redirectURL, idToken, accessToken, refreshToken, claims string) { |
|
renderTemplate(w, tokenTmpl, tokenTmplData{ |
|
IDToken: idToken, |
|
AccessToken: accessToken, |
|
RefreshToken: refreshToken, |
|
RedirectURL: redirectURL, |
|
Claims: claims, |
|
}) |
|
} |
|
|
|
func renderTemplate(w http.ResponseWriter, tmpl *template.Template, data interface{}) { |
|
err := tmpl.Execute(w, data) |
|
if err == nil { |
|
return |
|
} |
|
|
|
switch err := err.(type) { |
|
case *template.Error: |
|
// An ExecError guarantees that Execute has not written to the underlying reader. |
|
log.Printf("Error rendering template %s: %s", tmpl.Name(), err) |
|
|
|
// TODO(ericchiang): replace with better internal server error. |
|
http.Error(w, "Internal server error", http.StatusInternalServerError) |
|
default: |
|
// An error with the underlying write, such as the connection being |
|
// dropped. Ignore for now. |
|
} |
|
}
|
|
|