Skip to content

Commit aa7b7e2

Browse files
committed
Manipulate cookies via CookieManager
2 parents a94681f + fcae3ca commit aa7b7e2

29 files changed

+999
-940
lines changed

pkg/admin/wire_gen.go

Lines changed: 10 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/auth/deps.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ var DependencySet = wire.NewSet(
4646
wire.Bind(new(interaction.NonceService), new(*nonce.Service)),
4747

4848
wire.Bind(new(webapp.GraphService), new(*interaction.Service)),
49-
wire.Bind(new(webapp.CookieFactory), new(*httputil.CookieFactory)),
49+
wire.Bind(new(webapp.CookieManager), new(*httputil.CookieManager)),
50+
wire.Bind(new(handlerwebapp.CookieManager), new(*httputil.CookieManager)),
5051

5152
wire.NewSet(
5253
wire.Struct(new(MainOriginProvider), "*"),

pkg/auth/handler/webapp/cookie.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package webapp
2+
3+
import (
4+
"net/http"
5+
6+
"github.com/authgear/authgear-server/pkg/util/httputil"
7+
)
8+
9+
type CookieManager interface {
10+
GetCookie(r *http.Request, def *httputil.CookieDef) (*http.Cookie, error)
11+
ValueCookie(def *httputil.CookieDef, value string) *http.Cookie
12+
ClearCookie(def *httputil.CookieDef) *http.Cookie
13+
}

pkg/auth/handler/webapp/select_account.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ type SelectAccountHandler struct {
4747
SignedUpCookie webapp.SignedUpCookieDef
4848
Users SelectAccountUserService
4949
Identities SelectAccountIdentityService
50+
Cookies CookieManager
5051
}
5152

5253
func (h *SelectAccountHandler) GetData(r *http.Request, rw http.ResponseWriter, userID string) (map[string]interface{}, error) {
@@ -92,7 +93,7 @@ func (h *SelectAccountHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)
9293
return nil
9394
}
9495
gotoSignupOrLogin := func() {
95-
signedUpCookie, err := r.Cookie(h.SignedUpCookie.Def.Name)
96+
signedUpCookie, err := h.Cookies.GetCookie(r, h.SignedUpCookie.Def)
9697
signedUp := (err == nil && signedUpCookie.Value == "true")
9798
path := GetAuthenticationEndpoint(signedUp, h.AuthenticationConfig.PublicSignupDisabled)
9899
http.Redirect(w, r, path, http.StatusFound)

pkg/auth/webapp/client_id.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ type ClientIDMiddleware struct {
1111
States SessionMiddlewareStore
1212
SessionCookieDef SessionCookieDef
1313
ClientIDCookieDef ClientIDCookieDef
14-
CookieFactory CookieFactory
14+
Cookies CookieManager
1515
}
1616

1717
func (m *ClientIDMiddleware) Handle(next http.Handler) http.Handler {
@@ -21,7 +21,7 @@ func (m *ClientIDMiddleware) Handle(next http.Handler) http.Handler {
2121
// Persist client_id into cookie.
2222
// So that client_id no longer need to be present on the query.
2323
if ok {
24-
cookie := m.CookieFactory.ValueCookie(m.ClientIDCookieDef.Def, clientID)
24+
cookie := m.Cookies.ValueCookie(m.ClientIDCookieDef.Def, clientID)
2525
httputil.UpdateCookie(w, cookie)
2626
}
2727

@@ -47,15 +47,15 @@ func (m *ClientIDMiddleware) ReadClientID(r *http.Request) (clientID string, ok
4747
return
4848
}
4949

50-
if cookie, err := r.Cookie(m.SessionCookieDef.Def.Name); err == nil {
50+
if cookie, err := m.Cookies.GetCookie(r, m.SessionCookieDef.Def); err == nil {
5151
if s, err := m.States.Get(cookie.Value); err == nil && s.ClientID != "" {
5252
clientID = s.ClientID
5353
ok = true
5454
return
5555
}
5656
}
5757

58-
if cookie, err := r.Cookie(m.ClientIDCookieDef.Def.Name); err == nil {
58+
if cookie, err := m.Cookies.GetCookie(r, m.ClientIDCookieDef.Def); err == nil {
5959
clientID = cookie.Value
6060
ok = true
6161
return

pkg/auth/webapp/cookie.go

Lines changed: 17 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ import (
66
"net/http"
77

88
"github.com/authgear/authgear-server/pkg/api/apierrors"
9-
"github.com/authgear/authgear-server/pkg/lib/config"
109
"github.com/authgear/authgear-server/pkg/util/duration"
1110
"github.com/authgear/authgear-server/pkg/util/httputil"
1211
)
1312

14-
type CookieFactory interface {
13+
type CookieManager interface {
14+
GetCookie(r *http.Request, def *httputil.CookieDef) (*http.Cookie, error)
1515
ValueCookie(def *httputil.CookieDef, value string) *http.Cookie
1616
ClearCookie(def *httputil.CookieDef) *http.Cookie
1717
}
@@ -20,86 +20,68 @@ type SessionCookieDef struct {
2020
Def *httputil.CookieDef
2121
}
2222

23-
func NewSessionCookieDef(httpCfg *config.HTTPConfig) SessionCookieDef {
23+
func NewSessionCookieDef() SessionCookieDef {
2424
def := &httputil.CookieDef{
25-
Name: httpCfg.CookiePrefix + "web_session",
25+
NameSuffix: "web_session",
2626
Path: "/",
2727
AllowScriptAccess: false,
2828
SameSite: http.SameSiteNoneMode, // For resumption after redirecting from OAuth providers
2929
MaxAge: nil, // Use HTTP session cookie; expires when browser closes
3030
}
31-
32-
if httpCfg.CookieDomain != nil {
33-
def.Domain = *httpCfg.CookieDomain
34-
}
35-
3631
return SessionCookieDef{Def: def}
3732
}
3833

3934
type ErrorCookieDef struct {
4035
Def *httputil.CookieDef
4136
}
4237

43-
func NewErrorCookieDef(httpCfg *config.HTTPConfig) ErrorCookieDef {
38+
func NewErrorCookieDef() ErrorCookieDef {
4439
def := &httputil.CookieDef{
45-
Name: httpCfg.CookiePrefix + "web_err",
40+
NameSuffix: "web_err",
4641
Path: "/",
4742
AllowScriptAccess: false,
4843
SameSite: http.SameSiteLaxMode,
4944
MaxAge: nil, // Use HTTP session cookie; expires when browser closes
5045
}
51-
52-
if httpCfg.CookieDomain != nil {
53-
def.Domain = *httpCfg.CookieDomain
54-
}
55-
5646
return ErrorCookieDef{Def: def}
5747
}
5848

5949
type SignedUpCookieDef struct {
6050
Def *httputil.CookieDef
6151
}
6252

63-
func NewSignedUpCookieDef(httpCfg *config.HTTPConfig) SignedUpCookieDef {
53+
func NewSignedUpCookieDef() SignedUpCookieDef {
6454
long := int(duration.Long.Seconds())
6555
def := &httputil.CookieDef{
66-
Name: httpCfg.CookiePrefix + "signed_up",
56+
NameSuffix: "signed_up",
6757
Path: "/",
6858
AllowScriptAccess: false,
6959
SameSite: http.SameSiteLaxMode,
7060
MaxAge: &long,
7161
}
72-
73-
if httpCfg.CookieDomain != nil {
74-
def.Domain = *httpCfg.CookieDomain
75-
}
76-
7762
return SignedUpCookieDef{Def: def}
7863
}
7964

8065
type ErrorCookie struct {
81-
Cookie ErrorCookieDef
82-
CookieFactory CookieFactory
66+
Cookie ErrorCookieDef
67+
Cookies CookieManager
8368
}
8469

8570
type ClientIDCookieDef struct {
8671
Def *httputil.CookieDef
8772
}
8873

89-
func NewClientIDCookieDef(httpCfg *config.HTTPConfig) ClientIDCookieDef {
74+
func NewClientIDCookieDef() ClientIDCookieDef {
9075
def := &httputil.CookieDef{
91-
Name: "client_id",
92-
Path: "/",
93-
SameSite: http.SameSiteNoneMode,
94-
}
95-
if httpCfg.CookieDomain != nil {
96-
def.Domain = *httpCfg.CookieDomain
76+
NameSuffix: "client_id",
77+
Path: "/",
78+
SameSite: http.SameSiteNoneMode,
9779
}
9880
return ClientIDCookieDef{Def: def}
9981
}
10082

10183
func (c *ErrorCookie) GetError(r *http.Request) (*apierrors.APIError, bool) {
102-
cookie, err := r.Cookie(c.Cookie.Def.Name)
84+
cookie, err := c.Cookies.GetCookie(r, c.Cookie.Def)
10385
if err != nil || cookie.Value == "" {
10486
return nil, false
10587
}
@@ -117,7 +99,7 @@ func (c *ErrorCookie) GetError(r *http.Request) (*apierrors.APIError, bool) {
11799
}
118100

119101
func (c *ErrorCookie) ResetError() *http.Cookie {
120-
cookie := c.CookieFactory.ClearCookie(c.Cookie.Def)
102+
cookie := c.Cookies.ClearCookie(c.Cookie.Def)
121103
return cookie
122104
}
123105

@@ -128,6 +110,6 @@ func (c *ErrorCookie) SetError(value *apierrors.APIError) (*http.Cookie, error)
128110
}
129111

130112
cookieValue := base64.RawURLEncoding.EncodeToString(data)
131-
cookie := c.CookieFactory.ValueCookie(c.Cookie.Def, cookieValue)
113+
cookie := c.Cookies.ValueCookie(c.Cookie.Def, cookieValue)
132114
return cookie, nil
133115
}

pkg/auth/webapp/login_hint.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,14 @@ type LoginHintPageService interface {
2929
PostWithIntent(session *Session, intent interaction.Intent, inputFn func() (interface{}, error)) (*Result, error)
3030
}
3131

32-
type LoginHintCookieFactory interface {
33-
ValueCookie(def *httputil.CookieDef, value string) *http.Cookie
34-
}
35-
3632
type LoginHintHandler struct {
3733
Config *config.OAuthConfig
3834
Anonymous AnonymousIdentityProvider
3935
OfflineGrants oauth.OfflineGrantStore
4036
AppSessionTokens oauth.AppSessionTokenStore
4137
AppSessions oauth.AppSessionStore
4238
Clock clock.Clock
43-
CookieFactory CookieFactory
39+
Cookies CookieManager
4440
SessionCookie session.CookieDef
4541
Pages LoginHintPageService
4642
}
@@ -104,7 +100,7 @@ func (r *LoginHintHandler) HandleLoginHint(options HandleLoginHintOptions) (http
104100
return nil, nil
105101
}
106102

107-
cookie := r.CookieFactory.ValueCookie(r.SessionCookie.Def, token)
103+
cookie := r.Cookies.ValueCookie(r.SessionCookie.Def, token)
108104
return &Result{
109105
Cookies: []*http.Cookie{cookie},
110106
RedirectURI: options.OriginalRedirectURI,

pkg/auth/webapp/service2.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ type Service2 struct {
4848
SignedUpCookie SignedUpCookieDef
4949
MFADeviceTokenCookie mfa.CookieDef
5050
ErrorCookie *ErrorCookie
51-
CookieFactory CookieFactory
51+
Cookies CookieManager
5252

5353
Graph GraphService
5454
}
@@ -59,7 +59,7 @@ func (s *Service2) CreateSession(session *Session, redirectURI string) (*Result,
5959
}
6060
result := &Result{
6161
RedirectURI: redirectURI,
62-
Cookies: []*http.Cookie{s.CookieFactory.ValueCookie(s.SessionCookie.Def, session.ID)},
62+
Cookies: []*http.Cookie{s.Cookies.ValueCookie(s.SessionCookie.Def, session.ID)},
6363
}
6464
return result, nil
6565
}
@@ -164,7 +164,7 @@ func (s *Service2) doPost(
164164
switch kind {
165165
case SessionStepAuthenticate:
166166
authDeviceToken := ""
167-
if deviceTokenCookie, err := s.Request.Cookie(s.MFADeviceTokenCookie.Def.Name); err == nil {
167+
if deviceTokenCookie, err := s.Cookies.GetCookie(s.Request, s.MFADeviceTokenCookie.Def); err == nil {
168168
for _, edge := range edges {
169169
if _, ok := edge.(*nodes.EdgeUseDeviceToken); ok {
170170
authDeviceToken = deviceTokenCookie.Value
@@ -354,7 +354,7 @@ func (s *Service2) afterPost(
354354
// Marked signed up in cookie after authorization.
355355
// When user visit auth ui root "/", redirect user to "/login" if
356356
// cookie exists
357-
result.Cookies = append(result.Cookies, s.CookieFactory.ValueCookie(s.SignedUpCookie.Def, "true"))
357+
result.Cookies = append(result.Cookies, s.Cookies.ValueCookie(s.SignedUpCookie.Def, "true"))
358358
default:
359359
// Use the default navigation action for any other intents.
360360
// That is, "advance" will be used.
@@ -393,13 +393,13 @@ func (s *Service2) afterPost(
393393
if err != nil {
394394
return err
395395
}
396-
result.Cookies = append(result.Cookies, s.CookieFactory.ClearCookie(s.SessionCookie.Def))
396+
result.Cookies = append(result.Cookies, s.Cookies.ClearCookie(s.SessionCookie.Def))
397397
} else if isNewGraph {
398398
err := s.Sessions.Create(session)
399399
if err != nil {
400400
return err
401401
}
402-
result.Cookies = append(result.Cookies, s.CookieFactory.ValueCookie(s.SessionCookie.Def, session.ID))
402+
result.Cookies = append(result.Cookies, s.Cookies.ValueCookie(s.SessionCookie.Def, session.ID))
403403
} else if interactionErr == nil {
404404
err := s.Sessions.Update(session)
405405
if err != nil {

pkg/auth/webapp/session_middleware.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ type SessionMiddlewareStore interface {
1212
}
1313

1414
type SessionMiddleware struct {
15-
States SessionMiddlewareStore
16-
Cookie SessionCookieDef
17-
CookieFactory CookieFactory
15+
States SessionMiddlewareStore
16+
CookieDef SessionCookieDef
17+
Cookies CookieManager
1818
}
1919

2020
func (m *SessionMiddleware) Handle(next http.Handler) http.Handler {
@@ -26,7 +26,7 @@ func (m *SessionMiddleware) Handle(next http.Handler) http.Handler {
2626
return
2727
} else if errors.Is(err, ErrInvalidSession) {
2828
// Clear the session before continuing
29-
cookie := m.CookieFactory.ClearCookie(m.Cookie.Def)
29+
cookie := m.Cookies.ClearCookie(m.CookieDef.Def)
3030
httputil.UpdateCookie(w, cookie)
3131
next.ServeHTTP(w, r)
3232
return
@@ -41,7 +41,7 @@ func (m *SessionMiddleware) Handle(next http.Handler) http.Handler {
4141
}
4242

4343
func (m *SessionMiddleware) loadSession(r *http.Request) (*Session, error) {
44-
cookie, err := r.Cookie(m.Cookie.Def.Name)
44+
cookie, err := m.Cookies.GetCookie(r, m.CookieDef.Def)
4545
if err != nil {
4646
return nil, ErrSessionNotFound
4747
}

0 commit comments

Comments
 (0)