You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

bearer_test.go 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package jwt
  2. import (
  3. "testing"
  4. jwt "github.com/golang-jwt/jwt/v5"
  5. )
  6. const (
  7. rsaTestPubKey = `-----BEGIN PUBLIC KEY-----
  8. MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwhcCcXrfR/GmoPKxBi0H
  9. cUl2pUl4acq2m3abFtMMoYTydJdEhgYWfsXuragyEIVkJU1ZnrgedW0QJUcANRGO
  10. hP/B+MjBevDNsRXQECfhyjfzhz6KWZb4i7C2oImJuAjq/F4qGLdEGQDBpAzof8qv
  11. 9Zt5iN3GXY/EQtQVMFyR/7BPcbPLbHlOtzZ6tVEioXuUxQoai7x3Kc0jIcPWuyGa
  12. Q04IvsgdaWO6oH4fhPfyVsmX37rYUn79zcqPHS4ieWM1KN9qc7W+/UJIeiwAStpJ
  13. 8gv+OSMrijRZGgQGCeOO5U59GGJC4mqUczB+JFvrlAIv0rggNpl+qalngosNxukB
  14. uQIDAQAB
  15. -----END PUBLIC KEY-----`
  16. rsaTestPrivKey = `-----BEGIN PRIVATE KEY-----
  17. MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDCFwJxet9H8aag
  18. 8rEGLQdxSXalSXhpyrabdpsW0wyhhPJ0l0SGBhZ+xe6tqDIQhWQlTVmeuB51bRAl
  19. RwA1EY6E/8H4yMF68M2xFdAQJ+HKN/OHPopZlviLsLagiYm4COr8XioYt0QZAMGk
  20. DOh/yq/1m3mI3cZdj8RC1BUwXJH/sE9xs8tseU63Nnq1USKhe5TFChqLvHcpzSMh
  21. w9a7IZpDTgi+yB1pY7qgfh+E9/JWyZffuthSfv3Nyo8dLiJ5YzUo32pztb79Qkh6
  22. LABK2knyC/45IyuKNFkaBAYJ447lTn0YYkLiapRzMH4kW+uUAi/SuCA2mX6pqWeC
  23. iw3G6QG5AgMBAAECggEARaAnejoP2ykvE1G8e3Cv2M33x/eBQMI9m6uCmz9+qnqc
  24. 14JkTIfmjffHVXie7RpNAKys16lJE+rZ/eVoh6EStVdiaDLsZYP45evjRcho0Tgd
  25. Hokq7FSiOMpd2V09kE1yrrHA/DjSLv38eTNAPIejc8IgaR7VyD6Is0iNiVnL7iLa
  26. mj1zB6+dSeQ5ICYkrihb1gA+SvECsjLZ/5XESXEdHJvxhC0vLAdHmdQf3BPPlrGg
  27. VHondxL5gt6MFykpOxTFA6f5JkSefhUR/2OcCDpMs6a5GUytjl3rA3aGT6v3CbnR
  28. ykD6PzyC20EUADQYF2pmJfzbxyRqfNdbSJwQv5QQYQKBgQD4rFdvgZC97L7WhZ5T
  29. axW8hRW2dH24GIqFT4ZnCg0suyMNshyGvDMuBfGvokN/yACmvsdE0/f57esar+ye
  30. l9RC+CzGUch08Ke5WdqwACOCNDpx0kJcXKTuLIgkvthdla/oAQQ9T7OgEwDrvaR0
  31. m8s/Z7Hb3hLD3xdOt6Xjrv/6xQKBgQDHzvbcIkhmWdvaPDT9NEu7psR/fxF5UjqU
  32. Cca/bfHhySRQs3A1CF57pfwpUqAcSivNf7O+3NI62AKoyMDYv0ek2h6hGk6g5GJ1
  33. SuXYfjcbkL6SWNV0InsgmzCjvxhyms83xZq7uMClEBvkiKVMdt6zFkwW9eRKtUuZ
  34. pzVK5RfqZQKBgF5SME/xGw+O7su7ntQROAtrh1LPWKgtVs093sLSgzDGQoN9XWiV
  35. lewNASEXMPcUy3pzvm2S4OoBnj1fISb+e9py+7i1aI1CgrvBIzvCsbU/TjPCBr21
  36. vjFA3trhMHw+vJwJVqxSwNUkoCLKqcg5F5yTHllBIGj/A34uFlQIGrvpAoGAextm
  37. d+1bhExbLBQqZdOh0cWHjjKBVqm2U93OKcYY4Q9oI5zbRqGYbUCwo9k3sxZz9JJ4
  38. 8eDmWsEaqlm+kA0SnFyTwJkP1wvAKhpykTf6xi4hbNP0+DACgu17Q3iLHJmLkQZc
  39. Nss3TrwlI2KZzgnzXo4fZYotFWasZMhkCngqiw0CgYEAmz2D70RYEauUNE1+zLhS
  40. 6Ox5+PF/8Z0rZOlTghMTfqYcDJa+qQe9pJp7RPgilsgemqo0XtgLKz3ATE5FmMa4
  41. HRRGXPkMNu6Hzz4Yk4eM/yJqckoEc8azV25myqQ+7QXTwZEvxVbtUWZtxfImGwq+
  42. s/uzBKNwWf9UPTeIt+4JScg=
  43. -----END PRIVATE KEY-----`
  44. )
  45. func TestJWTBearerAuth(t *testing.T) {
  46. j := JWTAuthConfig{
  47. Enabled: true,
  48. Tokens: []JWTAuthTokenConfig{
  49. {
  50. Algorithm: "rsa",
  51. KeyString: rsaTestPubKey,
  52. AccountClaims: []string{"preferred_username", "email"},
  53. StripDomain: "example.com",
  54. },
  55. },
  56. }
  57. if err := j.Postprocess(); err != nil {
  58. t.Fatal(err)
  59. }
  60. // fixed test vector signed with the RSA privkey:
  61. token := "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJwcmVmZXJyZWRfdXNlcm5hbWUiOiJzbGluZ2FtbiJ9.caPZw2Dl4KZN-SErD5-WZB_lPPveHXaMCoUHxNebb94G9w3VaWDIRdngVU99JKx5nE_yRtpewkHHvXsQnNA_M63GBXGK7afXB8e-kV33QF3v9pXALMP5SzRwMgokyxas0RgHu4e4L0d7dn9o_nkdXp34GX3Pn1MVkUGBH6GdlbOdDHrs04pPQ0Qj-O2U0AIpnZq-X_GQs9ECJo4TlPKWR7Jlq5l9bS0dBnohea4FuqJr232je-dlRVkbCa7nrnFmsIsezsgA3Jb_j9Zu_iv460t_d2eaytbVp9P-DOVfzUfkBsKs-81URQEnTjW6ut445AJz2pxjX92X0GdmORpAkQ"
  62. accountName, err := j.Validate(token)
  63. if err != nil {
  64. t.Errorf("could not validate valid token: %v", err)
  65. }
  66. if accountName != "slingamn" {
  67. t.Errorf("incorrect account name for token: `%s`", accountName)
  68. }
  69. // programmatically sign a new token, validate it
  70. privKey, err := jwt.ParseRSAPrivateKeyFromPEM([]byte(rsaTestPrivKey))
  71. if err != nil {
  72. t.Fatal(err)
  73. }
  74. jTok := jwt.NewWithClaims(jwt.SigningMethodRS256, jwt.MapClaims(map[string]any{"preferred_username": "slingamn"}))
  75. token, err = jTok.SignedString(privKey)
  76. if err != nil {
  77. t.Fatal(err)
  78. }
  79. accountName, err = j.Validate(token)
  80. if err != nil {
  81. t.Errorf("could not validate valid token: %v", err)
  82. }
  83. if accountName != "slingamn" {
  84. t.Errorf("incorrect account name for token: `%s`", accountName)
  85. }
  86. // test expiration
  87. jTok = jwt.NewWithClaims(jwt.SigningMethodRS256, jwt.MapClaims(map[string]any{"preferred_username": "slingamn", "exp": 1675740865}))
  88. token, err = jTok.SignedString(privKey)
  89. if err != nil {
  90. t.Fatal(err)
  91. }
  92. accountName, err = j.Validate(token)
  93. if err == nil {
  94. t.Errorf("validated expired token")
  95. }
  96. // test for the infamous algorithm confusion bug
  97. jTok = jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims(map[string]any{"preferred_username": "slingamn"}))
  98. token, err = jTok.SignedString([]byte(rsaTestPubKey))
  99. if err != nil {
  100. t.Fatal(err)
  101. }
  102. accountName, err = j.Validate(token)
  103. if err == nil {
  104. t.Errorf("validated HS256 token despite RSA being required")
  105. }
  106. // test no valid claims
  107. jTok = jwt.NewWithClaims(jwt.SigningMethodRS256, jwt.MapClaims(map[string]any{"sub": "slingamn"}))
  108. token, err = jTok.SignedString(privKey)
  109. if err != nil {
  110. t.Fatal(err)
  111. }
  112. accountName, err = j.Validate(token)
  113. if err != ErrNoValidAccountClaim {
  114. t.Errorf("expected ErrNoValidAccountClaim, got: %v", err)
  115. }
  116. // test email addresses
  117. jTok = jwt.NewWithClaims(jwt.SigningMethodRS256, jwt.MapClaims(map[string]any{"email": "Slingamn@example.com"}))
  118. token, err = jTok.SignedString(privKey)
  119. if err != nil {
  120. t.Fatal(err)
  121. }
  122. accountName, err = j.Validate(token)
  123. if err != nil {
  124. t.Errorf("could not validate valid token: %v", err)
  125. }
  126. if accountName != "Slingamn" {
  127. t.Errorf("incorrect account name for token: `%s`", accountName)
  128. }
  129. }