|
1 | 1 | package signature
|
2 | 2 |
|
3 | 3 | import (
|
| 4 | + "encoding/json" |
4 | 5 | "net/http"
|
5 | 6 | "net/http/httptest"
|
6 | 7 | "testing"
|
7 | 8 | "time"
|
8 | 9 |
|
| 10 | + "github.com/messagebird/go-rest-api/v7/internal/mbtest" |
9 | 11 | "github.com/stretchr/testify/assert"
|
10 | 12 | )
|
11 | 13 |
|
@@ -84,101 +86,36 @@ func TestValidate(t *testing.T) {
|
84 | 86 | }
|
85 | 87 |
|
86 | 88 | func TestValidSignature(t *testing.T) {
|
87 |
| - var cases = []struct { |
88 |
| - name string |
89 |
| - requestParams string |
90 |
| - requestPayload string |
91 |
| - receivedAt string |
92 |
| - signature string |
93 |
| - wantErr string |
94 |
| - }{ |
95 |
| - { |
96 |
| - name: "valid with no params/body", |
97 |
| - receivedAt: "2021-07-05T12:00:00+02:00", |
98 |
| - signature: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJNZXNzYWdlQmlyZCIsImlhdCI6MTYyNTQ3OTIwMCwiZXhwIjoxNjI1NDc5MjYwLCJqdGkiOiI1OWEyNDRkYy1lOWFkLTRlMjMtOTc3OC0zNzFmYWEyMzhmNzIiLCJ1cmxfaGFzaCI6IjBmMTE1ZGIwNjJiN2MwZGQwMzBiMTY4NzhjOTlkZWE1YzM1NGI0OWRjMzdiMzhlYjg4NDYxNzljNzc4M2U5ZDcifQ.SrhlKJ-ES4Dg8BBXKtop3u92Z_k4L4VjHKsyHWpweGE", |
99 |
| - }, |
100 |
| - { |
101 |
| - name: "valid with params and without body", |
102 |
| - requestParams: "/path?bar=1&foo=2", |
103 |
| - receivedAt: "2021-07-05T12:00:00+02:00", |
104 |
| - signature: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJNZXNzYWdlQmlyZCIsImlhdCI6MTYyNTQ3OTIwMCwiZXhwIjoxNjI1NDc5MjYwLCJqdGkiOiJjOTQ2YWY3Ny1lMTgyLTRlYWEtYjJmZi0xYTU0NWI1ZTk5MWEiLCJ1cmxfaGFzaCI6IjQxZjA1ZjBkZGQwYTIyYWIyMDlhYzQ2ZjQ3YzQ1NzJkOWNlZmEyNTdlZDc0YjI0MDA0YmFlNzUzZWNlNmMyNjAifQ.wUeGukU50HcPIr8d-zcCpttlGnPE-W57ujVb36AbAYw", |
105 |
| - }, |
106 |
| - { |
107 |
| - name: "valid with params and body", |
108 |
| - requestParams: "/path?bar=1&foo=2", |
109 |
| - requestPayload: "Hello, World!", |
110 |
| - receivedAt: "2021-07-05T12:00:00+02:00", |
111 |
| - signature: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJNZXNzYWdlQmlyZCIsImlhdCI6MTYyNTQ3OTIwMCwiZXhwIjoxNjI1NDc5MjYwLCJqdGkiOiI5M2U1NTAwNi1hMGU4LTQ1MjYtYTE5MC1mYTVmZjAwZWExMTYiLCJ1cmxfaGFzaCI6IjQxZjA1ZjBkZGQwYTIyYWIyMDlhYzQ2ZjQ3YzQ1NzJkOWNlZmEyNTdlZDc0YjI0MDA0YmFlNzUzZWNlNmMyNjAiLCJwYXlsb2FkX2hhc2giOiJkZmZkNjAyMWJiMmJkNWIwYWY2NzYyOTA4MDllYzNhNTMxOTFkZDgxYzdmNzBhNGIyODY4OGEzNjIxODI5ODZmIn0.K6HyLDRdYgQBKN2tBcu0dOSxsfb_lOLaWby3un4rxIc", |
112 |
| - }, |
113 |
| - { |
114 |
| - name: "invalid token received before it is issued", |
115 |
| - receivedAt: "2021-07-05T12:00:00+02:00", |
116 |
| - signature: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJNZXNzYWdlQmlyZCIsImlhdCI6MTYyNTQ4MjgwMCwiZXhwIjoxNjI1NDgyODYwLCJqdGkiOiJmOWY4YzM4Mi0yNDQ5LTQzMTEtYjcyYi0xZGY3MTY4NzkzMWUiLCJ1cmxfaGFzaCI6IjBmMTE1ZGIwNjJiN2MwZGQwMzBiMTY4NzhjOTlkZWE1YzM1NGI0OWRjMzdiMzhlYjg4NDYxNzljNzc4M2U5ZDcifQ._59NNTg0j5YVXCRHgyeJAj8n6rTg1gwTh_I_coe7RDQ", |
117 |
| - wantErr: "invalid jwt: iat is in the future", |
118 |
| - }, |
119 |
| - { |
120 |
| - name: "invalid token received after it is expired", |
121 |
| - receivedAt: "2021-07-05T12:00:00+02:00", |
122 |
| - signature: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJNZXNzYWdlQmlyZCIsImlhdCI6MTYyNTQ3NTYwMCwiZXhwIjoxNjI1NDc1NjYwLCJqdGkiOiI1ZjAyZjUyMi02MDMwLTQ2YzgtYjVhMy0wMTI0NjQ3OGQ4YmMiLCJ1cmxfaGFzaCI6IjBmMTE1ZGIwNjJiN2MwZGQwMzBiMTY4NzhjOTlkZWE1YzM1NGI0OWRjMzdiMzhlYjg4NDYxNzljNzc4M2U5ZDcifQ.iGUCLsYVQG4iYWe2MkRoLQBBMzq7p_bLy4u0mhC3Jfc", |
123 |
| - wantErr: "invalid jwt: exp is in the past", |
124 |
| - }, |
125 |
| - { |
126 |
| - name: "invalid token received on different URL", |
127 |
| - requestParams: "/path?bar=1&foo=2", |
128 |
| - receivedAt: "2021-07-05T12:00:00+02:00", |
129 |
| - signature: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJNZXNzYWdlQmlyZCIsImlhdCI6MTYyNTQ3OTIwMCwiZXhwIjoxNjI1NDc5MjYwLCJqdGkiOiJhNzVjOTA5Ni1lODIzLTQ0MmItODVmMi03ZDNjOWQ5YjcyNmIiLCJ1cmxfaGFzaCI6IjlmZGExZmNkYzc0YjEwMzUzNjhlNWY2NjhmNTdjOTFlOTk0MTJmZjU5Y2YwM2E0NmNlYjk1YWVhNWU2YjU4ZmQifQ.G4lpxrDOxZs75G1vIJ6J1jVbYS19tx2yq-lkIE-oETY", |
130 |
| - wantErr: "invalid jwt: url_hash is invalid", |
131 |
| - }, |
132 |
| - |
133 |
| - { |
134 |
| - name: "invalid payload not match", |
135 |
| - requestPayload: "Hello, World!", |
136 |
| - receivedAt: "2021-07-05T12:00:00+02:00", |
137 |
| - signature: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJNZXNzYWdlQmlyZCIsImlhdCI6MTYyNTQ3OTIwMCwiZXhwIjoxNjI1NDc5MjYwLCJqdGkiOiIxNDUwMTUzMi05NmYyLTQ2ODQtOTgzMi02OGYwOTUxYWUzNDIiLCJ1cmxfaGFzaCI6IjBmMTE1ZGIwNjJiN2MwZGQwMzBiMTY4NzhjOTlkZWE1YzM1NGI0OWRjMzdiMzhlYjg4NDYxNzljNzc4M2U5ZDciLCJwYXlsb2FkX2hhc2giOiIzMjRjYzA2N2IyNTdlZGEwYmNiZDljOGQ4MTgwNzdhMDlhOTU2OGMwZDRjYTA2MDM4ZGVkOGZhZGRmODEzZmQ2In0.rQqiANogDOMafgg_B6p362PuhInAro9lMm2j_vruBA0", |
138 |
| - wantErr: "invalid jwt: payload_hash is invalid", |
139 |
| - }, |
140 |
| - |
141 |
| - { |
142 |
| - name: "invalid signature key", |
143 |
| - receivedAt: "2021-07-05T12:00:00+02:00", |
144 |
| - signature: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJNZXNzYWdlQmlyZCIsImlhdCI6MTYyNTQ3OTIwMCwiZXhwIjoxNjI1NDc5MjYwLCJqdGkiOiIyNDNjMjdhZS0yZjAyLTQ2YTAtODg1Mi1jNjZmMzdlYTlmNDYiLCJ1cmxfaGFzaCI6IjBmMTE1ZGIwNjJiN2MwZGQwMzBiMTY4NzhjOTlkZWE1YzM1NGI0OWRjMzdiMzhlYjg4NDYxNzljNzc4M2U5ZDcifQ._Uwf4HMtfAT6jvbBbh85Q9TunX0QlsXoaLGKX0I4VDg", |
145 |
| - wantErr: "invalid jwt: signature is invalid", |
146 |
| - }, |
147 |
| - |
148 |
| - { |
149 |
| - name: "invalid missing payload", |
150 |
| - receivedAt: "2021-07-05T12:00:00+02:00", |
151 |
| - signature: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJNZXNzYWdlQmlyZCIsImlhdCI6MTYyNTQ3OTIwMCwiZXhwIjoxNjI1NDc5MjYwLCJqdGkiOiIxNDUwMTUzMi05NmYyLTQ2ODQtOTgzMi02OGYwOTUxYWUzNDIiLCJ1cmxfaGFzaCI6IjBmMTE1ZGIwNjJiN2MwZGQwMzBiMTY4NzhjOTlkZWE1YzM1NGI0OWRjMzdiMzhlYjg4NDYxNzljNzc4M2U5ZDciLCJwYXlsb2FkX2hhc2giOiIzMjRjYzA2N2IyNTdlZGEwYmNiZDljOGQ4MTgwNzdhMDlhOTU2OGMwZDRjYTA2MDM4ZGVkOGZhZGRmODEzZmQ2In0.rQqiANogDOMafgg_B6p362PuhInAro9lMm2j_vruBA0", |
152 |
| - wantErr: "invalid jwt: payload_hash was set; expected no payload value", |
153 |
| - }, |
154 |
| - |
155 |
| - { |
156 |
| - name: "invalid unexpected payload", |
157 |
| - requestPayload: "Hello, World!", |
158 |
| - receivedAt: "2021-07-05T12:00:00+02:00", |
159 |
| - signature: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJNZXNzYWdlQmlyZCIsImlhdCI6MTYyNTQ3OTIwMCwiZXhwIjoxNjI1NDc5MjYwLCJqdGkiOiI1OWEyNDRkYy1lOWFkLTRlMjMtOTc3OC0zNzFmYWEyMzhmNzIiLCJ1cmxfaGFzaCI6IjBmMTE1ZGIwNjJiN2MwZGQwMzBiMTY4NzhjOTlkZWE1YzM1NGI0OWRjMzdiMzhlYjg4NDYxNzljNzc4M2U5ZDcifQ.SrhlKJ-ES4Dg8BBXKtop3u92Z_k4L4VjHKsyHWpweGE", |
160 |
| - wantErr: "invalid jwt: payload_hash is invalid", |
161 |
| - }, |
| 89 | + testData := mbtest.Testdata(t, "reference.json") |
| 90 | + |
| 91 | + var tcs []struct { |
| 92 | + Name string `json:"name"` |
| 93 | + Method string `json:"method"` |
| 94 | + Secret string `json:"secret"` |
| 95 | + Url string `json:"url"` |
| 96 | + Payload string `json:"payload"` |
| 97 | + Timestamp string `json:"timestamp"` |
| 98 | + Token string `json:"token"` |
| 99 | + Outcome string `json:"outcome"` |
| 100 | + } |
| 101 | + if err := json.Unmarshal(testData, &tcs); err != nil { |
| 102 | + assert.NoError(t, err) |
162 | 103 | }
|
163 | 104 |
|
164 |
| - for _, test := range cases { |
165 |
| - t.Run(test.name, func(t *testing.T) { |
| 105 | + for _, tc := range tcs { |
| 106 | + t.Run(tc.Name, func(t *testing.T) { |
166 | 107 | TimeFunc = func() time.Time {
|
167 |
| - r, _ := time.Parse(time.RFC3339, test.receivedAt) |
| 108 | + r, _ := time.Parse(time.RFC3339, tc.Timestamp) |
168 | 109 | return r
|
169 | 110 | }
|
170 | 111 |
|
171 | 112 | v := NewValidator(testSecret)
|
172 |
| - reqUrl := testBaseUrl + test.requestParams |
173 |
| - if test.requestParams == "" { |
174 |
| - reqUrl += "/" |
175 |
| - } |
176 |
| - err := v.ValidSignature(test.signature, reqUrl, []byte(test.requestPayload)) |
177 |
| - if test.wantErr == "" { |
| 113 | + err := v.ValidSignature(tc.Token, tc.Url, []byte(tc.Payload)) |
| 114 | + if tc.Outcome == "valid" { |
178 | 115 | assert.NoError(t, err)
|
179 | 116 | return
|
180 | 117 | }
|
181 |
| - assert.EqualError(t, err, test.wantErr) |
| 118 | + assert.EqualError(t, err, tc.Outcome) |
182 | 119 | })
|
183 | 120 | }
|
184 | 121 | }
|
0 commit comments