don't promote htpasswd auth; auth directly
This commit is contained in:
parent
c459806ab0
commit
4367e47a46
@ -150,7 +150,7 @@ func (p *OauthProxy) getUserInfo(token string) (string, error) {
|
||||
|
||||
func (p *OauthProxy) ClearCookie(rw http.ResponseWriter, req *http.Request) {
|
||||
domain := strings.Split(req.Host, ":")[0]
|
||||
if *cookieDomain != "" {
|
||||
if *cookieDomain != "" && strings.HasSuffix(domain, *cookieDomain) {
|
||||
domain = *cookieDomain
|
||||
}
|
||||
cookie := &http.Cookie{
|
||||
@ -167,7 +167,7 @@ func (p *OauthProxy) ClearCookie(rw http.ResponseWriter, req *http.Request) {
|
||||
func (p *OauthProxy) SetCookie(rw http.ResponseWriter, req *http.Request, val string) {
|
||||
|
||||
domain := strings.Split(req.Host, ":")[0] // strip the port (if any)
|
||||
if *cookieDomain != "" {
|
||||
if *cookieDomain != "" && strings.HasSuffix(domain, *cookieDomain) {
|
||||
domain = *cookieDomain
|
||||
}
|
||||
cookie := &http.Cookie{
|
||||
@ -182,7 +182,6 @@ func (p *OauthProxy) SetCookie(rw http.ResponseWriter, req *http.Request, val st
|
||||
http.SetCookie(rw, cookie)
|
||||
}
|
||||
|
||||
|
||||
func (p *OauthProxy) ErrorPage(rw http.ResponseWriter, code int, title string, message string) {
|
||||
log.Printf("ErrorPage %d %s %s", code, title, message)
|
||||
rw.WriteHeader(code)
|
||||
@ -202,14 +201,52 @@ func (p *OauthProxy) SignInPage(rw http.ResponseWriter, req *http.Request, code
|
||||
p.ClearCookie(rw, req)
|
||||
rw.WriteHeader(code)
|
||||
templates := getTemplates()
|
||||
t := struct{ SignInMessage string }{SignInMessage: p.SignInMessage}
|
||||
|
||||
t := struct{
|
||||
SignInMessage string
|
||||
Htpasswd bool
|
||||
}{
|
||||
SignInMessage: p.SignInMessage,
|
||||
Htpasswd: p.HtpasswdFile != nil,
|
||||
}
|
||||
templates.ExecuteTemplate(rw, "sign_in.html", t)
|
||||
}
|
||||
|
||||
func (p *OauthProxy) ManualSignIn(rw http.ResponseWriter, req *http.Request) (string, bool){
|
||||
if req.Method != "POST" || p.HtpasswdFile == nil{
|
||||
return "", false
|
||||
}
|
||||
user := req.FormValue("username")
|
||||
passwd := req.FormValue("password")
|
||||
if user == "" {
|
||||
return "", false
|
||||
}
|
||||
// check auth
|
||||
if p.HtpasswdFile.Validate(user, passwd) {
|
||||
log.Printf("authenticated %s via manual sign in", user)
|
||||
return user, true
|
||||
}
|
||||
return "", false
|
||||
}
|
||||
|
||||
func (p *OauthProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
|
||||
// check if this is a redirect back at the end of oauth
|
||||
remoteIP := req.Header.Get("X-Real-IP")
|
||||
if remoteIP == "" {
|
||||
remoteIP = req.RemoteAddr
|
||||
}
|
||||
log.Printf("%s %s %s", remoteIP, req.Method, req.URL.Path)
|
||||
|
||||
var ok bool
|
||||
var user string
|
||||
if req.URL.Path == signInPath {
|
||||
user, ok = p.ManualSignIn(rw, req)
|
||||
if ok {
|
||||
p.SetCookie(rw, req, user)
|
||||
http.Redirect(rw, req, "/", 302)
|
||||
} else {
|
||||
p.SignInPage(rw, req, 200)
|
||||
}
|
||||
return
|
||||
}
|
||||
if req.URL.Path == oauthStartPath {
|
||||
@ -260,20 +297,22 @@ func (p *OauthProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
|
||||
}
|
||||
}
|
||||
|
||||
if !ok {
|
||||
cookie, err := req.Cookie(p.CookieKey)
|
||||
var ok bool
|
||||
var email string
|
||||
var user string
|
||||
if err == nil {
|
||||
var email string
|
||||
email, ok = validateCookie(cookie, p.CookieSeed)
|
||||
user = strings.Split(email, "@")[0]
|
||||
}
|
||||
}
|
||||
|
||||
if !ok {
|
||||
user, ok = p.CheckBasicAuth(req)
|
||||
if ok {
|
||||
p.SetCookie(rw, req, user)
|
||||
}
|
||||
// if we want to promote basic auth requests to cookie'd requests, we could do that here
|
||||
// not sure that would be ideal in all circumstances though
|
||||
// if ok {
|
||||
// p.SetCookie(rw, req, user)
|
||||
// }
|
||||
}
|
||||
|
||||
if !ok {
|
||||
@ -308,6 +347,7 @@ func (p *OauthProxy) CheckBasicAuth(req *http.Request) (string, bool) {
|
||||
return "", false
|
||||
}
|
||||
if p.HtpasswdFile.Validate(pair[0], pair[1]) {
|
||||
log.Printf("authenticated %s via basic auth", pair[0])
|
||||
return pair[0], true
|
||||
}
|
||||
return "", false
|
||||
|
22
templates.go
22
templates.go
@ -7,20 +7,34 @@ import (
|
||||
|
||||
func getTemplates() *template.Template {
|
||||
t, err := template.New("foo").Parse(`{{define "sign_in.html"}}
|
||||
<html><head><title>Sign In</title></head>
|
||||
<body>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" charset="utf-8">
|
||||
<head><title>Sign In</title></head>
|
||||
<body>
|
||||
<form method="GET" action="/oauth2/start">
|
||||
<button type="submit">Sign In w/ Google</button>
|
||||
{{.SignInMessage}}
|
||||
</form>
|
||||
</body></html>
|
||||
{{ if .Htpasswd }}
|
||||
<fieldset>
|
||||
<form method="POST" action="/oauth2/sign_in">
|
||||
<label>Username: <input type="text" name="username" size="10"></label><br/>
|
||||
<label>Password: <input type="password" name="password" size="10"></label><br/>
|
||||
<button type="submit">Sign In</button>
|
||||
</form>
|
||||
</fieldset>
|
||||
{{ end }}
|
||||
</body>
|
||||
</html>
|
||||
{{end}}`)
|
||||
if err != nil {
|
||||
log.Fatalf("failed parsing template %s", err.Error())
|
||||
}
|
||||
|
||||
t, err = t.Parse(`{{define "error.html"}}
|
||||
<html><head><title>{{.Title}}</title></head>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" charset="utf-8">
|
||||
<head><title>{{.Title}}</title></head>
|
||||
<body>
|
||||
<h2>{{.Title}}</h2>
|
||||
<p>{{.Message}}</p>
|
||||
|
Loading…
Reference in New Issue
Block a user