Skip to content
This repository has been archived by the owner on Dec 7, 2020. It is now read-only.

Commit

Permalink
fix cookie expiration issue when exp claim is zero (#355)
Browse files Browse the repository at this point in the history
  • Loading branch information
livetocode authored and gambol99 committed May 11, 2018
1 parent 80b2dcb commit c7d76df
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 1 deletion.
5 changes: 4 additions & 1 deletion misc.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,10 @@ func (r *oauthProxy) getAccessCookieExpiration(token jose.JWT, refresh string) t
// refresh token
duration := r.config.AccessTokenDuration
if _, ident, err := parseToken(refresh); err == nil {
duration = time.Until(ident.ExpiresAt)
delta := time.Until(ident.ExpiresAt)
if delta > 0 {
duration = delta
}
}

return duration
Expand Down
60 changes: 60 additions & 0 deletions misc_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ package main
import (
"net/http"
"testing"
"time"

"github.com/stretchr/testify/assert"
)

func TestRedirectToAuthorizationUnauthorized(t *testing.T) {
Expand Down Expand Up @@ -47,3 +50,60 @@ func TestRedirectToAuthorizationSkipToken(t *testing.T) {
c.SkipTokenVerification = true
newFakeProxy(c).RunTests(t, requests)
}

func assertAlmostEquals(t *testing.T, expected time.Duration, actual time.Duration) {
delta := expected - actual
if delta < 0 {
delta = -delta
}
assert.True(t, delta < time.Duration(1)*time.Minute, "Diff should be less than a minute but delta is %s", delta)
}

func TestGetAccessCookieExpiration_NoExp(t *testing.T) {
token := newTestToken("foo").getToken()
refreshToken := token.Encode()
c := newFakeKeycloakConfig()
c.AccessTokenDuration = time.Duration(1) * time.Hour
proxy := newFakeProxy(c).proxy
duration := proxy.getAccessCookieExpiration(token, refreshToken)
assertAlmostEquals(t, c.AccessTokenDuration, duration)
}

func TestGetAccessCookieExpiration_ZeroExp(t *testing.T) {
ft := newTestToken("foo")
ft.setExpiration(time.Unix(0, 0))
token := ft.getToken()
refreshToken := token.Encode()
c := newFakeKeycloakConfig()
c.AccessTokenDuration = time.Duration(1) * time.Hour
proxy := newFakeProxy(c).proxy
duration := proxy.getAccessCookieExpiration(token, refreshToken)
assert.True(t, duration > 0, "duration should be positive")
assertAlmostEquals(t, c.AccessTokenDuration, duration)
}

func TestGetAccessCookieExpiration_PastExp(t *testing.T) {
ft := newTestToken("foo")
ft.setExpiration(time.Now().AddDate(-1, 0, 0))
token := ft.getToken()
refreshToken := token.Encode()
c := newFakeKeycloakConfig()
c.AccessTokenDuration = time.Duration(1) * time.Hour
proxy := newFakeProxy(c).proxy
duration := proxy.getAccessCookieExpiration(token, refreshToken)
assertAlmostEquals(t, c.AccessTokenDuration, duration)
}

func TestGetAccessCookieExpiration_ValidExp(t *testing.T) {
ft := newTestToken("foo")
token := ft.getToken()
refreshToken := token.Encode()
c := newFakeKeycloakConfig()
c.AccessTokenDuration = time.Duration(1) * time.Hour
proxy := newFakeProxy(c).proxy
duration := proxy.getAccessCookieExpiration(token, refreshToken)
val, ok, _ := ft.claims.TimeClaim("exp")
assert.True(t, ok)
expectedDuration := time.Until(val)
assertAlmostEquals(t, expectedDuration, duration)
}

0 comments on commit c7d76df

Please sign in to comment.