parent
7381450015
commit
eec62eb03a
@ -24,7 +24,7 @@ func main() {
|
|||||||
http.HandleFunc("/", server.RootHandler)
|
http.HandleFunc("/", server.RootHandler)
|
||||||
|
|
||||||
// Start
|
// Start
|
||||||
log.Debugf("Starting with options: %s", config)
|
log.WithField("config", config).Debug("Starting with config")
|
||||||
log.Info("Listening on :4181")
|
log.Info("Listening on :4181")
|
||||||
log.Info(http.ListenAndServe(":4181", nil))
|
log.Info(http.ListenAndServe(":4181", nil))
|
||||||
}
|
}
|
||||||
|
@ -64,7 +64,7 @@ func (s *Server) RootHandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
// AllowHandler Allows requests
|
// AllowHandler Allows requests
|
||||||
func (s *Server) AllowHandler(rule string) http.HandlerFunc {
|
func (s *Server) AllowHandler(rule string) http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
s.logger(r, rule, "Allowing request")
|
s.logger(r, "Allow", rule, "Allowing request")
|
||||||
w.WriteHeader(200)
|
w.WriteHeader(200)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -75,7 +75,7 @@ func (s *Server) AuthHandler(providerName, rule string) http.HandlerFunc {
|
|||||||
|
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
// Logging setup
|
// Logging setup
|
||||||
logger := s.logger(r, rule, "Authenticating request")
|
logger := s.logger(r, "Auth", rule, "Authenticating request")
|
||||||
|
|
||||||
// Get auth cookie
|
// Get auth cookie
|
||||||
c, err := r.Cookie(config.CookieName)
|
c, err := r.Cookie(config.CookieName)
|
||||||
@ -91,7 +91,7 @@ func (s *Server) AuthHandler(providerName, rule string) http.HandlerFunc {
|
|||||||
logger.Info("Cookie has expired")
|
logger.Info("Cookie has expired")
|
||||||
s.authRedirect(logger, w, r, p)
|
s.authRedirect(logger, w, r, p)
|
||||||
} else {
|
} else {
|
||||||
logger.Errorf("Invalid cookie: %v", err)
|
logger.WithField("error", err).Warn("Invalid cookie")
|
||||||
http.Error(w, "Not authorized", 401)
|
http.Error(w, "Not authorized", 401)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
@ -100,15 +100,13 @@ func (s *Server) AuthHandler(providerName, rule string) http.HandlerFunc {
|
|||||||
// Validate user
|
// Validate user
|
||||||
valid := ValidateEmail(email)
|
valid := ValidateEmail(email)
|
||||||
if !valid {
|
if !valid {
|
||||||
logger.WithFields(logrus.Fields{
|
logger.WithField("email", email).Warn("Invalid email")
|
||||||
"email": email,
|
|
||||||
}).Errorf("Invalid email")
|
|
||||||
http.Error(w, "Not authorized", 401)
|
http.Error(w, "Not authorized", 401)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Valid request
|
// Valid request
|
||||||
logger.Debugf("Allowing valid request ")
|
logger.Debug("Allowing valid request")
|
||||||
w.Header().Set("X-Forwarded-User", email)
|
w.Header().Set("X-Forwarded-User", email)
|
||||||
w.WriteHeader(200)
|
w.WriteHeader(200)
|
||||||
}
|
}
|
||||||
@ -118,12 +116,12 @@ func (s *Server) AuthHandler(providerName, rule string) http.HandlerFunc {
|
|||||||
func (s *Server) AuthCallbackHandler() http.HandlerFunc {
|
func (s *Server) AuthCallbackHandler() http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
// Logging setup
|
// Logging setup
|
||||||
logger := s.logger(r, "default", "Handling callback")
|
logger := s.logger(r, "AuthCallback", "default", "Handling callback")
|
||||||
|
|
||||||
// Check for CSRF cookie
|
// Check for CSRF cookie
|
||||||
c, err := r.Cookie(config.CSRFCookieName)
|
c, err := r.Cookie(config.CSRFCookieName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Warn("Missing csrf cookie")
|
logger.Info("Missing csrf cookie")
|
||||||
http.Error(w, "Not authorized", 401)
|
http.Error(w, "Not authorized", 401)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -131,7 +129,10 @@ func (s *Server) AuthCallbackHandler() http.HandlerFunc {
|
|||||||
// Validate state
|
// Validate state
|
||||||
valid, providerName, redirect, err := ValidateCSRFCookie(r, c)
|
valid, providerName, redirect, err := ValidateCSRFCookie(r, c)
|
||||||
if !valid {
|
if !valid {
|
||||||
logger.Warnf("Error validating csrf cookie: %v", err)
|
logger.WithFields(logrus.Fields{
|
||||||
|
"error": err,
|
||||||
|
"csrf_cookie": c,
|
||||||
|
}).Warn("Error validating csrf cookie")
|
||||||
http.Error(w, "Not authorized", 401)
|
http.Error(w, "Not authorized", 401)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -139,7 +140,11 @@ func (s *Server) AuthCallbackHandler() http.HandlerFunc {
|
|||||||
// Get provider
|
// Get provider
|
||||||
p, err := config.GetConfiguredProvider(providerName)
|
p, err := config.GetConfiguredProvider(providerName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Warnf("Invalid provider in csrf cookie: %s, %v", providerName, err)
|
logger.WithFields(logrus.Fields{
|
||||||
|
"error": err,
|
||||||
|
"csrf_cookie": c,
|
||||||
|
"provider": providerName,
|
||||||
|
}).Warn("Invalid provider in csrf cookie")
|
||||||
http.Error(w, "Not authorized", 401)
|
http.Error(w, "Not authorized", 401)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -150,7 +155,7 @@ func (s *Server) AuthCallbackHandler() http.HandlerFunc {
|
|||||||
// Exchange code for token
|
// Exchange code for token
|
||||||
token, err := p.ExchangeCode(redirectUri(r), r.URL.Query().Get("code"))
|
token, err := p.ExchangeCode(redirectUri(r), r.URL.Query().Get("code"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Errorf("Code exchange failed with: %v", err)
|
logger.WithField("error", err).Error("Code exchange failed with provider")
|
||||||
http.Error(w, "Service unavailable", 503)
|
http.Error(w, "Service unavailable", 503)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -158,15 +163,17 @@ func (s *Server) AuthCallbackHandler() http.HandlerFunc {
|
|||||||
// Get user
|
// Get user
|
||||||
user, err := p.GetUser(token)
|
user, err := p.GetUser(token)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Errorf("Error getting user: %s", err)
|
logger.WithField("error", err).Error("Error getting user")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate cookie
|
// Generate cookie
|
||||||
http.SetCookie(w, MakeCookie(r, user.Email))
|
http.SetCookie(w, MakeCookie(r, user.Email))
|
||||||
logger.WithFields(logrus.Fields{
|
logger.WithFields(logrus.Fields{
|
||||||
|
"provider": providerName,
|
||||||
|
"redirect": redirect,
|
||||||
"user": user.Email,
|
"user": user.Email,
|
||||||
}).Infof("Generated auth cookie")
|
}).Info("Successfully generated auth cookie, redirecting user.")
|
||||||
|
|
||||||
// Redirect
|
// Redirect
|
||||||
http.Redirect(w, r, redirect, http.StatusTemporaryRedirect)
|
http.Redirect(w, r, redirect, http.StatusTemporaryRedirect)
|
||||||
@ -177,33 +184,39 @@ func (s *Server) authRedirect(logger *logrus.Entry, w http.ResponseWriter, r *ht
|
|||||||
// Error indicates no cookie, generate nonce
|
// Error indicates no cookie, generate nonce
|
||||||
err, nonce := Nonce()
|
err, nonce := Nonce()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Errorf("Error generating nonce, %v", err)
|
logger.WithField("error", err).Error("Error generating nonce")
|
||||||
http.Error(w, "Service unavailable", 503)
|
http.Error(w, "Service unavailable", 503)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the CSRF cookie
|
// Set the CSRF cookie
|
||||||
http.SetCookie(w, MakeCSRFCookie(r, nonce))
|
csrf := MakeCSRFCookie(r, nonce)
|
||||||
logger.Debug("Set CSRF cookie and redirecting to google login")
|
http.SetCookie(w, csrf)
|
||||||
|
|
||||||
// Forward them on
|
// Forward them on
|
||||||
loginUrl := p.GetLoginURL(redirectUri(r), MakeState(r, p, nonce))
|
loginURL := p.GetLoginURL(redirectUri(r), MakeState(r, p, nonce))
|
||||||
http.Redirect(w, r, loginUrl, http.StatusTemporaryRedirect)
|
http.Redirect(w, r, loginURL, http.StatusTemporaryRedirect)
|
||||||
|
|
||||||
logger.Debug("Done")
|
logger.WithFields(logrus.Fields{
|
||||||
return
|
"csrf_cookie": csrf,
|
||||||
|
"login_url": loginURL,
|
||||||
|
}).Debug("Set CSRF cookie and redirected to provider login url")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) logger(r *http.Request, rule, msg string) *logrus.Entry {
|
func (s *Server) logger(r *http.Request, handler, rule, msg string) *logrus.Entry {
|
||||||
// Create logger
|
// Create logger
|
||||||
logger := log.WithFields(logrus.Fields{
|
logger := log.WithFields(logrus.Fields{
|
||||||
|
"handler": handler,
|
||||||
|
"rule": rule,
|
||||||
|
"method": r.Header.Get("X-Forwarded-Method"),
|
||||||
|
"host": r.Header.Get("X-Forwarded-Host"),
|
||||||
|
"uri": r.Header.Get("X-Forwarded-Uri"),
|
||||||
"source_ip": r.Header.Get("X-Forwarded-For"),
|
"source_ip": r.Header.Get("X-Forwarded-For"),
|
||||||
})
|
})
|
||||||
|
|
||||||
// Log request
|
// Log request
|
||||||
logger.WithFields(logrus.Fields{
|
logger.WithFields(logrus.Fields{
|
||||||
"rule": rule,
|
"cookies": r.Cookies(),
|
||||||
"headers": r.Header,
|
|
||||||
}).Debug(msg)
|
}).Debug(msg)
|
||||||
|
|
||||||
return logger
|
return logger
|
||||||
|
Loading…
x
Reference in New Issue
Block a user