* api: allow API requests as managed outpost's account when using secret_key Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * root: load secret key from env Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * outposts: make listener IP configurable Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * outpost/proxy: run outpost in background and pass requests conditionally Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * outpost: unify branding to embedded Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * web/admin: fix embedded outpost not being editable Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * web: fix mismatched host detection Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * tests/e2e: fix LDAP test not including user for embedded outpost Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * tests/e2e: fix user matching Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * api: add tests for secret_key auth Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * root: load environment variables using github.com/Netflix/go-env Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
		
			
				
	
	
		
			70 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package proxy
 | 
						|
 | 
						|
import (
 | 
						|
	"net"
 | 
						|
	"net/http"
 | 
						|
	"strings"
 | 
						|
	"time"
 | 
						|
 | 
						|
	sessionsapi "github.com/oauth2-proxy/oauth2-proxy/pkg/apis/sessions"
 | 
						|
	"github.com/oauth2-proxy/oauth2-proxy/pkg/cookies"
 | 
						|
	"goauthentik.io/internal/utils/web"
 | 
						|
)
 | 
						|
 | 
						|
// MakeCSRFCookie creates a cookie for CSRF
 | 
						|
func (p *OAuthProxy) MakeCSRFCookie(req *http.Request, value string, expiration time.Duration, now time.Time) *http.Cookie {
 | 
						|
	return p.makeCookie(req, p.CSRFCookieName, value, expiration, now)
 | 
						|
}
 | 
						|
 | 
						|
func (p *OAuthProxy) makeCookie(req *http.Request, name string, value string, expiration time.Duration, now time.Time) *http.Cookie {
 | 
						|
	cookieDomain := cookies.GetCookieDomain(req, p.CookieDomains)
 | 
						|
 | 
						|
	if cookieDomain != "" {
 | 
						|
		domain := web.GetHost(req)
 | 
						|
		if h, _, err := net.SplitHostPort(domain); err == nil {
 | 
						|
			domain = h
 | 
						|
		}
 | 
						|
		if !strings.HasSuffix(domain, cookieDomain) {
 | 
						|
			p.logger.Errorf("Warning: request host is %q but using configured cookie domain of %q", domain, cookieDomain)
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return &http.Cookie{
 | 
						|
		Name:     name,
 | 
						|
		Value:    value,
 | 
						|
		Path:     p.CookiePath,
 | 
						|
		Domain:   cookieDomain,
 | 
						|
		HttpOnly: p.CookieHTTPOnly,
 | 
						|
		Secure:   p.CookieSecure,
 | 
						|
		Expires:  now.Add(expiration),
 | 
						|
		SameSite: cookies.ParseSameSite(p.CookieSameSite),
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// ClearCSRFCookie creates a cookie to unset the CSRF cookie stored in the user's
 | 
						|
// session
 | 
						|
func (p *OAuthProxy) ClearCSRFCookie(rw http.ResponseWriter, req *http.Request) {
 | 
						|
	http.SetCookie(rw, p.MakeCSRFCookie(req, "", time.Hour*-1, time.Now()))
 | 
						|
}
 | 
						|
 | 
						|
// SetCSRFCookie adds a CSRF cookie to the response
 | 
						|
func (p *OAuthProxy) SetCSRFCookie(rw http.ResponseWriter, req *http.Request, val string) {
 | 
						|
	http.SetCookie(rw, p.MakeCSRFCookie(req, val, p.CookieExpire, time.Now()))
 | 
						|
}
 | 
						|
 | 
						|
// ClearSessionCookie creates a cookie to unset the user's authentication cookie
 | 
						|
// stored in the user's session
 | 
						|
func (p *OAuthProxy) ClearSessionCookie(rw http.ResponseWriter, req *http.Request) error {
 | 
						|
	return p.sessionStore.Clear(rw, req)
 | 
						|
}
 | 
						|
 | 
						|
// LoadCookiedSession reads the user's authentication details from the request
 | 
						|
func (p *OAuthProxy) LoadCookiedSession(req *http.Request) (*sessionsapi.SessionState, error) {
 | 
						|
	return p.sessionStore.Load(req)
 | 
						|
}
 | 
						|
 | 
						|
// SaveSession creates a new session cookie value and sets this on the response
 | 
						|
func (p *OAuthProxy) SaveSession(rw http.ResponseWriter, req *http.Request, s *sessionsapi.SessionState) error {
 | 
						|
	return p.sessionStore.Save(rw, req, s)
 | 
						|
}
 |