@@ -1,8 +1,11 @@
11package options
22
33import (
4+ "errors"
5+ "os"
46 "time"
57
8+ "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/logger"
69 "github.com/spf13/pflag"
710)
811
@@ -10,6 +13,7 @@ import (
1013type Cookie struct {
1114 Name string `flag:"cookie-name" cfg:"cookie_name"`
1215 Secret string `flag:"cookie-secret" cfg:"cookie_secret"`
16+ SecretFile string `flag:"cookie-secret-file" cfg:"cookie_secret_file"`
1317 Domains []string `flag:"cookie-domain" cfg:"cookie_domains"`
1418 Path string `flag:"cookie-path" cfg:"cookie_path"`
1519 Expire time.Duration `flag:"cookie-expire" cfg:"cookie_expire"`
@@ -18,8 +22,8 @@ type Cookie struct {
1822 HTTPOnly bool `flag:"cookie-httponly" cfg:"cookie_httponly"`
1923 SameSite string `flag:"cookie-samesite" cfg:"cookie_samesite"`
2024 CSRFPerRequest bool `flag:"cookie-csrf-per-request" cfg:"cookie_csrf_per_request"`
21− CSRFExpire time.Duration `flag:"cookie-csrf-expire" cfg:"cookie_csrf_expire"`
2225 CSRFPerRequestLimit int `flag:"cookie-csrf-per-request-limit" cfg:"cookie_csrf_per_request_limit"`
26+ CSRFExpire time.Duration `flag:"cookie-csrf-expire" cfg:"cookie_csrf_expire"`
2327}
2428
2529func cookieFlagSet() *pflag.FlagSet {
@@ -27,6 +31,7 @@ func cookieFlagSet() *pflag.FlagSet {
2731
2832 flagSet.String("cookie-name", "_oauth2_proxy", "the name of the cookie that the oauth_proxy creates")
2933 flagSet.String("cookie-secret", "", "the seed string for secure cookies (optionally base64 encoded)")
34+ flagSet.String("cookie-secret-file", "", "For defining a separate cookie secret file to read the encryption key from")
3035 flagSet.StringSlice("cookie-domain", []string{}, "Optional cookie domains to force cookies to (ie: `.yourcompany.com`). The longest domain matching the request's host will be used (or the shortest cookie domain if there is no match).")
3136 flagSet.String("cookie-path", "/", "an optional cookie path to force cookies to (ie: /poc/)*")
3237 flagSet.Duration("cookie-expire", time.Duration(168)*time.Hour, "expire timeframe for cookie")
@@ -43,16 +48,33 @@ func cookieFlagSet() *pflag.FlagSet {
4348// cookieDefaults creates a Cookie populating each field with its default value
4449func cookieDefaults() Cookie {
4550 return Cookie{
46− Name: "_oauth2_proxy",
47− Secret: "",
48− Domains: nil,
49− Path: "/",
50− Expire: time.Duration(168) * time.Hour,
51− Refresh: time.Duration(0),
52− Secure: true,
53− HTTPOnly: true,
54− SameSite: "",
55− CSRFPerRequest: false,
56− CSRFExpire: time.Duration(15) * time.Minute,
51+ Name: "_oauth2_proxy",
52+ Secret: "",
53+ SecretFile: "",
54+ Domains: nil,
55+ Path: "/",
56+ Expire: time.Duration(168) * time.Hour,
57+ Refresh: time.Duration(0),
58+ Secure: true,
59+ HTTPOnly: true,
60+ SameSite: "",
61+ CSRFPerRequest: false,
62+ CSRFPerRequestLimit: 0,
63+ CSRFExpire: time.Duration(15) * time.Minute,
64+ }
65+}
66+
67+// GetSecret returns the cookie secret, reading from file if SecretFile is set
68+func (c *Cookie) GetSecret() (secret string, err error) {
69+ if c.Secret != "" || c.SecretFile == "" {
70+ return c.Secret, nil
71+ }
72+
73+ fileSecret, err := os.ReadFile(c.SecretFile)
74+ if err != nil {
75+ logger.Errorf("error reading cookie secret file %s: %s", c.SecretFile, err)
76+ return "", errors.New("could not read cookie secret file")
5777 }
78+
79+ return string(fileSecret), nil
5880}