nulogy_sso 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +90 -0
  3. data/Rakefile +22 -0
  4. data/app/assets/images/nulogy_sso/favicon.png +0 -0
  5. data/app/assets/stylesheets/nulogy_sso/sso_error.css +214 -0
  6. data/app/controllers/nulogy_sso/auth_controller.rb +100 -0
  7. data/app/services/nulogy_sso/authenticator.rb +61 -0
  8. data/app/views/sso_error.html.erb +45 -0
  9. data/config/initializers/inflections.rb +7 -0
  10. data/config/routes.rb +5 -0
  11. data/lib/nulogy_sso/controller_helper.rb +32 -0
  12. data/lib/nulogy_sso/engine.rb +29 -0
  13. data/lib/nulogy_sso/test_utilities/auth_mock.rb +94 -0
  14. data/lib/nulogy_sso/test_utilities/cert.der +0 -0
  15. data/lib/nulogy_sso/test_utilities/key.pem +52 -0
  16. data/lib/nulogy_sso/test_utilities/test_helper.rb +55 -0
  17. data/lib/nulogy_sso/version.rb +3 -0
  18. data/lib/nulogy_sso.rb +39 -0
  19. data/spec/dummy/Rakefile +6 -0
  20. data/spec/dummy/app/assets/config/manifest.js +3 -0
  21. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  22. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  23. data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
  24. data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
  25. data/spec/dummy/app/controllers/application_controller.rb +12 -0
  26. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  27. data/spec/dummy/app/jobs/application_job.rb +2 -0
  28. data/spec/dummy/app/models/application_record.rb +3 -0
  29. data/spec/dummy/app/models/user.rb +5 -0
  30. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  31. data/spec/dummy/bin/bundle +3 -0
  32. data/spec/dummy/bin/rails +4 -0
  33. data/spec/dummy/bin/rake +4 -0
  34. data/spec/dummy/bin/setup +36 -0
  35. data/spec/dummy/bin/update +31 -0
  36. data/spec/dummy/bin/yarn +11 -0
  37. data/spec/dummy/config/application.rb +41 -0
  38. data/spec/dummy/config/auth_sso.yml +20 -0
  39. data/spec/dummy/config/boot.rb +5 -0
  40. data/spec/dummy/config/cable.yml +10 -0
  41. data/spec/dummy/config/database.yml +25 -0
  42. data/spec/dummy/config/environment.rb +5 -0
  43. data/spec/dummy/config/environments/development.rb +49 -0
  44. data/spec/dummy/config/environments/production.rb +79 -0
  45. data/spec/dummy/config/environments/test.rb +39 -0
  46. data/spec/dummy/config/initializers/application_controller_renderer.rb +8 -0
  47. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  48. data/spec/dummy/config/initializers/content_security_policy.rb +25 -0
  49. data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
  50. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  51. data/spec/dummy/config/initializers/inflections.rb +16 -0
  52. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  53. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  54. data/spec/dummy/config/locales/en.yml +33 -0
  55. data/spec/dummy/config/puma.rb +34 -0
  56. data/spec/dummy/config/routes.rb +6 -0
  57. data/spec/dummy/config/spring.rb +6 -0
  58. data/spec/dummy/config/storage.yml +34 -0
  59. data/spec/dummy/config.ru +5 -0
  60. data/spec/dummy/db/migrate/20190912211120_create_users.rb +12 -0
  61. data/spec/dummy/db/schema.rb +22 -0
  62. data/spec/dummy/db/test.sqlite3 +0 -0
  63. data/spec/dummy/log/test.log +837 -0
  64. data/spec/dummy/package.json +5 -0
  65. data/spec/dummy/public/404.html +67 -0
  66. data/spec/dummy/public/422.html +67 -0
  67. data/spec/dummy/public/500.html +66 -0
  68. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  69. data/spec/dummy/public/apple-touch-icon.png +0 -0
  70. data/spec/dummy/public/favicon.ico +0 -0
  71. data/spec/dummy/public/robots.txt +5 -0
  72. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-I/-IQzWZBVpyNJ9dwZO5AyzvfeT_L1FhLt_VKtEYstioM.cache +3 -0
  73. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-w/-wQxmZSFnAYuueO3wv-SMcI6GpkF0zb93Bk-K1nh6-I.cache +0 -0
  74. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/03/03X-YlLKeQbKg9UgFMNeO-pNRjTrufgGcONruMJMhus.cache +1 -0
  75. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0v/0vQlHhWsvfiQYmfJVne6KDdCTrM9Ct1ZBUv1wI12fXc.cache +1 -0
  76. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/1c/1cSa1S_Ik-wQeXi-Pb1sJX4_CC_Gu6CJ6THxM2ZxOTQ.cache +1 -0
  77. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3A/3ACRNidm75IdG2lgWCRExd2yOtmLtKsdRrgsvML8gc4.cache +0 -0
  78. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3o/3ogX5PjkplRXrsO2QZTSkbohBKS3xuy3yHXRf30Vsho.cache +0 -0
  79. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4J/4J2ZSEfqkzjpNHLlEPvd-5laPYz8eA0Tm6lt04YfVc4.cache +2 -0
  80. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4y/4ySQY2DeEDqx7mPwZF2m9dK9u5dtKOZj6PfLlWnRyEQ.cache +1 -0
  81. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5J/5JVr1JuiYXAwKzD64wxtFHroGbE9K2aMWb6f67tfVDQ.cache +1 -0
  82. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5u/5uuIL6SiWAHDNxQ63Bb-mEptuzUArLXyoTBDHJ5RTM4.cache +5 -0
  83. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6b/6bIKFgIunI8QwnhOiCTyQOSHwPOCUNQbSzAVYhaqq8E.cache +1 -0
  84. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8Q/8QavKcHzS_5D2q2DLfuAtFkJXKtNBAASd3oLAhmCNQs.cache +0 -0
  85. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8a/8avIYxo88yDqslmUypali4ILLE-OVrryLchYsJuc9uE.cache +1 -0
  86. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8i/8izW0a4Zw0ZIpyJ2h1olnHKpWoSj6Yu39_6iziqxvzc.cache +1 -0
  87. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/9J/9J6tFdjgXdjYE9Oc9ar9ti5spP_tdq-1_PiYhlD9t6I.cache +2 -0
  88. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/9q/9qxBVp_Ackolv-Ir9TIGtC3Jg4cbqj6mxxLcoimAilw.cache +0 -0
  89. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ac/AccyOixh8iQFR7XBSzGVVKalgdg64T1yeAp7NBwDtTg.cache +3 -0
  90. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/An/An4y7wYtShMDQHwnRlEj4qcTQOlebrjVIrH-ZjRXlTw.cache +0 -0
  91. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/D2/D2kPITeQ0WkknzjDQuPSbkXklgS6LtKcdtgyC3pu50k.cache +1 -0
  92. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/DO/DOjY5JRYb7u9e6jD6doIfYt5nrvUEjacjyhiTjXal2M.cache +1 -0
  93. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/DU/DUMR4O60Nd02Z9uDvlfLbFUhubOiMbJnYrbJR_AKo4k.cache +1 -0
  94. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Dt/Dt8q0fkQgUXw6I6nWfcPb4ZYGY-_UebKwhNObSrdkT8.cache +0 -0
  95. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ez/EzXtHEm-xBGVH72qLdvc7siqWebRocOJzp2iPwJm1TM.cache +0 -0
  96. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/FP/FPL9y7t_40uxIV9w2IGRZJnEh_5N6NmXaOWLgvn2wmI.cache +1 -0
  97. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/I-/I-aV6d9rIPlPNI2uOoWp7Il9fdzqpAmpJXcnd08TMxI.cache +0 -0
  98. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/J0/J030bfDTH7OJpzAVdkIlvcx8n0gY-en4t63QpRh83Yo.cache +2 -0
  99. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/KL/KLHTElxq3T60mK7oURgiZow2JiCXYvKCYEUdhhctZKM.cache +1 -0
  100. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/L2/L2uA8R_LKv75JnGXHF4Z-0J1AGG5VObLLPSObFUwov0.cache +0 -0
  101. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/M7/M7sD_tg1aMFHF-gHYiCM_ml6S44geHzvefKgdasAhz8.cache +1 -0
  102. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/M7/m7xag7aON7xLeWIpCQBJ70HcdFqJ1ZUZUg46oU89Zfw.cache +1 -0
  103. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/MA/MAsN3JftLnlWpSVqP84N8tvQ0c5DQ2AJBjL8nWVUINI.cache +0 -0
  104. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Mo/Mo6cKTdohqOXUaEUYOXwkpUewtRun6oC_arZQltPGZg.cache +0 -0
  105. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/OI/OIl8YRbsB6--l_CKIzlqpMNk31xMfPSe8IEGgNnNSQA.cache +2 -0
  106. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/OJ/OJjACgGreSmoal4FQO9QFdjAyRFG8y8Q6urqK9jarR0.cache +1 -0
  107. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/OS/OSjUgSyEOb3ZvdTPFeGkLQQzpdqEaIc_WDb9eOTANH8.cache +0 -0
  108. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/PJ/PJg5JJZQpAq56ZK4RlLkLk3EO_C_PfhhcQcgX155Q3Y.cache +3 -0
  109. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/QO/QO59HgQ2MIHck98-gaQqUM3ia4uzM138LlZsO5TsjLI.cache +1 -0
  110. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Qb/QblQL05XuRs4iHdx96hOHN5mI_37pNeik6NWB99iuxY.cache +0 -0
  111. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/R6/R678edDsoAWc6Bijbe0DN2gc--95iwiQo75-zILHS2Y.cache +0 -0
  112. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Rv/RvFFKTRBnfZgEO-gWwKl_MUeogSPgvYvqivJkjtHF1c.cache +1 -0
  113. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/St/StXiB3ZVbOvvg1eN7OMHH9g_uCljMP209iDbVkqVPaQ.cache +0 -0
  114. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Uj/UjohEpOjNl1G6DoHx_DiqYWORyFy_SIY-Z_3iTgvaNY.cache +2 -0
  115. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/W7/W7lea8dViN-zKiB0YDymngohwzY780_bafIrifdvdEU.cache +1 -0
  116. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Wv/Wv5smlMR8HZlVpUVszeSJC2Z3y9tNVOCXkBcRXb3PK0.cache +1 -0
  117. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/XZ/XZcPRDhkBL2jpJUwZciwFizBlxNz2CsMDBvM71F7Y6M.cache +1 -0
  118. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Y4/Y4XV3TFQk_FtIsIDm735D9Gxqs2n-nVssI7ItEbHlT4.cache +4 -0
  119. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/YU/YUZTikjrtYByH5K9PQpw9o9incNNYKhsjekDQLhPniE.cache +1 -0
  120. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Yp/YpMKz0G1Yf2acXo2K2vXpxKyND46cz69bF5q1zn5dWY.cache +1 -0
  121. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Zk/Zk5OwH10pLNWcgDncIB2KDdKjiMNtG7tzFnAiL4tITw.cache +2 -0
  122. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Zs/ZsxGMLE5q7daf8xX9wxiISEfgaSSkWQG13xtjs5oGvU.cache +1 -0
  123. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_c/_c0OX2xSAUonHyl--ScIJdqu4dOIv5eWSiRCpsNIat4.cache +0 -0
  124. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_v/_vB_dHVUtju7m6FGk-MvQutohQFkt58fsmuf3Y1EFgU.cache +1 -0
  125. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/aT/aTPoDhk5o9HqzSqn8VjurVSrWbYTbh3dAJmXhgLEZyc.cache +1 -0
  126. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/aZ/aZgVZIZURvHb9-rOh2SivDHU-aBn-Jn1nKOPuI7lF0U.cache +0 -0
  127. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bB/bBrouo-AbmaOmmI5w0EatyvJIj6Zel6BDOqpXUub-YM.cache +2 -0
  128. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bC/bCGetG10_IPS-4Lea1FrjonfYd1QJf5j7J23dBSgxMI.cache +3 -0
  129. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bd/bde0sI4pua76cCQiJr5-4YPdoGOq7zUcE5JUFy10wEQ.cache +1 -0
  130. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/c3/c3MkD92XKFFo7SIHfkh3Zf3b7TTV7PPhLy04Ak1iOuY.cache +0 -0
  131. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cI/cIXdHUyJ1umwlEmauLUx-whf_06eJvzlxEoPVPlG-4s.cache +1 -0
  132. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ck/ckZOTlrjGXnk3bJ7dEgh6ld9VFFg1rV7MGXqEv1Fb9I.cache +3 -0
  133. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/dC/dCxhpA2j6Pi1XDXa12EUmvdpLN_MJ3GPOZBqgg7GcVw.cache +0 -0
  134. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ej/ejwFH71RbcAzfpFyRxO8czavHqoOs9SzC10c-PwS60Y.cache +4 -0
  135. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/fl/flex8byqqPRlAhCuyDZsaMg2gOeDj3NHAIzid-OS2Hg.cache +0 -0
  136. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gu/guEVVxdrH6uyyJ_m1VYsBVD566zTNeSBDgppqYGy-sk.cache +2 -0
  137. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/hV/hVXlJWvvr6NsDbr1qABWR3CFv36YU7970jmxU_L2NuY.cache +1 -0
  138. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ju/juWsFPPdDAbfJ4X3-dknffITj4HcW0Fu5U9UiaPn4b4.cache +1 -0
  139. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/kG/kG0KlJGmHu0kwLwZDKon08APGF3Z3GpbRt6BuyKJUf4.cache +0 -0
  140. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/kG/kGyYNYLbPlxoTk3K-8slRw-fuDznBFYnl-0y2jK6_cI.cache +0 -0
  141. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lS/lStvx9Beg2l4s8L-QdTSKuc5_qQPQAZPnIcRI7JkpPE.cache +4 -1
  142. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/m9/m9S3GxTAovnGptmIbSxuSLVFWJCND5v6jetYN2IsHMQ.cache +1 -0
  143. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/mJ/mJ-X19ke9W8_XFBJqqn9Hd4LZNsntZzZjcGZUyStW3s.cache +1 -0
  144. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/n_/n_xYqQYhwEMQknb3jFQnjlxxBE9TzMNHCdJ-bEyZFIw.cache +0 -0
  145. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/nx/nxTv3sKVUQZADJyM3dPaVmUA78MIsMLD_K279yN_GsI.cache +0 -0
  146. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pM/pM_tvcMleZAXoskYgAVEJ8IPTDCzNUrpHakxVWTZPNQ.cache +2 -0
  147. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pt/ptleYqvprORReM2iFj-HW9O98Nhoy5qCF4iUWwtyve0.cache +0 -0
  148. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/q6/q6VE6KTZtyGRe8Cuj9izRDMuieCcGKOKzBUH2niWYpc.cache +2 -0
  149. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/q_/q_IgK4QolU1_5AK7pudGtHR2hiob-XkEZIMUgZY_iFM.cache +1 -0
  150. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qj/qjq5Ug3S2i5pydfGSIfUa7Y0s8s0FwqXzt0kkFijToI.cache +2 -0
  151. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/rd/rd8rR4dvQJUvFyyzVHdNbHilCTfHWlGn6kEU65JL2Fw.cache +1 -0
  152. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/rx/rxqqFB2TXY1MQjq34u1hkkJgqenfyj2ZbYVtb2wEDvc.cache +1 -0
  153. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/sa/sab7V2jcUIn2nRakbXijIbvYmHyOOf6ShENXDRtYP1w.cache +1 -0
  154. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/sr/sr3hnK_P9HaS68zSw0GLhpPzpgEs9shxEe6J7ktfbcw.cache +1 -0
  155. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/u_/u_y6q_eS56FrB6fbIcFt49Tw9exxHbWGGb9puLTTcnk.cache +3 -0
  156. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ub/ubraBOWW9z9uvIXTsIrgJ3kzPboMmsZcyeNsv7sMCnU.cache +1 -0
  157. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wi/win_v0ZNu-l7AoRx8w3ls1xcy0mUExLBVMCSr5oaJFc.cache +0 -0
  158. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xH/xHr1kqSt7XnOPWH1LDZY1-0rIpwoT4OM4g68Ts3A9a4.cache +1 -0
  159. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/yM/yMJd-lz8flnlwt-j5DOGjhykEGnynSCv4I2YKpPfr0Y.cache +1 -0
  160. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ys/ysn-zAA7CKGovpmCCejFwdSLV3RlH13Nc4cwac7BwL4.cache +0 -0
  161. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zT/zTQBjN2k1ltsiVOSJb4mqUhl4FvLQDM6cFRUtQLQ6Qw.cache +1 -0
  162. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zq/zqVwwFUvXqTxyX57DFJh5CY88HR0PEznhr-rLP6A5BQ.cache +2 -0
  163. data/spec/dummy/tmp/development_secret.txt +1 -0
  164. data/spec/examples.txt +19 -0
  165. data/spec/feature_spec_helper.rb +44 -0
  166. data/spec/features/nulogy_sso/sso_login_spec.rb +112 -0
  167. data/spec/integration/services/nulogy_sso/authenticator_spec.rb +95 -0
  168. data/spec/rails_helper.rb +28 -0
  169. data/spec/spec_helper.rb +43 -0
  170. data/spec/support/mock_auth0_verifier.rb +27 -0
  171. metadata +517 -0
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "curb"
4
+ require "nulogy_sso/test_utilities/test_helper"
5
+
6
+ module NulogySSO
7
+ module TestUtilities
8
+
9
+ # This provides a simple mock implementation of Auth0 endpoints, via mockserver
10
+ class AuthMock
11
+ def initialize
12
+ @test_helper = NulogySSO::TestUtilities::TestHelper.new
13
+ end
14
+
15
+ def setup_jwks
16
+ mockserver_expectation(
17
+ httpRequest: {
18
+ method: "GET",
19
+ path: "/.well-known/jwks.json"
20
+ },
21
+ httpResponse: {
22
+ body: jwks_json
23
+ }
24
+ )
25
+ end
26
+
27
+ def setup(email:, redirect_path: "", status_code: 200)
28
+ mockserver_reset
29
+
30
+ redirect_query_params = {
31
+ code: "FAKE_CODE",
32
+ origin: "#{capybara_current_host}#{redirect_path}"
33
+ }.to_query
34
+ mockserver_expectation(
35
+ httpRequest: {
36
+ method: "GET",
37
+ path: "/authorize"
38
+ },
39
+ httpResponse: {
40
+ statusCode: 302,
41
+ headers: {
42
+ Location: ["#{capybara_current_host}/nulogy_sso/code?#{redirect_query_params}"]
43
+ }
44
+ }
45
+ )
46
+
47
+ setup_jwks
48
+
49
+ mockserver_expectation(
50
+ httpRequest: {
51
+ method: "POST",
52
+ path: "/oauth/token"
53
+ },
54
+ httpResponse: {
55
+ statusCode: status_code,
56
+ body: signed_jwt_response(email)
57
+ }
58
+ )
59
+ end
60
+
61
+ def signed_jwt_response(email, overrides = {})
62
+ jwt = test_helper.jwt(email, overrides)
63
+
64
+ { access_token: jwt }.to_json
65
+ end
66
+
67
+ def mockserver_reset
68
+ Curl.put(mockserver_url("reset"))
69
+ end
70
+
71
+ def jwks_json
72
+ jwks = JSON::JWK::Set.new(test_helper.jwk)
73
+ jwks.to_json
74
+ end
75
+
76
+ private
77
+
78
+ attr_reader :test_helper
79
+ delegate :private_key, to: :test_helper
80
+
81
+ def mockserver_expectation(body)
82
+ Curl.put(mockserver_url("expectation"), body.to_json)
83
+ end
84
+
85
+ def mockserver_url(path = "")
86
+ "#{ENV.fetch("NULOGY_SSO_MOCKSERVER_HOST")}:#{ENV.fetch("NULOGY_SSO_MOCKSERVER_PORT")}/mockserver/#{path}"
87
+ end
88
+
89
+ def capybara_current_host
90
+ @capybara_current_host ||= "http://#{Capybara.current_session.server.host}:#{Capybara.current_session.server.port}"
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,52 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ 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
51
+ wJvfOr0zp/tNjtPVEG5yl+LyxW3Nbv9P
52
+ -----END PRIVATE KEY-----
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json/jwt"
4
+
5
+ module NulogySSO
6
+ module TestUtilities
7
+
8
+ # Utilities that are useful for tests on projects using nulogy_sso
9
+ class TestHelper
10
+ def initialize
11
+ @private_key = OpenSSL::PKey::RSA.new(
12
+ File.read(File.expand_path("key.pem", __dir__))
13
+ )
14
+ @public_key = private_key.public_key
15
+ end
16
+
17
+ attr_reader :private_key, :public_key
18
+
19
+ def jwt(email, overrides = {})
20
+ claim = {
21
+ NulogySSO::JWT_EMAIL_KEY => email,
22
+ "iss" => "#{NulogySSO.auth_config.base_uri}/",
23
+ "sub" => "MOCK",
24
+ "aud" => [NulogySSO.auth_config.audience],
25
+ "exp" => (Time.now + 1.day).to_i
26
+ }.merge(overrides)
27
+
28
+ jwt = JSON::JWT.new(claim)
29
+ jwt.header[:kid] = jwk["kid"]
30
+ jwt = jwt.sign(private_key, :RS256)
31
+ jwt.to_s
32
+ end
33
+
34
+ def jwk
35
+ base_jwk_params = public_key.to_jwk.to_h
36
+ JSON::JWK.new(
37
+ base_jwk_params.merge(
38
+ x5t: base_jwk_params["kid"],
39
+ alg: "RS256",
40
+ use: "sig",
41
+ x5c: [certificate_der]
42
+ )
43
+ )
44
+ end
45
+
46
+ private
47
+
48
+ def certificate_der
49
+ Base64.encode64(
50
+ File.read(File.expand_path("cert.der", __dir__))
51
+ ).gsub(/\n/, "")
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,3 @@
1
+ module NulogySSO
2
+ VERSION = "0.2.0"
3
+ end
data/lib/nulogy_sso.rb ADDED
@@ -0,0 +1,39 @@
1
+ require "nulogy_sso/engine"
2
+ require "nulogy_sso/controller_helper"
3
+ require "immutable-struct"
4
+
5
+ module NulogySSO
6
+ # Config variables for the engine
7
+ mattr_accessor :auth_config, :find_user_by_email, :validate_user
8
+
9
+ # Public Constants
10
+ JWT_EMAIL_KEY = "https://nulogy.net/email"
11
+
12
+ def self.auth_config=(auth_config_hash)
13
+ raise "auth_config must be a Hash" unless auth_config_hash.is_a? Hash
14
+
15
+ missing_keys = REQUIRED_AUTH_CONFIG_KEYS - auth_config_hash.symbolize_keys.keys
16
+ if missing_keys.present?
17
+ raise "Missing required auth_config keys ['#{missing_keys.join("', '")}']"
18
+ end
19
+
20
+ @@auth_config = AuthConfig.new(**auth_config_hash.symbolize_keys)
21
+ end
22
+
23
+ REQUIRED_AUTH_CONFIG_KEYS = %i[
24
+ audience
25
+ base_uri
26
+ client_id
27
+ client_secret
28
+ cookie_prefix
29
+ login_uri
30
+ redirect_uri
31
+ ]
32
+ private_constant :REQUIRED_AUTH_CONFIG_KEYS
33
+
34
+ AuthConfig = ImmutableStruct.new(*REQUIRED_AUTH_CONFIG_KEYS)
35
+
36
+ def self.auth_cookie_key
37
+ "#{auth_config.cookie_prefix}_access_token"
38
+ end
39
+ end
@@ -0,0 +1,6 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+ require_relative 'config/application'
5
+
6
+ Rails.application.load_tasks
@@ -0,0 +1,3 @@
1
+ //= link_tree ../images
2
+ //= link_directory ../stylesheets .css
3
+ //= link nulogy_sso_manifest.js
@@ -0,0 +1,15 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file. JavaScript code in this file should be added after the last require_* statement.
9
+ //
10
+ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require rails-ujs
14
+ //= require activestorage
15
+ //= require_tree .
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,4 @@
1
+ module ApplicationCable
2
+ class Channel < ActionCable::Channel::Base
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module ApplicationCable
2
+ class Connection < ActionCable::Connection::Base
3
+ end
4
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This controller is essential for running Capybara feature tests against the NulogySSO engine
4
+ class ApplicationController < ActionController::Base
5
+ include NulogySSO::ControllerHelper
6
+
7
+ before_action :authenticate_sso_user
8
+
9
+ def hello_world
10
+ render plain: "Hello World"
11
+ end
12
+ end
@@ -0,0 +1,2 @@
1
+ module ApplicationHelper
2
+ end
@@ -0,0 +1,2 @@
1
+ class ApplicationJob < ActiveJob::Base
2
+ end
@@ -0,0 +1,3 @@
1
+ class ApplicationRecord < ActiveRecord::Base
2
+ self.abstract_class = true
3
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Necessary for Capybara testing
4
+ class User < ApplicationRecord
5
+ end
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Dummy</title>
5
+ <%= csrf_meta_tags %>
6
+ <%= csp_meta_tag %>
7
+
8
+ <%= stylesheet_link_tag 'application', media: 'all' %>
9
+ </head>
10
+
11
+ <body>
12
+ <%= yield %>
13
+ </body>
14
+ </html>
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
3
+ load Gem.bin_path('bundler', 'bundle')
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ APP_PATH = File.expand_path('../config/application', __dir__)
3
+ require_relative '../config/boot'
4
+ require 'rails/commands'
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative '../config/boot'
3
+ require 'rake'
4
+ Rake.application.run
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env ruby
2
+ require 'fileutils'
3
+ include FileUtils
4
+
5
+ # path to your application root.
6
+ APP_ROOT = File.expand_path('..', __dir__)
7
+
8
+ def system!(*args)
9
+ system(*args) || abort("\n== Command #{args} failed ==")
10
+ end
11
+
12
+ chdir APP_ROOT do
13
+ # This script is a starting point to setup your application.
14
+ # Add necessary setup steps to this file.
15
+
16
+ puts '== Installing dependencies =='
17
+ system! 'gem install bundler --conservative'
18
+ system('bundle check') || system!('bundle install')
19
+
20
+ # Install JavaScript dependencies if using Yarn
21
+ # system('bin/yarn')
22
+
23
+ # puts "\n== Copying sample files =="
24
+ # unless File.exist?('config/database.yml')
25
+ # cp 'config/database.yml.sample', 'config/database.yml'
26
+ # end
27
+
28
+ puts "\n== Preparing database =="
29
+ system! 'bin/rails db:setup'
30
+
31
+ puts "\n== Removing old logs and tempfiles =="
32
+ system! 'bin/rails log:clear tmp:clear'
33
+
34
+ puts "\n== Restarting application server =="
35
+ system! 'bin/rails restart'
36
+ end
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env ruby
2
+ require 'fileutils'
3
+ include FileUtils
4
+
5
+ # path to your application root.
6
+ APP_ROOT = File.expand_path('..', __dir__)
7
+
8
+ def system!(*args)
9
+ system(*args) || abort("\n== Command #{args} failed ==")
10
+ end
11
+
12
+ chdir APP_ROOT do
13
+ # This script is a way to update your development environment automatically.
14
+ # Add necessary update steps to this file.
15
+
16
+ puts '== Installing dependencies =='
17
+ system! 'gem install bundler --conservative'
18
+ system('bundle check') || system!('bundle install')
19
+
20
+ # Install JavaScript dependencies if using Yarn
21
+ # system('bin/yarn')
22
+
23
+ puts "\n== Updating database =="
24
+ system! 'bin/rails db:migrate'
25
+
26
+ puts "\n== Removing old logs and tempfiles =="
27
+ system! 'bin/rails log:clear tmp:clear'
28
+
29
+ puts "\n== Restarting application server =="
30
+ system! 'bin/rails restart'
31
+ end
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path('..', __dir__)
3
+ Dir.chdir(APP_ROOT) do
4
+ begin
5
+ exec "yarnpkg", *ARGV
6
+ rescue Errno::ENOENT
7
+ $stderr.puts "Yarn executable was not detected in the system."
8
+ $stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install"
9
+ exit 1
10
+ end
11
+ end
@@ -0,0 +1,41 @@
1
+ require_relative "boot"
2
+
3
+ require "rails"
4
+ # Pick the frameworks you want:
5
+ require "active_model/railtie"
6
+ require "active_job/railtie"
7
+ require "active_record/railtie"
8
+ require "active_storage/engine"
9
+ require "action_controller/railtie"
10
+ # require "action_mailer/railtie"
11
+ require "action_view/railtie"
12
+ require "action_cable/engine"
13
+ require "sprockets/railtie"
14
+ # require "rails/test_unit/railtie"
15
+
16
+ Bundler.require(*Rails.groups)
17
+
18
+ # Manual loading of dotenv is necessary
19
+ require "dotenv/rails"
20
+ Dotenv::Railtie.load
21
+
22
+ require "nulogy_sso"
23
+
24
+ module Dummy
25
+ class Application < Rails::Application
26
+ # Initialize configuration defaults for originally generated Rails version.
27
+ config.load_defaults 5.2
28
+
29
+ # Settings in config/environments/* take precedence over those specified here.
30
+ # Application configuration can go into files in config/initializers
31
+ # -- all .rb files in that directory are automatically loaded after loading
32
+ # the framework and any gems in your application.
33
+
34
+ # Load required NulogySSO config so that the dummy can boot up without error.
35
+ # These functions are based on the dummy app User class, mostly used for testing.
36
+ NulogySSO.auth_config = config_for(:auth_sso)
37
+ NulogySSO.find_user_by_email = ->(email) { User.find_by(email: email) }
38
+ NulogySSO.validate_user = ->(user) { user.active? }
39
+ end
40
+ end
41
+
@@ -0,0 +1,20 @@
1
+ # A default YAML config for the purpose of booting up the dummy without error
2
+ default: &default
3
+ audience: mock_audience
4
+ base_uri: mock_base_uri
5
+ client_id: mock_client_id
6
+ client_secret: mock_client_secret
7
+ cookie_prefix: mock_cookie_prefix
8
+ login_uri: mock_login_uri
9
+ redirect_uri: mock_redirect_uri
10
+
11
+ development:
12
+ <<: *default
13
+
14
+ test:
15
+ <<: *default
16
+ # Points to mockserver as the Auth0 base URI
17
+ base_uri: http://localhost:1080
18
+
19
+ production:
20
+ <<: *default
@@ -0,0 +1,5 @@
1
+ # Set up gems listed in the Gemfile.
2
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../../Gemfile", __dir__)
3
+
4
+ require "bundler/setup" if File.exist?(ENV["BUNDLE_GEMFILE"])
5
+ $LOAD_PATH.unshift File.expand_path("../../../lib", __dir__)
@@ -0,0 +1,10 @@
1
+ development:
2
+ adapter: async
3
+
4
+ test:
5
+ adapter: async
6
+
7
+ production:
8
+ adapter: redis
9
+ url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %>
10
+ channel_prefix: dummy_production
@@ -0,0 +1,25 @@
1
+ # SQLite version 3.x
2
+ # gem install sqlite3
3
+ #
4
+ # Ensure the SQLite 3 gem is defined in your Gemfile
5
+ # gem 'sqlite3'
6
+ #
7
+ default: &default
8
+ adapter: sqlite3
9
+ pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
10
+ timeout: 5000
11
+
12
+ development:
13
+ <<: *default
14
+ database: db/development.sqlite3
15
+
16
+ # Warning: The database defined as "test" will be erased and
17
+ # re-generated from your development database when you run "rake".
18
+ # Do not set this db to the same as development or production.
19
+ test:
20
+ <<: *default
21
+ database: db/test.sqlite3
22
+
23
+ production:
24
+ <<: *default
25
+ database: db/production.sqlite3
@@ -0,0 +1,5 @@
1
+ # Load the Rails application.
2
+ require_relative "application"
3
+
4
+ # Initialize the Rails application.
5
+ Rails.application.initialize!
@@ -0,0 +1,49 @@
1
+ Rails.application.configure do
2
+ # Settings specified here will take precedence over those in config/application.rb.
3
+
4
+ # In the development environment your application"s code is reloaded on
5
+ # every request. This slows down response time but is perfect for development
6
+ # since you don"t have to restart the web server when you make code changes.
7
+ config.cache_classes = false
8
+
9
+ # Do not eager load code on boot.
10
+ config.eager_load = false
11
+
12
+ # Show full error reports.
13
+ config.consider_all_requests_local = true
14
+
15
+ # Enable/disable caching. By default caching is disabled.
16
+ # Run rails dev:cache to toggle caching.
17
+ if Rails.root.join("tmp", "caching-dev.txt").exist?
18
+ config.action_controller.perform_caching = true
19
+
20
+ config.cache_store = :memory_store
21
+ config.public_file_server.headers = {
22
+ "Cache-Control" => "public, max-age=#{2.days.to_i}"
23
+ }
24
+ else
25
+ config.action_controller.perform_caching = false
26
+
27
+ config.cache_store = :null_store
28
+ end
29
+
30
+ # Store uploaded files on the local file system (see config/storage.yml for options)
31
+ config.active_storage.service = :local
32
+
33
+ # Print deprecation notices to the Rails logger.
34
+ config.active_support.deprecation = :log
35
+
36
+ # Raise an error on page load if there are pending migrations.
37
+ config.active_record.migration_error = :page_load
38
+
39
+ # Highlight code that triggered database queries in logs.
40
+ config.active_record.verbose_query_logs = true
41
+
42
+
43
+ # Raises error for missing translations
44
+ # config.action_view.raise_on_missing_translations = true
45
+
46
+ # Use an evented file watcher to asynchronously detect changes in source code,
47
+ # routes, locales, etc. This feature depends on the listen gem.
48
+ # config.file_watcher = ActiveSupport::EventedFileUpdateChecker
49
+ end