@@ -17,6 +17,80 @@ import (
17
17
"github.com/google/go-cmp/cmp"
18
18
)
19
19
20
+ func TestVerifyTokenWithReplayProtection (t * testing.T ) {
21
+
22
+ projectID := "project_id"
23
+
24
+ ts , err := setupFakeJWKS ()
25
+ if err != nil {
26
+ t .Fatalf ("error setting up fake JWKS server: %v" , err )
27
+ }
28
+ defer ts .Close ()
29
+
30
+ privateKey , err := loadPrivateKey ()
31
+ if err != nil {
32
+ t .Fatalf ("error loading private key: %v" , err )
33
+ }
34
+
35
+ JWKSUrl = ts .URL
36
+ mockTime := time .Now ()
37
+
38
+ jwtToken := jwt .NewWithClaims (jwt .SigningMethodRS256 , jwt.RegisteredClaims {
39
+ Issuer : appCheckIssuer ,
40
+ Audience : jwt .ClaimStrings ([]string {"projects/" + projectID }),
41
+ Subject : "12345678:app:ID" ,
42
+ ExpiresAt : jwt .NewNumericDate (mockTime .Add (time .Hour )),
43
+ IssuedAt : jwt .NewNumericDate (mockTime ),
44
+ NotBefore : jwt .NewNumericDate (mockTime .Add (- 1 * time .Hour )),
45
+ })
46
+
47
+ // kid matches the key ID in testdata/mock.jwks.json,
48
+ // which is the public key matching to the private key
49
+ // in testdata/appcheck_pk.pem.
50
+ jwtToken .Header ["kid" ] = "FGQdnRlzAmKyKr6-Hg_kMQrBkj_H6i6ADnBQz4OI6BU"
51
+
52
+ token , err := jwtToken .SignedString (privateKey )
53
+
54
+ if err != nil {
55
+ t .Fatalf ("failed to sign token: %v" , err )
56
+ }
57
+
58
+ appCheckVerifyTestsTable := []struct {
59
+ label string
60
+ mockServerResponse string
61
+ expectedError error
62
+ }{
63
+ {label : "testWhenAlreadyConsumedResponseIsTrue" , mockServerResponse : `{"alreadyConsumed": true}` , expectedError : ErrTokenAlreadyConsumed },
64
+ {label : "testWhenAlreadyConsumedResponseIsFalse" , mockServerResponse : `{"alreadyConsumed": false}` , expectedError : nil },
65
+ }
66
+
67
+ for _ , tt := range appCheckVerifyTestsTable {
68
+
69
+ t .Run (tt .label , func (t * testing.T ) {
70
+ appCheckVerifyMockServer := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
71
+ w .Write ([]byte (tt .mockServerResponse ))
72
+ }))
73
+
74
+ client , err := NewClient (context .Background (), & internal.AppCheckConfig {
75
+ ProjectID : projectID ,
76
+ })
77
+
78
+ if err != nil {
79
+ t .Fatalf ("error creating new client: %v" , err )
80
+ }
81
+
82
+ client .verifyAppCheckTokenURL = appCheckVerifyMockServer .URL
83
+
84
+ _ , err = client .VerifyTokenWithReplayProtection (token )
85
+
86
+ if ! errors .Is (err , tt .expectedError ) {
87
+ t .Errorf ("failed to verify token; Expected: %v, but got: %v" , tt .expectedError , err )
88
+ }
89
+ })
90
+
91
+ }
92
+ }
93
+
20
94
func TestVerifyTokenHasValidClaims (t * testing.T ) {
21
95
ts , err := setupFakeJWKS ()
22
96
if err != nil {
0 commit comments