Skip to content

Commit a768dac

Browse files
committed
jwt: increase leeway and add some tests
also export a constant for the Cookie name Signed-off-by: Nicola Murino <[email protected]>
1 parent c4bc88c commit a768dac

File tree

6 files changed

+42
-9
lines changed

6 files changed

+42
-9
lines changed

internal/httpd/auth_utils.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,7 @@ const (
4949
)
5050

5151
const (
52-
basicRealm = "Basic realm=\"SFTPGo\""
53-
jwtCookieKey = "jwt"
52+
basicRealm = "Basic realm=\"SFTPGo\""
5453
)
5554

5655
var (
@@ -142,7 +141,7 @@ func createAndSetCookie(w http.ResponseWriter, r *http.Request, claims *jwt.Clai
142141

143142
func setCookie(w http.ResponseWriter, r *http.Request, cookiePath, cookieValue string, duration time.Duration) {
144143
http.SetCookie(w, &http.Cookie{
145-
Name: jwtCookieKey,
144+
Name: jwt.CookieKey,
146145
Value: cookieValue,
147146
Path: cookiePath,
148147
Expires: time.Now().Add(duration),
@@ -156,7 +155,7 @@ func setCookie(w http.ResponseWriter, r *http.Request, cookiePath, cookieValue s
156155
func removeCookie(w http.ResponseWriter, r *http.Request, cookiePath string) {
157156
invalidateToken(r)
158157
http.SetCookie(w, &http.Cookie{
159-
Name: jwtCookieKey,
158+
Name: jwt.CookieKey,
160159
Value: "",
161160
Path: cookiePath,
162161
Expires: time.Unix(0, 0),

internal/httpd/oidc.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -809,7 +809,7 @@ func removeOIDCCookie(w http.ResponseWriter, r *http.Request) {
809809
func canSkipOIDCValidation(r *http.Request) bool {
810810
_, err := r.Cookie(oidcCookieKey)
811811
if err != nil {
812-
_, err = r.Cookie(jwtCookieKey)
812+
_, err = r.Cookie(jwt.CookieKey)
813813
return err == nil
814814
}
815815
return false

internal/httpd/oidc_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -845,7 +845,7 @@ func TestSkipOIDCAuth(t *testing.T) {
845845
rr := httptest.NewRecorder()
846846
r, err := http.NewRequest(http.MethodGet, webClientLogoutPath, nil)
847847
assert.NoError(t, err)
848-
r.Header.Set("Cookie", fmt.Sprintf("%v=%v", jwtCookieKey, tokenString))
848+
r.Header.Set("Cookie", fmt.Sprintf("%v=%v", jwt.CookieKey, tokenString))
849849
server.router.ServeHTTP(rr, r)
850850
assert.Equal(t, http.StatusFound, rr.Code)
851851
assert.Equal(t, webClientLoginPath, rr.Header().Get("Location"))

internal/httpd/server.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1071,7 +1071,7 @@ func (s *httpdServer) refreshAdminToken(w http.ResponseWriter, r *http.Request,
10711071
func (s *httpdServer) updateContextFromCookie(r *http.Request) *http.Request {
10721072
_, err := jwt.FromContext(r.Context())
10731073
if err != nil {
1074-
_, err = r.Cookie(jwtCookieKey)
1074+
_, err = r.Cookie(jwt.CookieKey)
10751075
if err != nil {
10761076
return r
10771077
}

internal/jwt/jwt.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ import (
3030
"github.com/rs/xid"
3131
)
3232

33+
const (
34+
CookieKey = "jwt"
35+
)
36+
3337
var (
3438
TokenCtxKey = &contextKey{"Token"}
3539
ErrorCtxKey = &contextKey{"Error"}
@@ -235,7 +239,7 @@ func VerifyTokenWithKey(payload string, algo []jose.SignatureAlgorithm, key any)
235239
if err != nil {
236240
return nil, err
237241
}
238-
if err := claims.ValidateWithLeeway(jwt.Expected{Time: time.Now()}, 15*time.Second); err != nil {
242+
if err := claims.ValidateWithLeeway(jwt.Expected{Time: time.Now()}, 30*time.Second); err != nil {
239243
return nil, err
240244
}
241245
return &claims, nil
@@ -244,7 +248,7 @@ func VerifyTokenWithKey(payload string, algo []jose.SignatureAlgorithm, key any)
244248
// TokenFromCookie tries to retrieve the token string from a cookie named
245249
// "jwt".
246250
func TokenFromCookie(r *http.Request) string {
247-
cookie, err := r.Cookie("jwt")
251+
cookie, err := r.Cookie(CookieKey)
248252
if err != nil {
249253
return ""
250254
}

internal/jwt/jwt_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,3 +223,33 @@ func TestContext(t *testing.T) {
223223

224224
assert.Equal(t, "jwt context value Token", TokenCtxKey.String())
225225
}
226+
227+
func TestValidationLeeway(t *testing.T) {
228+
s, err := NewSigner(jose.HS256, util.GenerateRandomBytes(32))
229+
require.NoError(t, err)
230+
claims := &Claims{}
231+
claims.Audience = []string{util.GenerateUniqueID()}
232+
claims.SetIssuedAt(time.Now().Add(10 * time.Second)) // issued at in the future
233+
claims.SetExpiry(time.Now().Add(10 * time.Second))
234+
token, err := s.Sign(claims)
235+
require.NoError(t, err)
236+
_, err = VerifyToken(s, token)
237+
assert.NoError(t, err)
238+
239+
claims = &Claims{}
240+
claims.Audience = []string{util.GenerateUniqueID()}
241+
claims.SetExpiry(time.Now().Add(-10 * time.Second)) // expired
242+
token, err = s.Sign(claims)
243+
require.NoError(t, err)
244+
_, err = VerifyToken(s, token)
245+
assert.NoError(t, err)
246+
247+
claims = &Claims{}
248+
claims.Audience = []string{util.GenerateUniqueID()}
249+
claims.SetExpiry(time.Now().Add(30 * time.Second))
250+
claims.SetNotBefore(time.Now().Add(10 * time.Second)) // not before in the future
251+
token, err = s.Sign(claims)
252+
require.NoError(t, err)
253+
_, err = VerifyToken(s, token)
254+
assert.NoError(t, err)
255+
}

0 commit comments

Comments
 (0)