diff options
Diffstat (limited to 'pkg/ext/auth.go')
| -rw-r--r-- | pkg/ext/auth.go | 45 | 
1 files changed, 45 insertions, 0 deletions
diff --git a/pkg/ext/auth.go b/pkg/ext/auth.go new file mode 100644 index 0000000..bb6c0a2 --- /dev/null +++ b/pkg/ext/auth.go @@ -0,0 +1,45 @@ +package ext + +import ( +	"context" +	"encoding/base64" +	"log/slog" +	"net/http" +) + +type authService interface { +	ValidateToken(token []byte) (bool, error) +} + +func Authenticate(auth authService) func(next http.HandlerFunc) http.HandlerFunc { +	return func(next http.HandlerFunc) http.HandlerFunc { +		return func(w http.ResponseWriter, r *http.Request) { +			cookie, err := r.Cookie("auth") +			if err != nil { +				slog.Error("Error loading cookie", "error", err) +				next(w, r) +				return +			} + +			value, err := base64.StdEncoding.DecodeString(cookie.Value) +			if err != nil { +				slog.Error("Error decoding", "error", err) +				next(w, r) +				return +			} + +			valid, err := auth.ValidateToken(value) +			if err != nil { +				slog.Error("Error validating token", "error", err, "cookie", cookie.Value) +				next(w, r) +				return +			} + +			ctx := r.Context() +			ctx = context.WithValue(ctx, "logged", true) + +			slog.Info("Validated token", "valid?", valid) +			next(w, r.WithContext(ctx)) +		} +	} +}  | 
