github.com/brycereitano/goa@v0.0.0-20170315073847-8ffa6c85e265/middleware/security/jwt/jwt_test.go (about) 1 package jwt_test 2 3 import ( 4 "crypto/ecdsa" 5 "crypto/rsa" 6 "fmt" 7 "net/http" 8 "net/http/httptest" 9 10 jwtpkg "github.com/dgrijalva/jwt-go" 11 "github.com/goadesign/goa" 12 "github.com/goadesign/goa/middleware/security/jwt" 13 . "github.com/onsi/ginkgo" 14 . "github.com/onsi/gomega" 15 "golang.org/x/net/context" 16 ) 17 18 var _ = Describe("Middleware", func() { 19 var securityScheme *goa.JWTSecurity 20 var respRecord *httptest.ResponseRecorder 21 var request *http.Request 22 var handler goa.Handler 23 var middleware goa.Middleware 24 var dispatchResult error 25 var fetchedToken *jwtpkg.Token 26 27 BeforeEach(func() { 28 respRecord = httptest.NewRecorder() 29 request, _ = http.NewRequest("GET", "http://example.com/", nil) 30 handler = func(ctx context.Context, w http.ResponseWriter, r *http.Request) error { 31 fetchedToken = jwt.ContextJWT(ctx) 32 return nil 33 } 34 }) 35 36 Context("given configuration errors", func() { 37 var keyResolver jwt.KeyResolver 38 39 BeforeEach(func() { 40 var err error 41 keyResolver, err = jwt.NewResolver(nil, "keyname") 42 Ω(err).ShouldNot(HaveOccurred()) 43 }) 44 45 It("should validate the token location", func() { 46 badScheme := &goa.JWTSecurity{ 47 In: "your mind", 48 Name: "Authorization", 49 } 50 middleware = jwt.New(keyResolver, nil, badScheme) 51 dispatchResult = middleware(handler)(context.Background(), respRecord, request) 52 Ω(dispatchResult).Should(HaveOccurred()) 53 }) 54 55 It("should validate the header name", func() { 56 badScheme := &goa.JWTSecurity{ 57 In: goa.LocHeader, 58 Name: "Accept-Candy-From-Strangers", 59 } 60 middleware = jwt.New(keyResolver, nil, badScheme) 61 dispatchResult = middleware(handler)(context.Background(), respRecord, request) 62 Ω(dispatchResult).Should(HaveOccurred()) 63 }) 64 }) 65 66 It("should call the scheme's validation func", func() { 67 securityScheme = &goa.JWTSecurity{ 68 In: goa.LocHeader, 69 Name: "Authorization", 70 } 71 72 goAway := func(h goa.Handler) goa.Handler { 73 return func(ctx context.Context, rw http.ResponseWriter, req *http.Request) error { 74 return fmt.Errorf("go away") 75 } 76 } 77 78 keyResolver, _ := jwt.NewResolver(nil, "keyname") 79 keyResolver.AddKeys("mykeys", "keys") 80 middleware = jwt.New(keyResolver, goAway, securityScheme) 81 // HS256 {"scopes":"scope1","admin":true}, signed with "keys" 82 request.Header.Set("Authorization", "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzY29wZXMiOiJzY29wZTEiLCJhZG1pbiI6dHJ1ZX0.UCvEfbD_yuS5dCZidxZgogVi2yF0ZVecMsQQbY1HJy0") 83 dispatchResult = middleware(handler)(context.Background(), respRecord, request) 84 Ω(dispatchResult).Should(HaveOccurred()) 85 }) 86 87 Context("given a properly-initialized middleware", func() { 88 BeforeEach(func() { 89 securityScheme = &goa.JWTSecurity{ 90 In: goa.LocHeader, 91 Name: "Authorization", 92 } 93 }) 94 95 Context("and a malformed request", func() { 96 BeforeEach(func() { 97 key := []byte("keys") 98 keyResolver := jwt.NewSimpleResolver([]jwt.Key{key}) 99 middleware = jwt.New(keyResolver, nil, securityScheme) 100 }) 101 102 It("should reject unknown authorization schemes", func() { 103 request.Header.Set("Authorization", "psychic paper") 104 dispatchResult = middleware(handler)(context.Background(), respRecord, request) 105 Ω(dispatchResult).Should(HaveOccurred()) 106 }) 107 108 It("should reject nonsensical scopes", func() { 109 // HS256 {"scopes":42}, signed with "keys" 110 request.Header.Set("Authorization", "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzY29wZXMiOjQyfQ.IO1-bXNsKlzfOycJeLMvl-17E81bj35-jcwMLKcvwNg") 111 dispatchResult = middleware(handler)(context.Background(), respRecord, request) 112 Ω(dispatchResult).Should(HaveOccurred()) 113 }) 114 115 It("should reject missing scopes", func() { 116 ctx := goa.WithRequiredScopes(context.Background(), []string{"foo"}) 117 // HS256 {}, signed with "keys" 118 request.Header.Set("Authorization", "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e30.GzYyHfGzNvErEXwUOI6oS-kszkhv7Ha8enQgv10_bz8") 119 dispatchResult = middleware(handler)(ctx, respRecord, request) 120 Ω(dispatchResult).Should(HaveOccurred()) 121 }) 122 }) 123 124 Context("and a valid, well-formed request", func() { 125 JustBeforeEach(func() { 126 dispatchResult = middleware(handler)(context.Background(), respRecord, request) 127 }) 128 129 Context("with an HS256 token", func() { 130 BeforeEach(func() { 131 // HS256 {"scopes":"scope1","admin":true}, signed with "keys" 132 request.Header.Set("Authorization", "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzY29wZXMiOiJzY29wZTEiLCJhZG1pbiI6dHJ1ZX0.UCvEfbD_yuS5dCZidxZgogVi2yF0ZVecMsQQbY1HJy0") 133 }) 134 135 Context("with a single key", func() { 136 var err1, err2 error 137 BeforeEach(func() { 138 keyResolver, err := jwt.NewResolver(nil, "keyname") 139 err1 = err 140 err2 = keyResolver.AddKeys("mykeys", "keys") 141 middleware = jwt.New(keyResolver, nil, securityScheme) 142 }) 143 144 It("should go through", func() { 145 Ω(err1).ShouldNot(HaveOccurred()) 146 Ω(err2).ShouldNot(HaveOccurred()) 147 Ω(dispatchResult).ShouldNot(HaveOccurred()) 148 Ω(fetchedToken).ShouldNot(BeNil()) 149 }) 150 }) 151 152 Context("with a single key and specified jwt keyname field", func() { 153 var err1, err2 error 154 BeforeEach(func() { 155 request.Header.Set("keyname", "mykeys") 156 keyResolver, err := jwt.NewResolver(nil, "keyname") 157 err1 = err 158 err2 = keyResolver.AddKeys("mykeys", "keys") 159 middleware = jwt.New(keyResolver, nil, securityScheme) 160 }) 161 162 It("should go through", func() { 163 Ω(err1).ShouldNot(HaveOccurred()) 164 Ω(err2).ShouldNot(HaveOccurred()) 165 Ω(dispatchResult).ShouldNot(HaveOccurred()) 166 Ω(fetchedToken).ShouldNot(BeNil()) 167 }) 168 }) 169 170 Context("with a single key and incorrectly specified jwt keyname field", func() { 171 var err1, err2 error 172 BeforeEach(func() { 173 request.Header.Set("keyname", "notmykeys") 174 keyResolver, err := jwt.NewResolver(nil, "keyname") 175 err1 = err 176 err2 = keyResolver.AddKeys("mykeys", "keys") 177 middleware = jwt.New(keyResolver, nil, securityScheme) 178 }) 179 180 It("should fail with an error", func() { 181 Ω(err1).ShouldNot(HaveOccurred()) 182 Ω(err2).ShouldNot(HaveOccurred()) 183 Ω(dispatchResult).Should(HaveOccurred()) 184 }) 185 }) 186 187 Context("with keys that didn't the JWT", func() { 188 var err1, err2 error 189 BeforeEach(func() { 190 keyResolver, err := jwt.NewResolver(nil, "keyname") 191 err1 = err 192 err2 = keyResolver.AddKeys("mykeys", "otherkey") 193 middleware = jwt.New(keyResolver, nil, securityScheme) 194 }) 195 196 It("should fail with an error", func() { 197 Ω(err1).ShouldNot(HaveOccurred()) 198 Ω(err2).ShouldNot(HaveOccurred()) 199 Ω(dispatchResult).Should(HaveOccurred()) 200 }) 201 }) 202 203 Context("with multiple keys", func() { 204 var err1, err2 error 205 BeforeEach(func() { 206 keyResolver, err := jwt.NewResolver(nil, "keyname") 207 err1 = err 208 err2 = keyResolver.AddKeys("mykeys", []string{"firstkey", "keys"}) 209 middleware = jwt.New(keyResolver, nil, securityScheme) 210 }) 211 212 It("should go through", func() { 213 Ω(err1).ShouldNot(HaveOccurred()) 214 Ω(err2).ShouldNot(HaveOccurred()) 215 Ω(dispatchResult).ShouldNot(HaveOccurred()) 216 Ω(fetchedToken).ShouldNot(BeNil()) 217 }) 218 }) 219 }) 220 221 Context("with an RS256 token", func() { 222 BeforeEach(func() { 223 // RS256 {"scopes":"scope1 scope2","admin":true}, signed with rsaKey1 below 224 request.Header.Set("Authorization", "Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzY29wZXMiOiJzY29wZTEgc2NvcGU"+ 225 "yIiwiYWRtaW4iOnRydWV9.gT4gSGqXTCUZAJT_TWZ4eknazVo-ulMKwSpHoghWZU8Sm9QXt48ISwFAb_wW2xhR58MUNX95iuiex0bCWvze59r"+ 226 "35dEQ2SOZixuDvE8srQi2SRk9qqsVV9-R361qf2D8KfLX9jQ7j-UB40bleg0fOyBAjPLPq0ggBigSjQ2yUz8YDKma-n6Ulc3LJ4gyozmb3MjO"+ 227 "9RV2pdD3N-m6ttwkTkUE2jhsL6a3T8f0Y6xSGTMyZasKc6kHbUyz6NjAeplLhbkBDE8-Ak4GaLGlLnLzZ49oTVrh89yauciW5yLQCXzXt2POD"+ 228 "qp6zXPC0FFcDr-2USCpA-nqaQQyhliMcgtqVw") 229 }) 230 231 Context("with a single key", func() { 232 var err1, err2 error 233 BeforeEach(func() { 234 keyResolver, err := jwt.NewResolver(nil, "keyname") 235 err1 = err 236 err2 = keyResolver.AddKeys("mykeys", rsaPubKey1) 237 middleware = jwt.New(keyResolver, nil, securityScheme) 238 }) 239 240 It("should go through", func() { 241 Ω(err1).ShouldNot(HaveOccurred()) 242 Ω(err2).ShouldNot(HaveOccurred()) 243 Ω(dispatchResult).ShouldNot(HaveOccurred()) 244 Ω(fetchedToken).ShouldNot(BeNil()) 245 }) 246 }) 247 248 Context("with a single key and specified jwt keyname field", func() { 249 var err1, err2 error 250 BeforeEach(func() { 251 request.Header.Set("keyname", "mykeys") 252 keyResolver, err := jwt.NewResolver(nil, "keyname") 253 err1 = err 254 err2 = keyResolver.AddKeys("mykeys", rsaPubKey1) 255 middleware = jwt.New(keyResolver, nil, securityScheme) 256 }) 257 258 It("should go through", func() { 259 Ω(err1).ShouldNot(HaveOccurred()) 260 Ω(err2).ShouldNot(HaveOccurred()) 261 Ω(dispatchResult).ShouldNot(HaveOccurred()) 262 Ω(fetchedToken).ShouldNot(BeNil()) 263 }) 264 }) 265 266 Context("with a single key and incorrectly specified jwt keyname field", func() { 267 var err1, err2 error 268 BeforeEach(func() { 269 request.Header.Set("keyname", "notmykeys") 270 keyResolver, err := jwt.NewResolver(nil, "keyname") 271 err1 = err 272 err2 = keyResolver.AddKeys("mykeys", rsaPubKey1) 273 middleware = jwt.New(keyResolver, nil, securityScheme) 274 }) 275 276 It("should fail with an error", func() { 277 Ω(err1).ShouldNot(HaveOccurred()) 278 Ω(err2).ShouldNot(HaveOccurred()) 279 Ω(dispatchResult).Should(HaveOccurred()) 280 Ω(dispatchResult.(error)).Should(HaveOccurred()) 281 }) 282 }) 283 284 Context("with keys that didn't the JWT", func() { 285 var err1, err2 error 286 BeforeEach(func() { 287 keyResolver, err := jwt.NewResolver(nil, "keyname") 288 err1 = err 289 err2 = keyResolver.AddKeys("mykeys", rsaPubKey2) 290 middleware = jwt.New(keyResolver, nil, securityScheme) 291 }) 292 293 It("should fail with an error", func() { 294 Ω(err1).ShouldNot(HaveOccurred()) 295 Ω(err2).ShouldNot(HaveOccurred()) 296 Ω(dispatchResult).Should(HaveOccurred()) 297 Ω(dispatchResult.(error)).Should(HaveOccurred()) 298 }) 299 }) 300 301 Context("with multiple keys", func() { 302 var err1, err2 error 303 BeforeEach(func() { 304 keyResolver, err := jwt.NewResolver(nil, "keyname") 305 err1 = err 306 err2 = keyResolver.AddKeys("mykeys", []*rsa.PublicKey{rsaPubKey1}) 307 middleware = jwt.New(keyResolver, nil, securityScheme) 308 }) 309 310 It("should go through", func() { 311 Ω(err1).ShouldNot(HaveOccurred()) 312 Ω(err2).ShouldNot(HaveOccurred()) 313 Ω(dispatchResult).ShouldNot(HaveOccurred()) 314 Ω(fetchedToken).ShouldNot(BeNil()) 315 }) 316 }) 317 }) 318 319 Context("with an ES256 token", func() { 320 BeforeEach(func() { 321 // ES256 {"scopes":"scope1 scope2","admin":true}, signed with ecKey1 below 322 request.Header.Set("Authorization", "Bearer "+ 323 "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9."+ 324 "eyJhZG1pbiI6dHJ1ZSwic2NvcGVzIjoic2NvcGUxIHNjb3BlMiJ9."+ 325 "7gM4EblP4cvX5C6PBLSBFpKX2FQ9AsLNmOXEm86uvrd4czBfw1zDO24abQ7gtlbMcjuVvxrpIyRa7Nbbn31G7w") 326 }) 327 328 Context("with a single key", func() { 329 var err1, err2 error 330 BeforeEach(func() { 331 keyResolver, err := jwt.NewResolver(nil, "keyname") 332 err1 = err 333 err2 = keyResolver.AddKeys("mykeys", ecPubKey1) 334 middleware = jwt.New(keyResolver, nil, securityScheme) 335 }) 336 337 It("should go through", func() { 338 Ω(err1).ShouldNot(HaveOccurred()) 339 Ω(err2).ShouldNot(HaveOccurred()) 340 Ω(dispatchResult).ShouldNot(HaveOccurred()) 341 Ω(fetchedToken).ShouldNot(BeNil()) 342 }) 343 }) 344 345 Context("with a single key and specified jwt keyname field", func() { 346 var err1, err2 error 347 BeforeEach(func() { 348 request.Header.Set("keyname", "mykeys") 349 keyResolver, err := jwt.NewResolver(nil, "keyname") 350 err1 = err 351 err2 = keyResolver.AddKeys("mykeys", ecPubKey1) 352 middleware = jwt.New(keyResolver, nil, securityScheme) 353 }) 354 355 It("should go through", func() { 356 Ω(err1).ShouldNot(HaveOccurred()) 357 Ω(err2).ShouldNot(HaveOccurred()) 358 Ω(dispatchResult).ShouldNot(HaveOccurred()) 359 Ω(fetchedToken).ShouldNot(BeNil()) 360 }) 361 }) 362 363 Context("with a single key and incorrectly specified jwt keyname field", func() { 364 var err1, err2 error 365 BeforeEach(func() { 366 request.Header.Set("keyname", "notmykeys") 367 keyResolver, err := jwt.NewResolver(nil, "keyname") 368 err1 = err 369 err2 = keyResolver.AddKeys("mykeys", ecPubKey1) 370 middleware = jwt.New(keyResolver, nil, securityScheme) 371 }) 372 373 It("should fail with an error", func() { 374 Ω(err1).ShouldNot(HaveOccurred()) 375 Ω(err2).ShouldNot(HaveOccurred()) 376 Ω(dispatchResult).Should(HaveOccurred()) 377 Ω(dispatchResult.(error)).Should(HaveOccurred()) 378 }) 379 }) 380 381 Context("with keys that didn't sign the JWT", func() { 382 var err1, err2 error 383 BeforeEach(func() { 384 keyResolver, err := jwt.NewResolver(nil, "keyname") 385 err1 = err 386 err2 = keyResolver.AddKeys("mykeys", ecPubKey2) 387 middleware = jwt.New(keyResolver, nil, securityScheme) 388 }) 389 390 It("should fail with an error", func() { 391 Ω(err1).ShouldNot(HaveOccurred()) 392 Ω(err2).ShouldNot(HaveOccurred()) 393 Ω(dispatchResult).Should(HaveOccurred()) 394 Ω(dispatchResult.(error)).Should(HaveOccurred()) 395 }) 396 }) 397 398 Context("with multiple keys", func() { 399 var err1, err2 error 400 BeforeEach(func() { 401 keyResolver, err := jwt.NewResolver(nil, "keyname") 402 err1 = err 403 err2 = keyResolver.AddKeys("mykeys", []*ecdsa.PublicKey{ecPubKey1}) 404 middleware = jwt.New(keyResolver, nil, securityScheme) 405 }) 406 407 It("should go through", func() { 408 Ω(err1).ShouldNot(HaveOccurred()) 409 Ω(err2).ShouldNot(HaveOccurred()) 410 Ω(dispatchResult).ShouldNot(HaveOccurred()) 411 Ω(fetchedToken).ShouldNot(BeNil()) 412 }) 413 }) 414 }) 415 }) 416 }) 417 }) 418 419 var rsaKey1, _ = jwtpkg.ParseRSAPrivateKeyFromPEM([]byte(`-----BEGIN RSA PRIVATE KEY----- 420 MIIEogIBAAKCAQEArZIJcPQd7aSGb80wgFpy5SVjzzsGpfIysZ30SdWlTcWMVbAT 421 XmsDNgw98TzIeoyikSbSHEeORbKWKS2clgNsdLjYKv3XLTBaXfLcU3x9mhnk/kUL 422 N/AQgyvsRGynPris2oVzGSib7uOZK/9+u+QAKIrp7prcmMmnwvdcjFXjwzx83RTF 423 1b+iuVGCdV0T4m1XQdm/YtIUh7JNbYrUolkdwZlOxMZuV0FDC+ms02+gyj580Pyl 424 TuAD4JmtSmmijyWfEx5dsZYtGALyUxcm5Hz15RP3FACrv4B++BHI6smO4sWdrSYV 425 l3sHJ60Bm6zbwuyB2twJPOdL5nVIGiIDdf+1IwIDAQABAoIBACF3MtLQfqS/QBx2 426 V4+n4NdFqkTegJ2mYRfV+K/zvXeNS02KMXHW+DuHiLnmmlDmpMGP1psVQN03XbR6 427 0uIprtOigCtp3f8cf4/1r315V05LB9fuwAb9BnIEGf3nZSe2u702VcbYCZi50WKm 428 VG0tvMoUXp5exYG//9SblQCJ3uxZf9D8y5RnrUZtP4Pnjkn/3YeJCF+Kked55Cvi 429 gv56/aiyWp9xEGsSWig5Zt8VNXihgT7D2KZzxcQDQlxw0CR5ECT7/4w7sZVvwc7B 430 I76JJDvpD0UGvzoUgx928efGKxJBrcjzvTNSKgHJYYCvaa6+qX2tjkmOqdG4xl27 431 /TaBISECgYEA4YJ32HKaS2ikn5J2C1qlHy4nRuVNhX8T9qvp6OBdbE2BQq3O5IUt 432 +wdTcjhD88aDdHCZmAd8i3FC4l+CKsQ5sTwRk0vTOZ7axC6+zDHg+na5/+NCq+xm 433 ffoaZ5jsZFyqfbsFn8NiLWLo2JSFV1AnUxwpPA2jbuylAuZVvVbLYHcCgYEAxQnO 434 L+U6NwTvN6EJgt3h1jHfXiQnapsj0O0XgK+g2K6vMovpXAf9noO+r3Qbx/aKxuRg 435 TvRQ08T5yyqysz+sYe0rp8oaMUhYQFMgJOUUBlmUVGxYdARMD6kTy/384B9Azoex 436 UCosMSEAD909MAsyQWB4X6OJKd+V68QpFYeIx7UCgYBHgaRY6PYOBU92He36abLE 437 MVFZBKrRMtt0s0yHgGV/SxA6wXxCMAzFdaw7IqZBbWgPiwjZET6nxLFNsLVItFIK 438 5h44k6mVss5xuNTdUM+i+/S8tCZW964EMkMfKHmE1XFmTuBYqY6/D4b/7hBeAFeH 439 3f0hQr3ZFYa5Zao4UIZKvwKBgGL8lhUBt8lENVlhEYIpLfeJfomw6AxqfAfN1GzV 440 zpyMxX9DQqz1ZrhnvzgtwHcoqHda6/c+TgzVfBhRDw12A4f+ulvE8HupuIw4NoHS 441 g8jc3+O5uoYuUnfbnRJyOsPtb4VSLgXz6deUmI9fugmU1l55tH93jMT4ijyzg2BJ 442 grGxAoGAWX24Yx9qoasqEQ2rgdTsgylwL28UczKQ5KNHt2PcEfPNw6/GpfK7YmlU 443 Heef2umEzb1K2ZK95wlMbF8zpNDWBf4PkxgfW+JEE+pO1kb5KXysBymymyXhGHAP 444 CwH9XHqbjVlsD358AbPeKqLgTCaGo9JgsEZDBpESmBDnIPUahMc= 445 -----END RSA PRIVATE KEY-----`)) 446 447 var rsaPubKey1, _ = jwtpkg.ParseRSAPublicKeyFromPEM([]byte(`-----BEGIN PUBLIC KEY----- 448 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArZIJcPQd7aSGb80wgFpy 449 5SVjzzsGpfIysZ30SdWlTcWMVbATXmsDNgw98TzIeoyikSbSHEeORbKWKS2clgNs 450 dLjYKv3XLTBaXfLcU3x9mhnk/kULN/AQgyvsRGynPris2oVzGSib7uOZK/9+u+QA 451 KIrp7prcmMmnwvdcjFXjwzx83RTF1b+iuVGCdV0T4m1XQdm/YtIUh7JNbYrUolkd 452 wZlOxMZuV0FDC+ms02+gyj580PylTuAD4JmtSmmijyWfEx5dsZYtGALyUxcm5Hz1 453 5RP3FACrv4B++BHI6smO4sWdrSYVl3sHJ60Bm6zbwuyB2twJPOdL5nVIGiIDdf+1 454 IwIDAQAB 455 -----END PUBLIC KEY-----`)) 456 457 var rsaKey2, _ = jwtpkg.ParseRSAPrivateKeyFromPEM([]byte(`-----BEGIN RSA PRIVATE KEY----- 458 MIIEowIBAAKCAQEA4jr/DGbPt0UDGvu6Xo2LV0F6Wf8OnyxF2IFPdG5B4X0YS3DC 459 9SF3clbbBivDVa2bEXppyj+eLEKlfohCWXTrJK0LxTEcneuDkF4re+BdP3q9cKRz 460 FtI/ZVhVnD7+PS1wps7OiTM0iOaIDo9+uFrC6zBTRAiPyrdwh1ApttLdoD6i5D9D 461 7zzvpTXLC/UWaRz/phAaaop6dPPR1YblZEckWgqTMC3KrRX/6QJFFfpgyQzFT09W 462 DYnmXl2gS7C2sk4UejygqmVg96JxaIaT3WiQSjxXddjR/krcA9EGNNEkpZB2W6Ux 463 6d63yWsNG9YJUacwI+M2q5ZW964J1s//FiNZZQIDAQABAoIBAQCoqYtU16Gs5Qq3 464 p0z/CVAFMY/iYMGp8fvwuhdemoULc5QVSnBPCTBgUljgdOggjFm74iPU4TEvllCD 465 0VqGDyDwKwNHdKH9KoTfsRWCOXfLx9pMjI4xSXZyPDU3U8+AFMyT0EMzDrXwCs8M 466 6/Zxw1jmtxSc+DUb0T9X4m/3GaaZvDGGShnU8/XnEh2uEHrNwWnGWYPJ/rZjNZPy 467 PZ9W2VpcHKBMVEowK/cOoouNuflAISoLCCLMNYygr9T4Ylm3HGP9o7JuWL+wGQsa 468 aXrE5qTOpsxmBqTQ8pglnxnhDEFXmx3O+bwRfIwDSYe+wvCINpdIstWuybh4Ed2i 469 ZgLTlx8BAoGBAP9LwmfZ/2XNHBzk+f09TnTnhXzVsKkHu5BlXvWoDigVv4Dzl44j 470 X1Ade5PjiOf0Jti2QCkAaI+CjExdP1zCqDZBQFpKI3QQgvlWoKXHVFV9ziC8gcX+ 471 I6M8wmtIoK8ISnC6A5s1wKIvOPsZyP7aVZgu805BKfVqtFWCK42vnRVRAoGBAOLa 472 t2pOzVttd3vPgzGovD+Mf3RsPg6ygazj0GiDRspRCnoeopFEoBPFcKIQZlPp8rfT 473 NLOuwVkW5TqntrCW0UwixZMXicIaPDo0idXInIfP0+f7JxSYb5q7vmbyRt8uAYY9 474 GU4L/ZIn127JbgQ5n5nuODMvTe7m5Ky+FUYHw43VAoGAE6QOdtLstTZMfWSYXwVC 475 bfgJ6wq9pqNzqK5D2f5t6GOT8iXLeSH7iTxbb4tH0yCThISw9vaTFMdkZ9OctlQ7 476 gMEQZGHjzGAg03H4tghZ0qH1I8uc6FCfCUX5ZyuVQSIQKBAHiv9drJyZc6gOMJ03 477 jJfAHDsjMUBeU13KYAIswaECgYBTYiNSzv5KodTuTFsjsKrpDOJ4T6ULz+88NkyP 478 bdliWiFou8Pzc28HdWYuG6sRIwfVK6vOc+ibr3+4bJcJF5Z8zrcilt9K2kvS9SbI 479 zsFCZlC0jytRNaqoDGQzANCuDgH/bovTlTKyOzTDgwSORwP0F4zOu4+AxZu+Juw4 480 3nextQKBgEAGLuChkztZCVt0W2D8wJYFR7XjezcbsfpoXx9H8htk6u4STu9TwB76 481 DxoYj3qiTV2kRRBQQZRAli1TbDOnJuqFMnRL0aPsqebuW2sqY9Hx9G6TxokN8Nc6 482 RlTE+CbPcjBgAx+AANL/X2KYoXLAjOrYY5kQD8Qbt8Wkme7m6hiP 483 -----END RSA PRIVATE KEY-----`)) 484 485 var rsaPubKey2, _ = jwtpkg.ParseRSAPublicKeyFromPEM([]byte(`-----BEGIN PUBLIC KEY----- 486 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jr/DGbPt0UDGvu6Xo2L 487 V0F6Wf8OnyxF2IFPdG5B4X0YS3DC9SF3clbbBivDVa2bEXppyj+eLEKlfohCWXTr 488 JK0LxTEcneuDkF4re+BdP3q9cKRzFtI/ZVhVnD7+PS1wps7OiTM0iOaIDo9+uFrC 489 6zBTRAiPyrdwh1ApttLdoD6i5D9D7zzvpTXLC/UWaRz/phAaaop6dPPR1YblZEck 490 WgqTMC3KrRX/6QJFFfpgyQzFT09WDYnmXl2gS7C2sk4UejygqmVg96JxaIaT3WiQ 491 SjxXddjR/krcA9EGNNEkpZB2W6Ux6d63yWsNG9YJUacwI+M2q5ZW964J1s//FiNZ 492 ZQIDAQAB 493 -----END PUBLIC KEY-----`)) 494 495 var ecKey1, _ = jwtpkg.ParseECPrivateKeyFromPEM([]byte(`-----BEGIN EC PRIVATE KEY----- 496 MHcCAQEEIM4zAVusfF+Xl4Z5a5LaspGk+OIwGQweubphSqC1R9+VoAoGCCqGSM49 497 AwEHoUQDQgAE3tWSknhfssUVytNbPz3TB7giFfxKtHsFW27Yls+Ohfuui9NW4eEk 498 fLOxYkTI9tyoKfh9Dan5kJFA7ZYEwZ0zMQ== 499 -----END EC PRIVATE KEY-----`)) 500 501 var ecPubKey1, _ = jwtpkg.ParseECPublicKeyFromPEM([]byte(`-----BEGIN PUBLIC KEY----- 502 MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE3tWSknhfssUVytNbPz3TB7giFfxK 503 tHsFW27Yls+Ohfuui9NW4eEkfLOxYkTI9tyoKfh9Dan5kJFA7ZYEwZ0zMQ== 504 -----END PUBLIC KEY-----`)) 505 506 var ecKey2, _ = jwtpkg.ParseECPrivateKeyFromPEM([]byte(`-----BEGIN EC PRIVATE KEY----- 507 MHcCAQEEIKQ7EyFGaYMuFpMLnqK+mBnT9CrWOqzVxsF8wBlGrTq/oAoGCCqGSM49 508 AwEHoUQDQgAE8IX3mOtLvBpvrylaRjFpadqGrirXh9dkjJfM/t1dnLu5qPhybMIY 509 tEr3Xs8vYp2wyaSTVKsyj9y+t344T5Bhdw== 510 -----END EC PRIVATE KEY-----`)) 511 512 var ecPubKey2, _ = jwtpkg.ParseECPublicKeyFromPEM([]byte(`-----BEGIN PUBLIC KEY----- 513 MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE8IX3mOtLvBpvrylaRjFpadqGrirX 514 h9dkjJfM/t1dnLu5qPhybMIYtEr3Xs8vYp2wyaSTVKsyj9y+t344T5Bhdw== 515 -----END PUBLIC KEY-----`))