cleanup error handling
This commit is contained in:
parent
4177e94a09
commit
42359333b2
@ -100,7 +100,6 @@ func apiRequest(req *http.Request) (*simplejson.Json, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (p *OauthProxy) redeemCode(code string) (string, error) {
|
func (p *OauthProxy) redeemCode(code string) (string, error) {
|
||||||
|
|
||||||
params := url.Values{}
|
params := url.Values{}
|
||||||
params.Add("redirect_uri", p.redirectUrl.String())
|
params.Add("redirect_uri", p.redirectUrl.String())
|
||||||
params.Add("client_id", p.clientID)
|
params.Add("client_id", p.clientID)
|
||||||
@ -125,6 +124,7 @@ func (p *OauthProxy) redeemCode(code string) (string, error) {
|
|||||||
}
|
}
|
||||||
return access_token, nil
|
return access_token, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *OauthProxy) getUserInfo(token string) (string, error) {
|
func (p *OauthProxy) getUserInfo(token string) (string, error) {
|
||||||
params := url.Values{}
|
params := url.Values{}
|
||||||
params.Add("access_token", token)
|
params.Add("access_token", token)
|
||||||
@ -164,29 +164,33 @@ func ClearCookie(rw http.ResponseWriter, req *http.Request, key string) {
|
|||||||
http.SetCookie(rw, cookie)
|
http.SetCookie(rw, cookie)
|
||||||
}
|
}
|
||||||
|
|
||||||
func ErrorPage(rw http.ResponseWriter, code int, title string, message string, signinmessage string) {
|
func (p *OauthProxy) ErrorPage(rw http.ResponseWriter, code int, title string, message string) {
|
||||||
log.Printf("ErrorPage %d %s %s %s", code, title, message, signinmessage)
|
log.Printf("ErrorPage %d %s %s", code, title, message)
|
||||||
rw.WriteHeader(code)
|
rw.WriteHeader(code)
|
||||||
t := getTemplates()
|
templates := getTemplates()
|
||||||
p := struct {
|
t := struct {
|
||||||
Title string
|
Title string
|
||||||
Message string
|
Message string
|
||||||
SignInMessage string
|
|
||||||
}{
|
}{
|
||||||
Title: fmt.Sprintf("%d %s", code, title),
|
Title: fmt.Sprintf("%d %s", code, title),
|
||||||
Message: message,
|
Message: message,
|
||||||
SignInMessage: signinmessage,
|
|
||||||
}
|
}
|
||||||
t.ExecuteTemplate(rw, "error.html", p)
|
templates.ExecuteTemplate(rw, "error.html", t)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *OauthProxy) SignInPage(rw http.ResponseWriter, req *http.Request, code int) {
|
||||||
|
// TODO: capture state for which url to redirect to at the end
|
||||||
|
rw.WriteHeader(code)
|
||||||
|
templates := getTemplates()
|
||||||
|
t := struct{ SignInMessage string }{SignInMessage: p.SignInMessage}
|
||||||
|
templates.ExecuteTemplate(rw, "sign_in.html", t)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *OauthProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
|
func (p *OauthProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
|
||||||
// check if this is a redirect back at the end of oauth
|
// check if this is a redirect back at the end of oauth
|
||||||
if req.URL.Path == signInPath {
|
if req.URL.Path == signInPath {
|
||||||
ClearCookie(rw, req, p.CookieKey)
|
ClearCookie(rw, req, p.CookieKey)
|
||||||
t := getTemplates()
|
p.SignInPage(rw, req, 200)
|
||||||
p := struct{ SignInMessage string }{SignInMessage: p.SignInMessage}
|
|
||||||
t.ExecuteTemplate(rw, "sign_in.html", p)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if req.URL.Path == oauthStartPath {
|
if req.URL.Path == oauthStartPath {
|
||||||
@ -197,31 +201,31 @@ func (p *OauthProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
|
|||||||
// finish the oauth cycle
|
// finish the oauth cycle
|
||||||
reqParams, err := url.ParseQuery(req.URL.RawQuery)
|
reqParams, err := url.ParseQuery(req.URL.RawQuery)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ErrorPage(rw, 500, "Internal Error", err.Error(), p.SignInMessage)
|
p.ErrorPage(rw, 500, "Internal Error", err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
errorString, ok := reqParams["error"]
|
errorString, ok := reqParams["error"]
|
||||||
if ok && len(errorString) == 1 {
|
if ok && len(errorString) == 1 {
|
||||||
ErrorPage(rw, 403, "Permission Denied", errorString[0], p.SignInMessage)
|
p.ErrorPage(rw, 403, "Permission Denied", errorString[0])
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
code, ok := reqParams["code"]
|
code, ok := reqParams["code"]
|
||||||
if !ok || len(code) != 1 {
|
if !ok || len(code) != 1 {
|
||||||
ErrorPage(rw, 500, "Internal Error", "Invalid API response", p.SignInMessage)
|
p.ErrorPage(rw, 500, "Internal Error", "Invalid API response")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
token, err := p.redeemCode(code[0])
|
token, err := p.redeemCode(code[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("error redeeming code %s", err.Error())
|
log.Printf("error redeeming code %s", err.Error())
|
||||||
ErrorPage(rw, 500, "Internal Error", err.Error(), p.SignInMessage)
|
p.ErrorPage(rw, 500, "Internal Error", err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// validate user
|
// validate user
|
||||||
email, err := p.getUserInfo(token)
|
email, err := p.getUserInfo(token)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("error redeeming code %s", err.Error())
|
log.Printf("error redeeming code %s", err.Error())
|
||||||
ErrorPage(rw, 500, "Internal Error", err.Error(), p.SignInMessage)
|
p.ErrorPage(rw, 500, "Internal Error", err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -246,10 +250,11 @@ func (p *OauthProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
|
|||||||
http.Redirect(rw, req, "/", 302)
|
http.Redirect(rw, req, "/", 302)
|
||||||
return
|
return
|
||||||
} else {
|
} else {
|
||||||
ErrorPage(rw, 403, "Permission Denied", "Invalid Account", p.SignInMessage)
|
p.ErrorPage(rw, 403, "Permission Denied", "Invalid Account")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cookie, err := req.Cookie(p.CookieKey)
|
cookie, err := req.Cookie(p.CookieKey)
|
||||||
var ok bool
|
var ok bool
|
||||||
var email string
|
var email string
|
||||||
@ -264,9 +269,8 @@ func (p *OauthProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
log.Printf("invalid cookie. redirecting to sign in")
|
log.Printf("invalid cookie")
|
||||||
// TODO: capture state for which url to redirect to at the end
|
p.SignInPage(rw, req, 403)
|
||||||
http.Redirect(rw, req, "/oauth2/sign_in", 302)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,16 +18,14 @@ func getTemplates() *template.Template {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("failed parsing template %s", err.Error())
|
log.Fatalf("failed parsing template %s", err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
t, err = t.Parse(`{{define "error.html"}}
|
t, err = t.Parse(`{{define "error.html"}}
|
||||||
<html><head><title>{{.Title}}</title></head>
|
<html><head><title>{{.Title}}</title></head>
|
||||||
<body>
|
<body>
|
||||||
<h2>{{.Title}}</h2>
|
<h2>{{.Title}}</h2>
|
||||||
<p>{{.Message}}</p>
|
<p>{{.Message}}</p>
|
||||||
<hr>
|
<hr>
|
||||||
<form method="GET" action="/oauth2/start">
|
<p><a href="/oauth2/sign_in">Sign In</a></p>
|
||||||
<button type="submit">Sign In w/ Google</button>
|
|
||||||
{{.SignInMessage}}
|
|
||||||
</form>
|
|
||||||
</body>
|
</body>
|
||||||
</html>{{end}}`)
|
</html>{{end}}`)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user