Skip to content

Commit 5526738

Browse files
authored
add leeway (#45)
1 parent a7d9069 commit 5526738

File tree

3 files changed

+27
-42
lines changed

3 files changed

+27
-42
lines changed

auth.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ type Auth struct {
2222
keysMutex *sync.RWMutex
2323
keys map[string]*rsa.PublicKey
2424
keysExp time.Time
25+
26+
Leeway time.Duration
2527
}
2628

2729
const (
@@ -85,6 +87,15 @@ func (auth *Auth) VerifyIDToken(idToken string) (*Token, error) {
8587
if !ok || !token.Valid {
8688
return nil, &ErrTokenInvalid{"firebaseauth: invalid token"}
8789
}
90+
91+
now := time.Now().Unix()
92+
if !claims.verifyExpiresAt(now) {
93+
delta := time.Unix(now, 0).Sub(time.Unix(claims.ExpiresAt, 0))
94+
return nil, &ErrTokenInvalid{fmt.Sprintf("token is expired by %v", delta)}
95+
}
96+
if !claims.verifyIssuedAt(now + int64(auth.Leeway/time.Second)) {
97+
return nil, &ErrTokenInvalid{fmt.Sprintf("token used before issued")}
98+
}
8899
if !claims.verifyAudience(auth.app.projectID) {
89100
return nil, &ErrTokenInvalid{fmt.Sprintf("firebaseauth: Firebase ID token has incorrect \"aud\" (audience) claim. Expected \"%s\" but got \"%s\"", auth.app.projectID, claims.Audience)}
90101
}

token.go

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
package firebase
22

3-
import (
4-
"fmt"
5-
"time"
6-
)
7-
83
// Token is the firebase access token
94
type Token struct {
105
Issuer string `json:"iss"`
@@ -29,20 +24,7 @@ type Token struct {
2924
}
3025

3126
// Valid implements jwt-go Claims interface
32-
// for validates time based claims, such as IssuedAt, and ExpiresAt
33-
// But not verify token signature and header
3427
func (t *Token) Valid() error {
35-
now := time.Now().Unix()
36-
37-
if !t.verifyExpiresAt(now) {
38-
delta := time.Unix(now, 0).Sub(time.Unix(t.ExpiresAt, 0))
39-
return fmt.Errorf("token is expired by %v", delta)
40-
}
41-
42-
if !t.verifyIssuedAt(now) {
43-
return fmt.Errorf("token used before issued")
44-
}
45-
4628
return nil
4729
}
4830

token_test.go

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,41 @@
1-
package firebase_test
1+
package firebase
22

33
import (
44
"testing"
55
"time"
66

7-
"fmt"
8-
9-
firebase "github.com/acoshift/go-firebase-admin"
107
"github.com/stretchr/testify/assert"
118
)
129

1310
func TestValidToken(t *testing.T) {
1411
t.Run("Valid", func(t *testing.T) {
15-
now := time.Now()
16-
token := &firebase.Token{
17-
IssuedAt: now.Unix(),
18-
ExpiresAt: now.Unix(),
19-
}
12+
token := &Token{}
2013

2114
err := token.Valid()
22-
assert.Nil(t, err)
15+
assert.NoError(t, err)
2316
})
2417

25-
t.Run("usedbefore", func(t *testing.T) {
26-
now := time.Now().AddDate(1, 0, 0)
27-
now2 := time.Now()
28-
token := &firebase.Token{
29-
IssuedAt: now.Unix(),
30-
ExpiresAt: now2.Unix(),
18+
t.Run("verifyIssuedAt", func(t *testing.T) {
19+
now := time.Now()
20+
token := &Token{
21+
IssuedAt: now.Unix(),
3122
}
3223

33-
err := token.Valid()
34-
assert.NotNil(t, err)
35-
assert.Equal(t, fmt.Errorf("token used before issued"), err)
24+
res := token.verifyIssuedAt(now.Unix())
25+
assert.True(t, res)
26+
27+
res = token.verifyIssuedAt(now.Unix() + 60 /* leeway */)
28+
assert.True(t, res)
3629
})
3730

38-
t.Run("expired", func(t *testing.T) {
31+
t.Run("verifyExpiresAt", func(t *testing.T) {
3932
now := time.Now()
40-
token := &firebase.Token{
33+
token := &Token{
4134
IssuedAt: now.Unix(),
4235
ExpiresAt: 1500651130,
4336
}
4437

45-
err := token.Valid()
46-
assert.NotNil(t, err)
47-
assert.Equal(t, fmt.Errorf("token is expired by %v", time.Unix(now.Unix(), 0).Sub(time.Unix(token.ExpiresAt, 0))), err)
38+
res := token.verifyExpiresAt(now.Unix())
39+
assert.False(t, res)
4840
})
4941
}

0 commit comments

Comments
 (0)