Skip to content

Commit fe8d691

Browse files
paskalumputun
andauthored
fix: set cookies alongside header when SendJWTHeader is enabled (#262)
* fix: set cookies alongside header when SendJWTHeader is enabled When SendJWTHeader is true, now sets both the JWT header AND cookies. This fixes OAuth authentication flows where HTTP headers don't survive browser redirects. Cookies are needed for the OAuth callback to complete successfully, while headers are still set for direct API calls. Fixes umputun/remark42#1877 * test: add XSRF cookie value assertion in SendJWTHeader test verify XSRF-TOKEN cookie value matches claims ID for consistency with TestJWT_SetWithDomain --------- Co-authored-by: Umputun <umputun@gmail.com>
1 parent b18b2ea commit fe8d691

4 files changed

Lines changed: 16 additions & 4 deletions

File tree

token/jwt.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,8 @@ func (j *Service) Set(w http.ResponseWriter, claims Claims) (Claims, error) {
249249

250250
if j.SendJWTHeader {
251251
w.Header().Set(j.JWTHeaderKey, tokenString)
252-
return claims, nil
252+
// don't return here - fall through to also set cookies
253+
// cookies are needed for OAuth redirect flows where headers don't survive redirects
253254
}
254255

255256
cookieExpiration := 0 // session cookie

token/jwt_test.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,12 @@ func TestJWT_SendJWTHeader(t *testing.T) {
263263
assert.NoError(t, err)
264264
cookies := rr.Result().Cookies()
265265
t.Log(cookies)
266-
require.Equal(t, 0, len(cookies), "no cookies set")
266+
// cookies are set alongside header to support OAuth redirect flows
267+
require.Equal(t, 2, len(cookies), "cookies set alongside header")
268+
assert.Equal(t, "JWT", cookies[0].Name)
269+
assert.Equal(t, testJwtValid, cookies[0].Value)
270+
assert.Equal(t, "XSRF-TOKEN", cookies[1].Name)
271+
assert.Equal(t, "random id", cookies[1].Value)
267272
assert.Equal(t, testJwtValid, rr.Result().Header.Get("X-JWT"))
268273
}
269274

v2/token/jwt.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,8 @@ func (j *Service) Set(w http.ResponseWriter, claims Claims) (Claims, error) {
266266

267267
if j.SendJWTHeader {
268268
w.Header().Set(j.JWTHeaderKey, tokenString)
269-
return claims, nil
269+
// don't return here - fall through to also set cookies
270+
// cookies are needed for OAuth redirect flows where headers don't survive redirects
270271
}
271272

272273
cookieExpiration := 0 // session cookie

v2/token/jwt_test.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,12 @@ func TestJWT_SendJWTHeader(t *testing.T) {
263263
assert.NoError(t, err)
264264
cookies := rr.Result().Cookies()
265265
t.Log(cookies)
266-
require.Equal(t, 0, len(cookies), "no cookies set")
266+
// cookies are set alongside header to support OAuth redirect flows
267+
require.Equal(t, 2, len(cookies), "cookies set alongside header")
268+
assert.Equal(t, "JWT", cookies[0].Name)
269+
assert.Equal(t, testJwtValid, cookies[0].Value)
270+
assert.Equal(t, "XSRF-TOKEN", cookies[1].Name)
271+
assert.Equal(t, "random id", cookies[1].Value)
267272
assert.Equal(t, testJwtValid, rr.Result().Header.Get("X-JWT"))
268273
}
269274

0 commit comments

Comments
 (0)