@civic/auth 0.3.2-beta.2 → 0.3.2-beta.4

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 (484) hide show
  1. package/dist/cjs/nextjs/config.d.ts +1 -0
  2. package/dist/cjs/nextjs/config.d.ts.map +1 -1
  3. package/dist/cjs/nextjs/config.js +10 -2
  4. package/dist/cjs/nextjs/config.js.map +1 -1
  5. package/dist/cjs/shared/version.d.ts +1 -1
  6. package/dist/cjs/shared/version.js +1 -1
  7. package/dist/cjs/shared/version.js.map +1 -1
  8. package/dist/esm/nextjs/config.d.ts +1 -0
  9. package/dist/esm/nextjs/config.d.ts.map +1 -1
  10. package/dist/esm/nextjs/config.js +10 -2
  11. package/dist/esm/nextjs/config.js.map +1 -1
  12. package/dist/esm/shared/version.d.ts +1 -1
  13. package/dist/esm/shared/version.js +1 -1
  14. package/dist/esm/shared/version.js.map +1 -1
  15. package/dist/generateVersion.d.ts +2 -0
  16. package/dist/generateVersion.d.ts.map +1 -0
  17. package/dist/generateVersion.js +12 -0
  18. package/dist/generateVersion.js.map +1 -0
  19. package/dist/package.json +118 -0
  20. package/dist/src/browser/storage.d.ts +9 -0
  21. package/dist/src/browser/storage.d.ts.map +1 -0
  22. package/dist/src/browser/storage.js +17 -0
  23. package/dist/src/browser/storage.js.map +1 -0
  24. package/dist/src/config.d.ts +3 -0
  25. package/dist/src/config.d.ts.map +1 -0
  26. package/dist/src/config.js +5 -0
  27. package/dist/src/config.js.map +1 -0
  28. package/dist/src/constants.d.ts +8 -0
  29. package/dist/src/constants.d.ts.map +1 -0
  30. package/dist/src/constants.js +16 -0
  31. package/dist/src/constants.js.map +1 -0
  32. package/dist/src/index.d.ts +6 -0
  33. package/dist/src/index.d.ts.map +1 -0
  34. package/dist/src/index.js +4 -0
  35. package/dist/src/index.js.map +1 -0
  36. package/dist/src/lib/cookies.d.ts +7 -0
  37. package/dist/src/lib/cookies.d.ts.map +1 -0
  38. package/dist/src/lib/cookies.js +25 -0
  39. package/dist/src/lib/cookies.js.map +1 -0
  40. package/dist/src/lib/jwt.d.ts +3 -0
  41. package/dist/src/lib/jwt.d.ts.map +1 -0
  42. package/dist/src/lib/jwt.js +9 -0
  43. package/dist/src/lib/jwt.js.map +1 -0
  44. package/dist/src/lib/logger.d.ts +26 -0
  45. package/dist/src/lib/logger.d.ts.map +1 -0
  46. package/dist/src/lib/logger.js +55 -0
  47. package/dist/src/lib/logger.js.map +1 -0
  48. package/dist/src/lib/oauth.d.ts +19 -0
  49. package/dist/src/lib/oauth.d.ts.map +1 -0
  50. package/dist/src/lib/oauth.js +61 -0
  51. package/dist/src/lib/oauth.js.map +1 -0
  52. package/dist/src/lib/obj.d.ts +3 -0
  53. package/dist/src/lib/obj.d.ts.map +1 -0
  54. package/dist/src/lib/obj.js +18 -0
  55. package/dist/src/lib/obj.js.map +1 -0
  56. package/dist/src/lib/postMessage.d.ts +4 -0
  57. package/dist/src/lib/postMessage.d.ts.map +1 -0
  58. package/dist/src/lib/postMessage.js +15 -0
  59. package/dist/src/lib/postMessage.js.map +1 -0
  60. package/dist/src/lib/windowUtil.d.ts +4 -0
  61. package/dist/src/lib/windowUtil.d.ts.map +1 -0
  62. package/dist/src/lib/windowUtil.js +31 -0
  63. package/dist/src/lib/windowUtil.js.map +1 -0
  64. package/dist/src/nextjs/GetUser.d.ts +6 -0
  65. package/dist/src/nextjs/GetUser.d.ts.map +1 -0
  66. package/dist/src/nextjs/GetUser.js +7 -0
  67. package/dist/src/nextjs/GetUser.js.map +1 -0
  68. package/dist/src/nextjs/config.d.ts +181 -0
  69. package/dist/src/nextjs/config.d.ts.map +1 -0
  70. package/dist/src/nextjs/config.js +177 -0
  71. package/dist/src/nextjs/config.js.map +1 -0
  72. package/dist/src/nextjs/cookies.d.ts +30 -0
  73. package/dist/src/nextjs/cookies.d.ts.map +1 -0
  74. package/dist/src/nextjs/cookies.js +112 -0
  75. package/dist/src/nextjs/cookies.js.map +1 -0
  76. package/dist/src/nextjs/hooks/index.d.ts +2 -0
  77. package/dist/src/nextjs/hooks/index.d.ts.map +1 -0
  78. package/dist/src/nextjs/hooks/index.js +2 -0
  79. package/dist/src/nextjs/hooks/index.js.map +1 -0
  80. package/dist/src/nextjs/hooks/usePrevious.d.ts +2 -0
  81. package/dist/src/nextjs/hooks/usePrevious.d.ts.map +1 -0
  82. package/dist/src/nextjs/hooks/usePrevious.js +9 -0
  83. package/dist/src/nextjs/hooks/usePrevious.js.map +1 -0
  84. package/dist/src/nextjs/hooks/useUserCookie.d.ts +8 -0
  85. package/dist/src/nextjs/hooks/useUserCookie.d.ts.map +1 -0
  86. package/dist/src/nextjs/hooks/useUserCookie.js +88 -0
  87. package/dist/src/nextjs/hooks/useUserCookie.js.map +1 -0
  88. package/dist/src/nextjs/index.d.ts +7 -0
  89. package/dist/src/nextjs/index.d.ts.map +1 -0
  90. package/dist/src/nextjs/index.js +8 -0
  91. package/dist/src/nextjs/index.js.map +1 -0
  92. package/dist/src/nextjs/middleware/index.d.ts +2 -0
  93. package/dist/src/nextjs/middleware/index.d.ts.map +1 -0
  94. package/dist/src/nextjs/middleware/index.js +4 -0
  95. package/dist/src/nextjs/middleware/index.js.map +1 -0
  96. package/dist/src/nextjs/middleware.d.ts +59 -0
  97. package/dist/src/nextjs/middleware.d.ts.map +1 -0
  98. package/dist/src/nextjs/middleware.js +107 -0
  99. package/dist/src/nextjs/middleware.js.map +1 -0
  100. package/dist/src/nextjs/providers/NextAuthProvider.d.ts +13 -0
  101. package/dist/src/nextjs/providers/NextAuthProvider.d.ts.map +1 -0
  102. package/dist/src/nextjs/providers/NextAuthProvider.js +94 -0
  103. package/dist/src/nextjs/providers/NextAuthProvider.js.map +1 -0
  104. package/dist/src/nextjs/routeHandler.d.ts +19 -0
  105. package/dist/src/nextjs/routeHandler.d.ts.map +1 -0
  106. package/dist/src/nextjs/routeHandler.js +309 -0
  107. package/dist/src/nextjs/routeHandler.js.map +1 -0
  108. package/dist/src/nextjs/utils.d.ts +3 -0
  109. package/dist/src/nextjs/utils.d.ts.map +1 -0
  110. package/dist/src/nextjs/utils.js +5 -0
  111. package/dist/src/nextjs/utils.js.map +1 -0
  112. package/dist/src/reactjs/components/SignInButton.d.ts +8 -0
  113. package/dist/src/reactjs/components/SignInButton.d.ts.map +1 -0
  114. package/dist/src/reactjs/components/SignInButton.js +14 -0
  115. package/dist/src/reactjs/components/SignInButton.js.map +1 -0
  116. package/dist/src/reactjs/components/SignOutButton.d.ts +6 -0
  117. package/dist/src/reactjs/components/SignOutButton.d.ts.map +1 -0
  118. package/dist/src/reactjs/components/SignOutButton.js +14 -0
  119. package/dist/src/reactjs/components/SignOutButton.js.map +1 -0
  120. package/dist/src/reactjs/components/UserButton.d.ts +6 -0
  121. package/dist/src/reactjs/components/UserButton.d.ts.map +1 -0
  122. package/dist/src/reactjs/components/UserButton.js +118 -0
  123. package/dist/src/reactjs/components/UserButton.js.map +1 -0
  124. package/dist/src/reactjs/components/index.d.ts +6 -0
  125. package/dist/src/reactjs/components/index.d.ts.map +1 -0
  126. package/dist/src/reactjs/components/index.js +6 -0
  127. package/dist/src/reactjs/components/index.js.map +1 -0
  128. package/dist/src/reactjs/hooks/index.d.ts +6 -0
  129. package/dist/src/reactjs/hooks/index.d.ts.map +1 -0
  130. package/dist/src/reactjs/hooks/index.js +6 -0
  131. package/dist/src/reactjs/hooks/index.js.map +1 -0
  132. package/dist/src/reactjs/hooks/useAuth.d.ts +3 -0
  133. package/dist/src/reactjs/hooks/useAuth.d.ts.map +1 -0
  134. package/dist/src/reactjs/hooks/useAuth.js +12 -0
  135. package/dist/src/reactjs/hooks/useAuth.js.map +1 -0
  136. package/dist/src/reactjs/hooks/useClientTokenExchangeSession.d.ts +3 -0
  137. package/dist/src/reactjs/hooks/useClientTokenExchangeSession.d.ts.map +1 -0
  138. package/dist/src/reactjs/hooks/useClientTokenExchangeSession.js +13 -0
  139. package/dist/src/reactjs/hooks/useClientTokenExchangeSession.js.map +1 -0
  140. package/dist/src/reactjs/hooks/useUser.d.ts +4 -0
  141. package/dist/src/reactjs/hooks/useUser.d.ts.map +1 -0
  142. package/dist/src/reactjs/hooks/useUser.js +12 -0
  143. package/dist/src/reactjs/hooks/useUser.js.map +1 -0
  144. package/dist/src/reactjs/index.d.ts +6 -0
  145. package/dist/src/reactjs/index.d.ts.map +1 -0
  146. package/dist/src/reactjs/index.js +10 -0
  147. package/dist/src/reactjs/index.js.map +1 -0
  148. package/dist/src/reactjs/providers/AuthProvider.d.ts +11 -0
  149. package/dist/src/reactjs/providers/AuthProvider.d.ts.map +1 -0
  150. package/dist/src/reactjs/providers/AuthProvider.js +76 -0
  151. package/dist/src/reactjs/providers/AuthProvider.js.map +1 -0
  152. package/dist/src/reactjs/providers/CivicAuthProvider.d.ts +6 -0
  153. package/dist/src/reactjs/providers/CivicAuthProvider.d.ts.map +1 -0
  154. package/dist/src/reactjs/providers/CivicAuthProvider.js +32 -0
  155. package/dist/src/reactjs/providers/CivicAuthProvider.js.map +1 -0
  156. package/dist/src/reactjs/providers/ClientTokenExchangeSessionProvider.d.ts +17 -0
  157. package/dist/src/reactjs/providers/ClientTokenExchangeSessionProvider.d.ts.map +1 -0
  158. package/dist/src/reactjs/providers/ClientTokenExchangeSessionProvider.js +148 -0
  159. package/dist/src/reactjs/providers/ClientTokenExchangeSessionProvider.js.map +1 -0
  160. package/dist/src/reactjs/providers/index.d.ts +8 -0
  161. package/dist/src/reactjs/providers/index.d.ts.map +1 -0
  162. package/dist/src/reactjs/providers/index.js +7 -0
  163. package/dist/src/reactjs/providers/index.js.map +1 -0
  164. package/dist/src/server/ServerAuthenticationResolver.d.ts +20 -0
  165. package/dist/src/server/ServerAuthenticationResolver.d.ts.map +1 -0
  166. package/dist/src/server/ServerAuthenticationResolver.js +67 -0
  167. package/dist/src/server/ServerAuthenticationResolver.js.map +1 -0
  168. package/dist/src/server/config.d.ts +10 -0
  169. package/dist/src/server/config.d.ts.map +1 -0
  170. package/dist/src/server/config.js +2 -0
  171. package/dist/src/server/config.js.map +1 -0
  172. package/dist/src/server/index.d.ts +7 -0
  173. package/dist/src/server/index.d.ts.map +1 -0
  174. package/dist/src/server/index.js +7 -0
  175. package/dist/src/server/index.js.map +1 -0
  176. package/dist/src/server/login.d.ts +21 -0
  177. package/dist/src/server/login.d.ts.map +1 -0
  178. package/dist/src/server/login.js +56 -0
  179. package/dist/src/server/login.js.map +1 -0
  180. package/dist/src/server/refresh.d.ts +7 -0
  181. package/dist/src/server/refresh.d.ts.map +1 -0
  182. package/dist/src/server/refresh.js +13 -0
  183. package/dist/src/server/refresh.js.map +1 -0
  184. package/dist/src/services/AuthenticationService.d.ts +91 -0
  185. package/dist/src/services/AuthenticationService.d.ts.map +1 -0
  186. package/dist/src/services/AuthenticationService.js +322 -0
  187. package/dist/src/services/AuthenticationService.js.map +1 -0
  188. package/dist/src/services/PKCE.d.ts +20 -0
  189. package/dist/src/services/PKCE.d.ts.map +1 -0
  190. package/dist/src/services/PKCE.js +44 -0
  191. package/dist/src/services/PKCE.js.map +1 -0
  192. package/dist/src/services/types.d.ts +24 -0
  193. package/dist/src/services/types.d.ts.map +1 -0
  194. package/dist/src/services/types.js +7 -0
  195. package/dist/src/services/types.js.map +1 -0
  196. package/dist/src/shared/components/BlockDisplay.d.ts +7 -0
  197. package/dist/src/shared/components/BlockDisplay.d.ts.map +1 -0
  198. package/dist/src/shared/components/BlockDisplay.js +25 -0
  199. package/dist/src/shared/components/BlockDisplay.js.map +1 -0
  200. package/dist/src/shared/components/CivicAuthIframe.d.ts +9 -0
  201. package/dist/src/shared/components/CivicAuthIframe.d.ts.map +1 -0
  202. package/dist/src/shared/components/CivicAuthIframe.js +8 -0
  203. package/dist/src/shared/components/CivicAuthIframe.js.map +1 -0
  204. package/dist/src/shared/components/CivicAuthIframeContainer.d.ts +13 -0
  205. package/dist/src/shared/components/CivicAuthIframeContainer.d.ts.map +1 -0
  206. package/dist/src/shared/components/CivicAuthIframeContainer.js +138 -0
  207. package/dist/src/shared/components/CivicAuthIframeContainer.js.map +1 -0
  208. package/dist/src/shared/components/CivicAuthLogoutIframeContainer.d.ts +7 -0
  209. package/dist/src/shared/components/CivicAuthLogoutIframeContainer.d.ts.map +1 -0
  210. package/dist/src/shared/components/CivicAuthLogoutIframeContainer.js +22 -0
  211. package/dist/src/shared/components/CivicAuthLogoutIframeContainer.js.map +1 -0
  212. package/dist/src/shared/components/CloseIcon.d.ts +4 -0
  213. package/dist/src/shared/components/CloseIcon.d.ts.map +1 -0
  214. package/dist/src/shared/components/CloseIcon.js +6 -0
  215. package/dist/src/shared/components/CloseIcon.js.map +1 -0
  216. package/dist/src/shared/components/IFrameAndLoading.d.ts +8 -0
  217. package/dist/src/shared/components/IFrameAndLoading.d.ts.map +1 -0
  218. package/dist/src/shared/components/IFrameAndLoading.js +27 -0
  219. package/dist/src/shared/components/IFrameAndLoading.js.map +1 -0
  220. package/dist/src/shared/components/LoadingIcon.d.ts +4 -0
  221. package/dist/src/shared/components/LoadingIcon.d.ts.map +1 -0
  222. package/dist/src/shared/components/LoadingIcon.js +30 -0
  223. package/dist/src/shared/components/LoadingIcon.js.map +1 -0
  224. package/dist/src/shared/hooks/index.d.ts +11 -0
  225. package/dist/src/shared/hooks/index.d.ts.map +1 -0
  226. package/dist/src/shared/hooks/index.js +11 -0
  227. package/dist/src/shared/hooks/index.js.map +1 -0
  228. package/dist/src/shared/hooks/useAuth.d.ts +3 -0
  229. package/dist/src/shared/hooks/useAuth.d.ts.map +1 -0
  230. package/dist/src/shared/hooks/useAuth.js +12 -0
  231. package/dist/src/shared/hooks/useAuth.js.map +1 -0
  232. package/dist/src/shared/hooks/useCivicAuthConfig.d.ts +3 -0
  233. package/dist/src/shared/hooks/useCivicAuthConfig.d.ts.map +1 -0
  234. package/dist/src/shared/hooks/useCivicAuthConfig.js +10 -0
  235. package/dist/src/shared/hooks/useCivicAuthConfig.js.map +1 -0
  236. package/dist/src/shared/hooks/useClientTokenExchangeSession.d.ts +3 -0
  237. package/dist/src/shared/hooks/useClientTokenExchangeSession.d.ts.map +1 -0
  238. package/dist/src/shared/hooks/useClientTokenExchangeSession.js +13 -0
  239. package/dist/src/shared/hooks/useClientTokenExchangeSession.js.map +1 -0
  240. package/dist/src/shared/hooks/useCurrentUrl.d.ts +3 -0
  241. package/dist/src/shared/hooks/useCurrentUrl.d.ts.map +1 -0
  242. package/dist/src/shared/hooks/useCurrentUrl.js +24 -0
  243. package/dist/src/shared/hooks/useCurrentUrl.js.map +1 -0
  244. package/dist/src/shared/hooks/useIframe.d.ts +3 -0
  245. package/dist/src/shared/hooks/useIframe.d.ts.map +1 -0
  246. package/dist/src/shared/hooks/useIframe.js +13 -0
  247. package/dist/src/shared/hooks/useIframe.js.map +1 -0
  248. package/dist/src/shared/hooks/useIsInIframe.d.ts +3 -0
  249. package/dist/src/shared/hooks/useIsInIframe.d.ts.map +1 -0
  250. package/dist/src/shared/hooks/useIsInIframe.js +14 -0
  251. package/dist/src/shared/hooks/useIsInIframe.js.map +1 -0
  252. package/dist/src/shared/hooks/useOAuthEndpoints.d.ts +4 -0
  253. package/dist/src/shared/hooks/useOAuthEndpoints.d.ts.map +1 -0
  254. package/dist/src/shared/hooks/useOAuthEndpoints.js +14 -0
  255. package/dist/src/shared/hooks/useOAuthEndpoints.js.map +1 -0
  256. package/dist/src/shared/hooks/useRefresh.d.ts +4 -0
  257. package/dist/src/shared/hooks/useRefresh.d.ts.map +1 -0
  258. package/dist/src/shared/hooks/useRefresh.js +38 -0
  259. package/dist/src/shared/hooks/useRefresh.js.map +1 -0
  260. package/dist/src/shared/hooks/useSession.d.ts +3 -0
  261. package/dist/src/shared/hooks/useSession.d.ts.map +1 -0
  262. package/dist/src/shared/hooks/useSession.js +13 -0
  263. package/dist/src/shared/hooks/useSession.js.map +1 -0
  264. package/dist/src/shared/hooks/useSignIn.d.ts +15 -0
  265. package/dist/src/shared/hooks/useSignIn.d.ts.map +1 -0
  266. package/dist/src/shared/hooks/useSignIn.js +126 -0
  267. package/dist/src/shared/hooks/useSignIn.js.map +1 -0
  268. package/dist/src/shared/hooks/useToken.d.ts +3 -0
  269. package/dist/src/shared/hooks/useToken.d.ts.map +1 -0
  270. package/dist/src/shared/hooks/useToken.js +12 -0
  271. package/dist/src/shared/hooks/useToken.js.map +1 -0
  272. package/dist/src/shared/hooks/useWindowFocused.d.ts +5 -0
  273. package/dist/src/shared/hooks/useWindowFocused.d.ts.map +1 -0
  274. package/dist/src/shared/hooks/useWindowFocused.js +21 -0
  275. package/dist/src/shared/hooks/useWindowFocused.js.map +1 -0
  276. package/dist/src/shared/index.d.ts +5 -0
  277. package/dist/src/shared/index.d.ts.map +1 -0
  278. package/dist/src/shared/index.js +16 -0
  279. package/dist/src/shared/index.js.map +1 -0
  280. package/dist/src/shared/lib/GenericAuthenticationRefresher.d.ts +20 -0
  281. package/dist/src/shared/lib/GenericAuthenticationRefresher.d.ts.map +1 -0
  282. package/dist/src/shared/lib/GenericAuthenticationRefresher.js +73 -0
  283. package/dist/src/shared/lib/GenericAuthenticationRefresher.js.map +1 -0
  284. package/dist/src/shared/lib/UserSession.d.ts +12 -0
  285. package/dist/src/shared/lib/UserSession.d.ts.map +1 -0
  286. package/dist/src/shared/lib/UserSession.js +20 -0
  287. package/dist/src/shared/lib/UserSession.js.map +1 -0
  288. package/dist/src/shared/lib/session.d.ts +3 -0
  289. package/dist/src/shared/lib/session.d.ts.map +1 -0
  290. package/dist/src/shared/lib/session.js +21 -0
  291. package/dist/src/shared/lib/session.js.map +1 -0
  292. package/dist/src/shared/lib/storage.d.ts +25 -0
  293. package/dist/src/shared/lib/storage.d.ts.map +1 -0
  294. package/dist/src/shared/lib/storage.js +17 -0
  295. package/dist/src/shared/lib/storage.js.map +1 -0
  296. package/dist/src/shared/lib/types.d.ts +36 -0
  297. package/dist/src/shared/lib/types.d.ts.map +1 -0
  298. package/dist/src/shared/lib/types.js +18 -0
  299. package/dist/src/shared/lib/types.js.map +1 -0
  300. package/dist/src/shared/lib/util.d.ts +34 -0
  301. package/dist/src/shared/lib/util.d.ts.map +1 -0
  302. package/dist/src/shared/lib/util.js +137 -0
  303. package/dist/src/shared/lib/util.js.map +1 -0
  304. package/dist/src/shared/providers/AuthContext.d.ts +11 -0
  305. package/dist/src/shared/providers/AuthContext.d.ts.map +1 -0
  306. package/dist/src/shared/providers/AuthContext.js +3 -0
  307. package/dist/src/shared/providers/AuthContext.js.map +1 -0
  308. package/dist/src/shared/providers/AuthProvider.d.ts +22 -0
  309. package/dist/src/shared/providers/AuthProvider.d.ts.map +1 -0
  310. package/dist/src/shared/providers/AuthProvider.js +72 -0
  311. package/dist/src/shared/providers/AuthProvider.js.map +1 -0
  312. package/dist/src/shared/providers/CivicAuthConfigContext.d.ts +18 -0
  313. package/dist/src/shared/providers/CivicAuthConfigContext.d.ts.map +1 -0
  314. package/dist/src/shared/providers/CivicAuthConfigContext.js +52 -0
  315. package/dist/src/shared/providers/CivicAuthConfigContext.js.map +1 -0
  316. package/dist/src/shared/providers/CivicAuthProvider.d.ts +6 -0
  317. package/dist/src/shared/providers/CivicAuthProvider.d.ts.map +1 -0
  318. package/dist/src/shared/providers/CivicAuthProvider.js +32 -0
  319. package/dist/src/shared/providers/CivicAuthProvider.js.map +1 -0
  320. package/dist/src/shared/providers/ClientTokenExchangeSessionProvider.d.ts +17 -0
  321. package/dist/src/shared/providers/ClientTokenExchangeSessionProvider.d.ts.map +1 -0
  322. package/dist/src/shared/providers/ClientTokenExchangeSessionProvider.js +131 -0
  323. package/dist/src/shared/providers/ClientTokenExchangeSessionProvider.js.map +1 -0
  324. package/dist/src/shared/providers/IframeProvider.d.ts +22 -0
  325. package/dist/src/shared/providers/IframeProvider.d.ts.map +1 -0
  326. package/dist/src/shared/providers/IframeProvider.js +35 -0
  327. package/dist/src/shared/providers/IframeProvider.js.map +1 -0
  328. package/dist/src/shared/providers/SessionProvider.d.ts +19 -0
  329. package/dist/src/shared/providers/SessionProvider.d.ts.map +1 -0
  330. package/dist/src/shared/providers/SessionProvider.js +23 -0
  331. package/dist/src/shared/providers/SessionProvider.js.map +1 -0
  332. package/dist/src/shared/providers/TokenProvider.d.ts +18 -0
  333. package/dist/src/shared/providers/TokenProvider.d.ts.map +1 -0
  334. package/dist/src/shared/providers/TokenProvider.js +42 -0
  335. package/dist/src/shared/providers/TokenProvider.js.map +1 -0
  336. package/dist/src/shared/providers/UserProvider.d.ts +24 -0
  337. package/dist/src/shared/providers/UserProvider.d.ts.map +1 -0
  338. package/dist/src/shared/providers/UserProvider.js +52 -0
  339. package/dist/src/shared/providers/UserProvider.js.map +1 -0
  340. package/dist/src/shared/providers/types.d.ts +15 -0
  341. package/dist/src/shared/providers/types.d.ts.map +1 -0
  342. package/dist/src/shared/providers/types.js +2 -0
  343. package/dist/src/shared/providers/types.js.map +1 -0
  344. package/dist/src/shared/version.d.ts +2 -0
  345. package/dist/src/shared/version.d.ts.map +1 -0
  346. package/dist/src/shared/version.js +3 -0
  347. package/dist/src/shared/version.js.map +1 -0
  348. package/dist/src/types.d.ts +148 -0
  349. package/dist/src/types.d.ts.map +1 -0
  350. package/dist/src/types.js +4 -0
  351. package/dist/src/types.js.map +1 -0
  352. package/dist/src/utils.d.ts +15 -0
  353. package/dist/src/utils.d.ts.map +1 -0
  354. package/dist/src/utils.js +43 -0
  355. package/dist/src/utils.js.map +1 -0
  356. package/dist/src/version.d.ts +2 -0
  357. package/dist/src/version.d.ts.map +1 -0
  358. package/dist/src/version.js +3 -0
  359. package/dist/src/version.js.map +1 -0
  360. package/dist/test/integration/sdk.test.d.ts +2 -0
  361. package/dist/test/integration/sdk.test.d.ts.map +1 -0
  362. package/dist/test/integration/sdk.test.js +237 -0
  363. package/dist/test/integration/sdk.test.js.map +1 -0
  364. package/dist/test/support/fixtures.d.ts +26 -0
  365. package/dist/test/support/fixtures.d.ts.map +1 -0
  366. package/dist/test/support/fixtures.js +55 -0
  367. package/dist/test/support/fixtures.js.map +1 -0
  368. package/dist/test/support/tokens.json +26 -0
  369. package/dist/test/unit/lib/oauth.test.d.ts +2 -0
  370. package/dist/test/unit/lib/oauth.test.d.ts.map +1 -0
  371. package/dist/test/unit/lib/oauth.test.js +56 -0
  372. package/dist/test/unit/lib/oauth.test.js.map +1 -0
  373. package/dist/test/unit/lib/obj.test.d.ts +2 -0
  374. package/dist/test/unit/lib/obj.test.d.ts.map +1 -0
  375. package/dist/test/unit/lib/obj.test.js +37 -0
  376. package/dist/test/unit/lib/obj.test.js.map +1 -0
  377. package/dist/test/unit/logger.test.d.ts +2 -0
  378. package/dist/test/unit/logger.test.d.ts.map +1 -0
  379. package/dist/test/unit/logger.test.js +141 -0
  380. package/dist/test/unit/logger.test.js.map +1 -0
  381. package/dist/test/unit/nextjs/NextAuthProvider.test.d.ts +2 -0
  382. package/dist/test/unit/nextjs/NextAuthProvider.test.d.ts.map +1 -0
  383. package/dist/test/unit/nextjs/NextAuthProvider.test.js +31 -0
  384. package/dist/test/unit/nextjs/NextAuthProvider.test.js.map +1 -0
  385. package/dist/test/unit/nextjs/config.test.d.ts +2 -0
  386. package/dist/test/unit/nextjs/config.test.d.ts.map +1 -0
  387. package/dist/test/unit/nextjs/config.test.js +203 -0
  388. package/dist/test/unit/nextjs/config.test.js.map +1 -0
  389. package/dist/test/unit/nextjs/getUser.test.d.ts +2 -0
  390. package/dist/test/unit/nextjs/getUser.test.d.ts.map +1 -0
  391. package/dist/test/unit/nextjs/getUser.test.js +22 -0
  392. package/dist/test/unit/nextjs/getUser.test.js.map +1 -0
  393. package/dist/test/unit/nextjs/handler.test.d.ts +2 -0
  394. package/dist/test/unit/nextjs/handler.test.d.ts.map +1 -0
  395. package/dist/test/unit/nextjs/handler.test.js +207 -0
  396. package/dist/test/unit/nextjs/handler.test.js.map +1 -0
  397. package/dist/test/unit/nextjs/middleware.test.d.ts +2 -0
  398. package/dist/test/unit/nextjs/middleware.test.d.ts.map +1 -0
  399. package/dist/test/unit/nextjs/middleware.test.js +113 -0
  400. package/dist/test/unit/nextjs/middleware.test.js.map +1 -0
  401. package/dist/test/unit/nextjs/utils.test.d.ts +2 -0
  402. package/dist/test/unit/nextjs/utils.test.d.ts.map +1 -0
  403. package/dist/test/unit/nextjs/utils.test.js +13 -0
  404. package/dist/test/unit/nextjs/utils.test.js.map +1 -0
  405. package/dist/test/unit/publicApi/apiSnapshot.test.d.ts +2 -0
  406. package/dist/test/unit/publicApi/apiSnapshot.test.d.ts.map +1 -0
  407. package/dist/test/unit/publicApi/apiSnapshot.test.js +10 -0
  408. package/dist/test/unit/publicApi/apiSnapshot.test.js.map +1 -0
  409. package/dist/test/unit/react/components/SignInButton.test.d.ts +2 -0
  410. package/dist/test/unit/react/components/SignInButton.test.d.ts.map +1 -0
  411. package/dist/test/unit/react/components/SignInButton.test.js +31 -0
  412. package/dist/test/unit/react/components/SignInButton.test.js.map +1 -0
  413. package/dist/test/unit/react/components/SignOutButton.test.d.ts +2 -0
  414. package/dist/test/unit/react/components/SignOutButton.test.d.ts.map +1 -0
  415. package/dist/test/unit/react/components/SignOutButton.test.js +30 -0
  416. package/dist/test/unit/react/components/SignOutButton.test.js.map +1 -0
  417. package/dist/test/unit/server/login.test.d.ts +2 -0
  418. package/dist/test/unit/server/login.test.d.ts.map +1 -0
  419. package/dist/test/unit/server/login.test.js +184 -0
  420. package/dist/test/unit/server/login.test.js.map +1 -0
  421. package/dist/test/unit/server/refresh.test.d.ts +2 -0
  422. package/dist/test/unit/server/refresh.test.d.ts.map +1 -0
  423. package/dist/test/unit/server/refresh.test.js +55 -0
  424. package/dist/test/unit/server/refresh.test.js.map +1 -0
  425. package/dist/test/unit/server/session.test.d.ts +2 -0
  426. package/dist/test/unit/server/session.test.d.ts.map +1 -0
  427. package/dist/test/unit/server/session.test.js +41 -0
  428. package/dist/test/unit/server/session.test.js.map +1 -0
  429. package/dist/test/unit/services/AuthenticationService.test.d.ts +2 -0
  430. package/dist/test/unit/services/AuthenticationService.test.d.ts.map +1 -0
  431. package/dist/test/unit/services/AuthenticationService.test.js +301 -0
  432. package/dist/test/unit/services/AuthenticationService.test.js.map +1 -0
  433. package/dist/test/unit/services/ServerAuthenticationResolver.test.d.ts +2 -0
  434. package/dist/test/unit/services/ServerAuthenticationResolver.test.d.ts.map +1 -0
  435. package/dist/test/unit/services/ServerAuthenticationResolver.test.js +75 -0
  436. package/dist/test/unit/services/ServerAuthenticationResolver.test.js.map +1 -0
  437. package/dist/test/unit/shared/GenericAuthenticationRefresher.test.d.ts +2 -0
  438. package/dist/test/unit/shared/GenericAuthenticationRefresher.test.d.ts.map +1 -0
  439. package/dist/test/unit/shared/GenericAuthenticationRefresher.test.js +144 -0
  440. package/dist/test/unit/shared/GenericAuthenticationRefresher.test.js.map +1 -0
  441. package/dist/test/unit/shared/UserSession.test.d.ts +2 -0
  442. package/dist/test/unit/shared/UserSession.test.d.ts.map +1 -0
  443. package/dist/test/unit/shared/UserSession.test.js +37 -0
  444. package/dist/test/unit/shared/UserSession.test.js.map +1 -0
  445. package/dist/test/unit/shared/components/CivicAuthIframeContainer.test.d.ts +2 -0
  446. package/dist/test/unit/shared/components/CivicAuthIframeContainer.test.d.ts.map +1 -0
  447. package/dist/test/unit/shared/components/CivicAuthIframeContainer.test.js +122 -0
  448. package/dist/test/unit/shared/components/CivicAuthIframeContainer.test.js.map +1 -0
  449. package/dist/test/unit/shared/printVersion.test.d.ts +2 -0
  450. package/dist/test/unit/shared/printVersion.test.d.ts.map +1 -0
  451. package/dist/test/unit/shared/printVersion.test.js +39 -0
  452. package/dist/test/unit/shared/printVersion.test.js.map +1 -0
  453. package/dist/test/unit/shared/providers/ClientTokenExchangeSessionProvider.test.d.ts +2 -0
  454. package/dist/test/unit/shared/providers/ClientTokenExchangeSessionProvider.test.d.ts.map +1 -0
  455. package/dist/test/unit/shared/providers/ClientTokenExchangeSessionProvider.test.js +108 -0
  456. package/dist/test/unit/shared/providers/ClientTokenExchangeSessionProvider.test.js.map +1 -0
  457. package/dist/test/unit/shared/storage.test.d.ts +2 -0
  458. package/dist/test/unit/shared/storage.test.d.ts.map +1 -0
  459. package/dist/test/unit/shared/storage.test.js +53 -0
  460. package/dist/test/unit/shared/storage.test.js.map +1 -0
  461. package/dist/test/unit/utils.test.d.ts +2 -0
  462. package/dist/test/unit/utils.test.d.ts.map +1 -0
  463. package/dist/test/unit/utils.test.js +40 -0
  464. package/dist/test/unit/utils.test.js.map +1 -0
  465. package/dist/tsconfig.cjs.tsbuildinfo +1 -1
  466. package/dist/tsconfig.esm.tsbuildinfo +1 -1
  467. package/dist/tsconfig.tsbuildinfo +1 -0
  468. package/dist/vitest.config.d.ts +3 -0
  469. package/dist/vitest.config.d.ts.map +1 -0
  470. package/dist/vitest.config.js +44 -0
  471. package/dist/vitest.config.js.map +1 -0
  472. package/package.json +19 -18
  473. package/dist/cjs/reactjs/hooks/useSignIn.d.ts +0 -6
  474. package/dist/cjs/reactjs/hooks/useSignIn.d.ts.map +0 -1
  475. package/dist/cjs/reactjs/hooks/useSignIn.js +0 -38
  476. package/dist/cjs/reactjs/hooks/useSignIn.js.map +0 -1
  477. package/dist/cjs/services/UserinfoService.d.ts +0 -5
  478. package/dist/cjs/services/UserinfoService.d.ts.map +0 -1
  479. package/dist/cjs/services/UserinfoService.js +0 -15
  480. package/dist/cjs/services/UserinfoService.js.map +0 -1
  481. package/dist/esm/reactjs/hooks/useSignIn.d.ts +0 -6
  482. package/dist/esm/reactjs/hooks/useSignIn.d.ts.map +0 -1
  483. package/dist/esm/reactjs/hooks/useSignIn.js +0 -34
  484. package/dist/esm/reactjs/hooks/useSignIn.js.map +0 -1
@@ -0,0 +1,107 @@
1
+ import { NextResponse } from "next/server.js";
2
+ import picomatch from "picomatch";
3
+ import { resolveAuthConfig } from "@/nextjs/config.js";
4
+ // Matches globs:
5
+ // Examples:
6
+ // /user
7
+ // /user/*
8
+ // /user/**/info
9
+ const matchGlob = (pathname, globPattern) => {
10
+ const matches = picomatch(globPattern);
11
+ return matches(pathname);
12
+ };
13
+ // Matches globs:
14
+ // Examples:
15
+ // /user
16
+ // /user/*
17
+ // /user/**/info
18
+ const matchesGlobs = (pathname, patterns) => patterns.some((pattern) => {
19
+ if (!pattern)
20
+ return false;
21
+ console.log("matching", {
22
+ pattern,
23
+ pathname,
24
+ match: matchGlob(pathname, pattern),
25
+ });
26
+ return matchGlob(pathname, pattern);
27
+ });
28
+ // internal - used by all exported functions
29
+ const applyAuth = async (authConfig, request) => {
30
+ const authConfigWithDefaults = resolveAuthConfig(authConfig);
31
+ // Check for any valid auth token
32
+ const isAuthenticated = !!request.cookies.get("id_token");
33
+ // skip auth check for redirect to login url
34
+ if (request.nextUrl.pathname === authConfigWithDefaults.loginUrl &&
35
+ request.method === "GET") {
36
+ console.log("→ Skipping auth check - this is the login URL");
37
+ return undefined;
38
+ }
39
+ if (!matchesGlobs(request.nextUrl.pathname, authConfigWithDefaults.include)) {
40
+ console.log("→ Skipping auth check - path not in include patterns");
41
+ return undefined;
42
+ }
43
+ if (matchesGlobs(request.nextUrl.pathname, authConfigWithDefaults.exclude)) {
44
+ console.log("→ Skipping auth check - path in exclude patterns");
45
+ return undefined;
46
+ }
47
+ // Check for either token type
48
+ if (!isAuthenticated) {
49
+ const loginUrl = new URL(authConfigWithDefaults.loginUrl, request.url);
50
+ console.log("→ No valid token found - redirecting to login", loginUrl);
51
+ return NextResponse.redirect(loginUrl);
52
+ }
53
+ console.log("→ Auth check passed");
54
+ return undefined;
55
+ };
56
+ /**
57
+ *
58
+ * Use this when auth is the only middleware you need.
59
+ * Usage:
60
+ *
61
+ * export default authMiddleware({ loginUrl = '/login' }); // or just authMiddleware();
62
+ *
63
+ */
64
+ export const authMiddleware = (authConfig = {}) => async (request) => {
65
+ const response = await applyAuth(authConfig, request);
66
+ if (response)
67
+ return response;
68
+ // NextJS doesn't do middleware chaining yet, so this does not mean
69
+ // "call the next middleware" - it means "continue to the route handler"
70
+ return NextResponse.next();
71
+ };
72
+ /**
73
+ * Usage:
74
+ *
75
+ * export default withAuth(async (request) => {
76
+ * console.log('my middleware');
77
+ * return NextResponse.next();
78
+ * })
79
+ */
80
+ // use this when you have your own middleware to chain
81
+ export function withAuth(middleware) {
82
+ return auth()(middleware);
83
+ }
84
+ /**
85
+ * Use this when you want to configure the middleware here (an alternative is to do it in the next.config file)
86
+ *
87
+ * Usage:
88
+ *
89
+ * const withAuth = auth({ loginUrl = '/login' }); // or just auth();
90
+ *
91
+ * export default withAuth(async (request) => {
92
+ * console.log('my middleware');
93
+ * return NextResponse.next();
94
+ * })
95
+ *
96
+ */
97
+ export function auth(authConfig = {}) {
98
+ return (middleware) => {
99
+ return async (request) => {
100
+ const response = await applyAuth(authConfig, request);
101
+ if (response)
102
+ return response;
103
+ return middleware(request);
104
+ };
105
+ };
106
+ }
107
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/nextjs/middleware.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Authenticates the user on all requests by checking the token cookie\n *\n * Usage:\n * Option 1: use if no other middleware (e.g. no next-intl etc)\n * export default authMiddleware();\n *\n * Option 2: use if other middleware is needed - default auth config\n * export default withAuth((request) => {\n * console.log('in custom middleware', request.nextUrl.pathname);\n * return NextResponse.next();\n * })\n *\n * Option 3: use if other middleware is needed - specifying auth config\n * const withCivicAuth = auth({ loginUrl: '/login', include: ['/[.*]/user'] })\n * export default withCivicAuth((request) => {\n * console.log('in custom middleware', request.url);\n * return NextResponse.next();\n * })\n *\n */\nimport type { NextRequest } from \"next/server.js\";\nimport { NextResponse } from \"next/server.js\";\nimport picomatch from \"picomatch\";\nimport type { AuthConfig } from \"@/nextjs/config.js\";\nimport { resolveAuthConfig } from \"@/nextjs/config.js\";\n\ntype Middleware = (\n request: NextRequest,\n) => Promise<NextResponse> | NextResponse;\n\n// Matches globs:\n// Examples:\n// /user\n// /user/*\n// /user/**/info\nconst matchGlob = (pathname: string, globPattern: string) => {\n const matches = picomatch(globPattern);\n return matches(pathname);\n};\n\n// Matches globs:\n// Examples:\n// /user\n// /user/*\n// /user/**/info\nconst matchesGlobs = (pathname: string, patterns: string[]) =>\n patterns.some((pattern) => {\n if (!pattern) return false;\n console.log(\"matching\", {\n pattern,\n pathname,\n match: matchGlob(pathname, pattern),\n });\n return matchGlob(pathname, pattern);\n });\n\n// internal - used by all exported functions\nconst applyAuth = async (\n authConfig: AuthConfig,\n request: NextRequest,\n): Promise<NextResponse | undefined> => {\n const authConfigWithDefaults = resolveAuthConfig(authConfig);\n // Check for any valid auth token\n const isAuthenticated = !!request.cookies.get(\"id_token\");\n\n // skip auth check for redirect to login url\n if (\n request.nextUrl.pathname === authConfigWithDefaults.loginUrl &&\n request.method === \"GET\"\n ) {\n console.log(\"→ Skipping auth check - this is the login URL\");\n return undefined;\n }\n\n if (!matchesGlobs(request.nextUrl.pathname, authConfigWithDefaults.include)) {\n console.log(\"→ Skipping auth check - path not in include patterns\");\n return undefined;\n }\n\n if (matchesGlobs(request.nextUrl.pathname, authConfigWithDefaults.exclude)) {\n console.log(\"→ Skipping auth check - path in exclude patterns\");\n return undefined;\n }\n\n // Check for either token type\n if (!isAuthenticated) {\n const loginUrl = new URL(authConfigWithDefaults.loginUrl, request.url);\n console.log(\"→ No valid token found - redirecting to login\", loginUrl);\n return NextResponse.redirect(loginUrl);\n }\n\n console.log(\"→ Auth check passed\");\n return undefined;\n};\n\n/**\n *\n * Use this when auth is the only middleware you need.\n * Usage:\n *\n * export default authMiddleware({ loginUrl = '/login' }); // or just authMiddleware();\n *\n */\nexport const authMiddleware =\n (authConfig: Partial<AuthConfig> = {}) =>\n async (request: NextRequest): Promise<NextResponse> => {\n const response = await applyAuth(authConfig, request);\n if (response) return response;\n\n // NextJS doesn't do middleware chaining yet, so this does not mean\n // \"call the next middleware\" - it means \"continue to the route handler\"\n return NextResponse.next();\n };\n\n/**\n * Usage:\n *\n * export default withAuth(async (request) => {\n * console.log('my middleware');\n * return NextResponse.next();\n * })\n */\n// use this when you have your own middleware to chain\nexport function withAuth(\n middleware: Middleware,\n): (request: NextRequest) => Promise<NextResponse> {\n return auth()(middleware);\n}\n\n/**\n * Use this when you want to configure the middleware here (an alternative is to do it in the next.config file)\n *\n * Usage:\n *\n * const withAuth = auth({ loginUrl = '/login' }); // or just auth();\n *\n * export default withAuth(async (request) => {\n * console.log('my middleware');\n * return NextResponse.next();\n * })\n *\n */\nexport function auth(authConfig: AuthConfig = {}) {\n return (\n middleware: Middleware,\n ): ((request: NextRequest) => Promise<NextResponse>) => {\n return async (request: NextRequest): Promise<NextResponse> => {\n const response = await applyAuth(authConfig, request);\n if (response) return response;\n\n return middleware(request);\n };\n };\n}\n"]}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * A very small context provider for the user object - it takes the user object from the cookie and provides it to the app.
3
+ */
4
+ import React from "react";
5
+ import { type AuthConfigWithDefaults } from "@/nextjs/config.js";
6
+ import type { AuthProviderProps } from "@/shared/providers/types.js";
7
+ type NextCivicAuthProviderInternalProps = Omit<AuthProviderProps, "clientId"> & {
8
+ resolvedConfig: AuthConfigWithDefaults;
9
+ };
10
+ type NextCivicAuthProviderProps = Omit<NextCivicAuthProviderInternalProps, "clientId" | "resolvedConfig" | "redirectUrl">;
11
+ declare const CivicNextAuthProvider: ({ children, ...props }: NextCivicAuthProviderProps) => React.JSX.Element;
12
+ export { CivicNextAuthProvider, type NextCivicAuthProviderProps };
13
+ //# sourceMappingURL=NextAuthProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NextAuthProvider.d.ts","sourceRoot":"","sources":["../../../../src/nextjs/providers/NextAuthProvider.tsx"],"names":[],"mappings":"AACA;;GAEG;AACH,OAAO,KAA2C,MAAM,OAAO,CAAC;AAChE,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,oBAAoB,CAAC;AAiB5B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAWrE,KAAK,kCAAkC,GAAG,IAAI,CAC5C,iBAAiB,EACjB,UAAU,CACX,GAAG;IACF,cAAc,EAAE,sBAAsB,CAAC;CACxC,CAAC;AACF,KAAK,0BAA0B,GAAG,IAAI,CACpC,kCAAkC,EAClC,UAAU,GAAG,gBAAgB,GAAG,aAAa,CAC9C,CAAC;AA2GF,QAAA,MAAM,qBAAqB,2BAGxB,0BAA0B,sBAwC5B,CAAC;AAEF,OAAO,EAAE,qBAAqB,EAAE,KAAK,0BAA0B,EAAE,CAAC"}
@@ -0,0 +1,94 @@
1
+ "use client";
2
+ /**
3
+ * A very small context provider for the user object - it takes the user object from the cookie and provides it to the app.
4
+ */
5
+ import React, { useCallback, useEffect, useState } from "react";
6
+ import { resolveAuthConfig, } from "@/nextjs/config.js";
7
+ import { resolveCallbackUrl } from "@/nextjs/utils.js";
8
+ import { ConfidentialClientPKCEConsumer } from "@/services/PKCE.js";
9
+ import { NextjsClientStorage } from "@/nextjs/cookies.js";
10
+ import { UserProvider } from "@/shared/providers/UserProvider.js";
11
+ import { useUserCookie } from "@/nextjs/hooks/useUserCookie.js";
12
+ import { CivicAuthConfigProvider } from "@/shared/providers/CivicAuthConfigContext.js";
13
+ import { SessionProvider } from "@/shared/providers/SessionProvider.js";
14
+ import { IframeProvider } from "@/shared/providers/IframeProvider.js";
15
+ import { TokenProvider } from "@/shared/providers/TokenProvider.js";
16
+ import { useSignIn } from "@/shared/hooks/useSignIn.js";
17
+ import { useCivicAuthConfig } from "@/shared/hooks/useCivicAuthConfig.js";
18
+ import { IFrameAndLoading } from "@/shared/components/IFrameAndLoading.js";
19
+ import { BlockDisplay } from "@/shared/components/BlockDisplay.js";
20
+ import { LoadingIcon } from "@/shared/components/LoadingIcon.js";
21
+ import { useIframe } from "@/shared/hooks/useIframe.js";
22
+ import { useSession } from "@/reactjs/index.js";
23
+ import { useIsInIframe } from "@/shared/hooks/useIsInIframe.js";
24
+ const CivicNextAuthTokenProviderInternal = ({ children, isLoading, displayMode = "iframe", user, fetchUser, ...props }) => {
25
+ const { iframeMode, resolvedConfig } = props;
26
+ const { iframeRef, setLogoutIframeIsVisible } = useIframe();
27
+ const civicAuthConfig = useCivicAuthConfig();
28
+ const { challengeUrl } = resolvedConfig;
29
+ const pkceConsumer = new ConfidentialClientPKCEConsumer(challengeUrl);
30
+ const [isSigningOut, setIsSigningOut] = useState(false);
31
+ const { data: session } = useSession();
32
+ const postSignOut = useCallback(async () => {
33
+ setIsSigningOut(true);
34
+ // user is signed out, manually update the user from cookies to not wait for polling
35
+ await fetchUser();
36
+ await props?.onSignOut?.();
37
+ }, [fetchUser, props]);
38
+ useEffect(() => {
39
+ if (!session?.authenticated) {
40
+ setIsSigningOut(false);
41
+ }
42
+ }, [session?.authenticated]);
43
+ useEffect(() => {
44
+ setLogoutIframeIsVisible(isSigningOut);
45
+ }, [isSigningOut, setLogoutIframeIsVisible]);
46
+ const { signIn, signOut } = useSignIn({
47
+ postSignOut,
48
+ pkceConsumer,
49
+ displayMode,
50
+ });
51
+ useEffect(() => {
52
+ if (iframeMode === "embedded" &&
53
+ civicAuthConfig &&
54
+ !session?.authenticated &&
55
+ iframeRef?.current) {
56
+ signIn();
57
+ }
58
+ }, [iframeMode, civicAuthConfig, session?.authenticated, iframeRef, signIn]);
59
+ return (React.createElement(TokenProvider, null,
60
+ React.createElement(UserProvider, { storage: new NextjsClientStorage(), user: user, signOut: signOut, signIn: signIn, displayMode: displayMode },
61
+ React.createElement(IFrameAndLoading, { error: null, isLoading: isLoading, showIframeOnLogout: true }),
62
+ isLoading && (React.createElement(BlockDisplay, null,
63
+ React.createElement(LoadingIcon, null))),
64
+ children)));
65
+ };
66
+ const CivicNextAuthProviderInternal = ({ children, ...props }) => {
67
+ const isInIframe = useIsInIframe();
68
+ // if the SDK loads in an iframe, we show the loading spinner as the iframe
69
+ // will be waiting to be minimized
70
+ const isLoading = isInIframe;
71
+ const { user, idToken, fetchUser, isPending } = useUserCookie();
72
+ const session = {
73
+ authenticated: !!user,
74
+ idToken,
75
+ };
76
+ return (React.createElement(SessionProvider, { data: session, isLoading: isLoading },
77
+ React.createElement(CivicNextAuthTokenProviderInternal, { ...props, user: user, idToken: idToken, fetchUser: fetchUser, isLoading: isLoading || isPending }, children)));
78
+ };
79
+ const CivicNextAuthProvider = ({ children, ...props }) => {
80
+ const resolvedConfig = resolveAuthConfig();
81
+ const { clientId, oauthServer, callbackUrl, challengeUrl, logoutUrl, logoutCallbackUrl, } = resolvedConfig;
82
+ const [redirectUrl, setRedirectUrl] = useState("");
83
+ useEffect(() => {
84
+ if (typeof globalThis.window !== "undefined") {
85
+ const appUrl = globalThis.window.location.origin;
86
+ setRedirectUrl(resolveCallbackUrl(resolvedConfig, appUrl));
87
+ }
88
+ }, [callbackUrl, resolvedConfig]);
89
+ return (React.createElement(CivicAuthConfigProvider, { oauthServer: oauthServer, clientId: clientId, redirectUrl: redirectUrl, logoutRedirectUrl: logoutCallbackUrl, nonce: props?.nonce, challengeUrl: challengeUrl, logoutUrl: logoutUrl, logoutCallbackUrl: logoutCallbackUrl },
90
+ React.createElement(IframeProvider, { iframeMode: props.iframeMode },
91
+ React.createElement(CivicNextAuthProviderInternal, { ...props, resolvedConfig: resolvedConfig }, children))));
92
+ };
93
+ export { CivicNextAuthProvider };
94
+ //# sourceMappingURL=NextAuthProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NextAuthProvider.js","sourceRoot":"","sources":["../../../../src/nextjs/providers/NextAuthProvider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb;;GAEG;AACH,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAChE,OAAO,EACL,iBAAiB,GAElB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAqBhE,MAAM,kCAAkC,GAAG,CAAC,EAC1C,QAAQ,EACR,SAAS,EACT,WAAW,GAAG,QAAQ,EACtB,IAAI,EACJ,SAAS,EACT,GAAG,KAAK,EACgC,EAAE,EAAE;IAC5C,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IAC7C,MAAM,EAAE,SAAS,EAAE,wBAAwB,EAAE,GAAG,SAAS,EAAE,CAAC;IAC5D,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;IAC7C,MAAM,EAAE,YAAY,EAAE,GAAG,cAAc,CAAC;IACxC,MAAM,YAAY,GAAG,IAAI,8BAA8B,CAAC,YAAY,CAAC,CAAC;IACtE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,CAAC;IAEvC,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACzC,eAAe,CAAC,IAAI,CAAC,CAAC;QACtB,oFAAoF;QACpF,MAAM,SAAS,EAAE,CAAC;QAClB,MAAM,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC;IAC7B,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IAEvB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC;YAC5B,eAAe,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;IAE7B,SAAS,CAAC,GAAG,EAAE;QACb,wBAAwB,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC,EAAE,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC,CAAC;IAE7C,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;QACpC,WAAW;QACX,YAAY;QACZ,WAAW;KACZ,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IACE,UAAU,KAAK,UAAU;YACzB,eAAe;YACf,CAAC,OAAO,EAAE,aAAa;YACvB,SAAS,EAAE,OAAO,EAClB,CAAC;YACD,MAAM,EAAE,CAAC;QACX,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAE7E,OAAO,CACL,oBAAC,aAAa;QACZ,oBAAC,YAAY,IACX,OAAO,EAAE,IAAI,mBAAmB,EAAE,EAClC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW;YAExB,oBAAC,gBAAgB,IACf,KAAK,EAAE,IAAI,EACX,SAAS,EAAE,SAAS,EACpB,kBAAkB,EAAE,IAAI,GACxB;YACD,SAAS,IAAI,CACZ,oBAAC,YAAY;gBACX,oBAAC,WAAW,OAAG,CACF,CAChB;YACA,QAAQ,CACI,CACD,CACjB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,6BAA6B,GAAG,CAAC,EACrC,QAAQ,EACR,GAAG,KAAK,EAC2B,EAAE,EAAE;IACvC,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,2EAA2E;IAC3E,kCAAkC;IAClC,MAAM,SAAS,GAAG,UAAU,CAAC;IAC7B,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,aAAa,EAAE,CAAC;IAEhE,MAAM,OAAO,GAAG;QACd,aAAa,EAAE,CAAC,CAAC,IAAI;QACrB,OAAO;KACR,CAAC;IAEF,OAAO,CACL,oBAAC,eAAe,IAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;QAClD,oBAAC,kCAAkC,OAC7B,KAAK,EACT,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,IAAI,SAAS,IAEhC,QAAQ,CAC0B,CACrB,CACnB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,EAC7B,QAAQ,EACR,GAAG,KAAK,EACmB,EAAE,EAAE;IAC/B,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAC3C,MAAM,EACJ,QAAQ,EACR,WAAW,EACX,WAAW,EACX,YAAY,EACZ,SAAS,EACT,iBAAiB,GAClB,GAAG,cAAc,CAAC;IACnB,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IAE3D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,UAAU,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACjD,cAAc,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;IAElC,OAAO,CACL,oBAAC,uBAAuB,IACtB,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,iBAAiB,EACpC,KAAK,EAAE,KAAK,EAAE,KAAK,EACnB,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,SAAS,EACpB,iBAAiB,EAAE,iBAAiB;QAEpC,oBAAC,cAAc,IAAC,UAAU,EAAE,KAAK,CAAC,UAAU;YAC1C,oBAAC,6BAA6B,OACxB,KAAK,EACT,cAAc,EAAE,cAAc,IAE7B,QAAQ,CACqB,CACjB,CACO,CAC3B,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,qBAAqB,EAAmC,CAAC","sourcesContent":["\"use client\";\n/**\n * A very small context provider for the user object - it takes the user object from the cookie and provides it to the app.\n */\nimport React, { useCallback, useEffect, useState } from \"react\";\nimport {\n resolveAuthConfig,\n type AuthConfigWithDefaults,\n} from \"@/nextjs/config.js\";\nimport { resolveCallbackUrl } from \"@/nextjs/utils.js\";\nimport { ConfidentialClientPKCEConsumer } from \"@/services/PKCE.js\";\nimport { NextjsClientStorage } from \"@/nextjs/cookies.js\";\nimport { UserProvider } from \"@/shared/providers/UserProvider.js\";\nimport { useUserCookie } from \"@/nextjs/hooks/useUserCookie.js\";\nimport { CivicAuthConfigProvider } from \"@/shared/providers/CivicAuthConfigContext.js\";\nimport { SessionProvider } from \"@/shared/providers/SessionProvider.js\";\nimport { IframeProvider } from \"@/shared/providers/IframeProvider.js\";\nimport { TokenProvider } from \"@/shared/providers/TokenProvider.js\";\nimport { useSignIn } from \"@/shared/hooks/useSignIn.js\";\nimport { useCivicAuthConfig } from \"@/shared/hooks/useCivicAuthConfig.js\";\nimport { IFrameAndLoading } from \"@/shared/components/IFrameAndLoading.js\";\nimport { BlockDisplay } from \"@/shared/components/BlockDisplay.js\";\nimport { LoadingIcon } from \"@/shared/components/LoadingIcon.js\";\nimport { useIframe } from \"@/shared/hooks/useIframe.js\";\nimport { useSession } from \"@/reactjs/index.js\";\nimport type { AuthProviderProps } from \"@/shared/providers/types.js\";\nimport { useIsInIframe } from \"@/shared/hooks/useIsInIframe.js\";\nimport type { User } from \"@/types.js\";\n\ntype CivicNextAuthTokenProviderInternalProps =\n NextCivicAuthProviderInternalProps & {\n isLoading: boolean;\n idToken?: string;\n user: User | null;\n fetchUser: () => Promise<void>;\n };\ntype NextCivicAuthProviderInternalProps = Omit<\n AuthProviderProps,\n \"clientId\"\n> & {\n resolvedConfig: AuthConfigWithDefaults;\n};\ntype NextCivicAuthProviderProps = Omit<\n NextCivicAuthProviderInternalProps,\n \"clientId\" | \"resolvedConfig\" | \"redirectUrl\"\n>;\n\nconst CivicNextAuthTokenProviderInternal = ({\n children,\n isLoading,\n displayMode = \"iframe\",\n user,\n fetchUser,\n ...props\n}: CivicNextAuthTokenProviderInternalProps) => {\n const { iframeMode, resolvedConfig } = props;\n const { iframeRef, setLogoutIframeIsVisible } = useIframe();\n const civicAuthConfig = useCivicAuthConfig();\n const { challengeUrl } = resolvedConfig;\n const pkceConsumer = new ConfidentialClientPKCEConsumer(challengeUrl);\n const [isSigningOut, setIsSigningOut] = useState(false);\n const { data: session } = useSession();\n\n const postSignOut = useCallback(async () => {\n setIsSigningOut(true);\n // user is signed out, manually update the user from cookies to not wait for polling\n await fetchUser();\n await props?.onSignOut?.();\n }, [fetchUser, props]);\n\n useEffect(() => {\n if (!session?.authenticated) {\n setIsSigningOut(false);\n }\n }, [session?.authenticated]);\n\n useEffect(() => {\n setLogoutIframeIsVisible(isSigningOut);\n }, [isSigningOut, setLogoutIframeIsVisible]);\n\n const { signIn, signOut } = useSignIn({\n postSignOut,\n pkceConsumer,\n displayMode,\n });\n\n useEffect(() => {\n if (\n iframeMode === \"embedded\" &&\n civicAuthConfig &&\n !session?.authenticated &&\n iframeRef?.current\n ) {\n signIn();\n }\n }, [iframeMode, civicAuthConfig, session?.authenticated, iframeRef, signIn]);\n\n return (\n <TokenProvider>\n <UserProvider\n storage={new NextjsClientStorage()}\n user={user}\n signOut={signOut}\n signIn={signIn}\n displayMode={displayMode}\n >\n <IFrameAndLoading\n error={null}\n isLoading={isLoading}\n showIframeOnLogout={true}\n />\n {isLoading && (\n <BlockDisplay>\n <LoadingIcon />\n </BlockDisplay>\n )}\n {children}\n </UserProvider>\n </TokenProvider>\n );\n};\n\nconst CivicNextAuthProviderInternal = ({\n children,\n ...props\n}: NextCivicAuthProviderInternalProps) => {\n const isInIframe = useIsInIframe();\n // if the SDK loads in an iframe, we show the loading spinner as the iframe\n // will be waiting to be minimized\n const isLoading = isInIframe;\n const { user, idToken, fetchUser, isPending } = useUserCookie();\n\n const session = {\n authenticated: !!user,\n idToken,\n };\n\n return (\n <SessionProvider data={session} isLoading={isLoading}>\n <CivicNextAuthTokenProviderInternal\n {...props}\n user={user}\n idToken={idToken}\n fetchUser={fetchUser}\n isLoading={isLoading || isPending}\n >\n {children}\n </CivicNextAuthTokenProviderInternal>\n </SessionProvider>\n );\n};\n\nconst CivicNextAuthProvider = ({\n children,\n ...props\n}: NextCivicAuthProviderProps) => {\n const resolvedConfig = resolveAuthConfig();\n const {\n clientId,\n oauthServer,\n callbackUrl,\n challengeUrl,\n logoutUrl,\n logoutCallbackUrl,\n } = resolvedConfig;\n const [redirectUrl, setRedirectUrl] = useState<string>(\"\");\n\n useEffect(() => {\n if (typeof globalThis.window !== \"undefined\") {\n const appUrl = globalThis.window.location.origin;\n setRedirectUrl(resolveCallbackUrl(resolvedConfig, appUrl));\n }\n }, [callbackUrl, resolvedConfig]);\n\n return (\n <CivicAuthConfigProvider\n oauthServer={oauthServer}\n clientId={clientId}\n redirectUrl={redirectUrl}\n logoutRedirectUrl={logoutCallbackUrl}\n nonce={props?.nonce}\n challengeUrl={challengeUrl}\n logoutUrl={logoutUrl}\n logoutCallbackUrl={logoutCallbackUrl}\n >\n <IframeProvider iframeMode={props.iframeMode}>\n <CivicNextAuthProviderInternal\n {...props}\n resolvedConfig={resolvedConfig}\n >\n {children}\n </CivicNextAuthProviderInternal>\n </IframeProvider>\n </CivicAuthConfigProvider>\n );\n};\n\nexport { CivicNextAuthProvider, type NextCivicAuthProviderProps };\n"]}
@@ -0,0 +1,19 @@
1
+ import type { NextRequest } from "next/server.js";
2
+ import { NextResponse } from "next/server.js";
3
+ import type { AuthConfig } from "@/nextjs/config.js";
4
+ export declare function handleLogout(request: NextRequest, config: AuthConfig): Promise<string>;
5
+ export declare function handleLogoutCallback(request: NextRequest, config: AuthConfig): Promise<NextResponse>;
6
+ /**
7
+ * Creates an authentication handler for Next.js API routes
8
+ *
9
+ * Usage:
10
+ * ```ts
11
+ * // app/api/auth/[...civicauth]/route.ts
12
+ * import { handler } from '@civic/auth/nextjs'
13
+ * export const GET = handler({
14
+ * // optional config overrides
15
+ * })
16
+ * ```
17
+ */
18
+ export declare const handler: (authConfig?: {}) => (request: NextRequest) => Promise<NextResponse>;
19
+ //# sourceMappingURL=routeHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routeHandler.d.ts","sourceRoot":"","sources":["../../../src/nextjs/routeHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAmRrD,wBAAsB,YAAY,CAChC,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,MAAM,CAAC,CA0BjB;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,YAAY,CAAC,CA+DvB;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,OAAO,iCAEF,WAAW,KAAG,OAAO,CAAC,YAAY,CA0CjD,CAAC"}
@@ -0,0 +1,309 @@
1
+ import { NextResponse } from "next/server.js";
2
+ import { revalidatePath } from "next/cache.js";
3
+ import { resolveAuthConfig } from "@/nextjs/config.js";
4
+ import { loggers } from "@/lib/logger.js";
5
+ import { clearAuthCookies, NextjsClientStorage, NextjsCookieStorage, } from "@/nextjs/cookies.js";
6
+ import { GenericPublicClientPKCEProducer } from "@/services/PKCE.js";
7
+ import { resolveOAuthAccessCode } from "@/server/login.js";
8
+ import { getUser } from "@/nextjs/GetUser.js";
9
+ import { resolveCallbackUrl } from "@/nextjs/utils.js";
10
+ import { GenericUserSession } from "@/shared/lib/UserSession.js";
11
+ import { TOKEN_EXCHANGE_SUCCESS_TEXT, TOKEN_EXCHANGE_TRIGGER_TEXT, } from "@/constants.js";
12
+ import { displayModeFromState, serverTokenExchangeFromState, } from "@/lib/oauth.js";
13
+ import { CodeVerifier, OAuthTokens } from "@/shared/lib/types.js";
14
+ import { generateOauthLogoutUrl } from "@/shared/lib/util.js";
15
+ import { redirect } from "next/navigation.js";
16
+ const logger = loggers.nextjs.handlers.auth;
17
+ class AuthError extends Error {
18
+ status;
19
+ constructor(message, status = 401) {
20
+ super(message);
21
+ this.status = status;
22
+ this.name = "AuthError";
23
+ }
24
+ }
25
+ const getAppUrl = (request) => request.cookies.get(CodeVerifier.APP_URL)?.value ||
26
+ request.nextUrl.searchParams.get("appUrl");
27
+ const getIdToken = async (config) => {
28
+ const cookieStorage = new NextjsCookieStorage(config.cookies?.tokens ?? {});
29
+ return cookieStorage.get(OAuthTokens.ID_TOKEN);
30
+ };
31
+ /**
32
+ * create a code verifier and challenge for PKCE
33
+ * saving the verifier in a cookie for later use
34
+ * @returns {Promise<NextResponse>}
35
+ */
36
+ async function handleChallenge(request, config) {
37
+ const cookieStorage = new NextjsCookieStorage(config.cookies?.tokens ?? {});
38
+ const pkceProducer = new GenericPublicClientPKCEProducer(cookieStorage);
39
+ const challenge = await pkceProducer.getCodeChallenge();
40
+ const appUrl = request.nextUrl.searchParams.get("appUrl");
41
+ if (appUrl) {
42
+ cookieStorage.set(CodeVerifier.APP_URL, appUrl);
43
+ }
44
+ return NextResponse.json({ status: "success", challenge });
45
+ }
46
+ async function performTokenExchangeAndSetCookies(request, config, code, state, appUrl) {
47
+ const resolvedConfigs = resolveAuthConfig(config);
48
+ const cookieStorage = new NextjsCookieStorage(resolvedConfigs.cookies.tokens);
49
+ const callbackUrl = resolveCallbackUrl(resolvedConfigs, appUrl);
50
+ try {
51
+ await resolveOAuthAccessCode(code, state, cookieStorage, {
52
+ ...resolvedConfigs,
53
+ redirectUrl: callbackUrl,
54
+ });
55
+ }
56
+ catch (error) {
57
+ logger.error("Token exchange failed:", error);
58
+ throw new AuthError("Failed to authenticate user", 401);
59
+ }
60
+ const user = await getUser();
61
+ if (!user) {
62
+ throw new AuthError("Failed to get user info", 401);
63
+ }
64
+ const clientStorage = new NextjsClientStorage();
65
+ const userSession = new GenericUserSession(clientStorage);
66
+ userSession.set(user);
67
+ }
68
+ const generateHtmlResponseWithCallback = (request, callbackUrl) => {
69
+ // we need to replace the URL with resolved config in case the server is hosted
70
+ // behind a reverse proxy or load balancer
71
+ const requestUrl = new URL(request.url);
72
+ const fetchUrl = `${callbackUrl}?${requestUrl.searchParams.toString()}&sameDomainCallback=true`;
73
+ return new NextResponse(`<html>
74
+ <body>
75
+ <span style="display:none">
76
+ <script>
77
+ window.onload = function () {
78
+ const appUrl = globalThis.window?.location?.origin;
79
+ fetch('${fetchUrl}&appUrl=' + appUrl).then((response) => {
80
+ response.json().then((jsonResponse) => {
81
+ if (jsonResponse.redirectUrl) {
82
+ window.location.href = jsonResponse.redirectUrl;
83
+ }
84
+ });
85
+ });
86
+ };
87
+ </script>
88
+ </span>
89
+ </body>
90
+ </html>
91
+ `);
92
+ };
93
+ async function handleCallback(request, config) {
94
+ const resolvedConfigs = resolveAuthConfig(config);
95
+ console.log("handleCallback", { request, resolvedConfigs });
96
+ const code = request.nextUrl.searchParams.get("code");
97
+ const state = request.nextUrl.searchParams.get("state");
98
+ if (!code || !state)
99
+ throw new AuthError("Bad parameters", 400);
100
+ // appUrl is passed from the client to the server in the query string
101
+ // this is necessary because the server does not have access to the client's window.location.origin
102
+ // and can not accurately determine the appUrl (specially if the app is behind a reverse proxy)
103
+ const appUrl = getAppUrl(request);
104
+ // If we have a code_verifier cookie and the appUrl, we can do a token exchange.
105
+ // Otherwise, just render an empty page.
106
+ // The initial redirect back from the auth server does not send cookies, because the redirect is from a 3rd-party domain.
107
+ // The client will make an additional call to this route with cookies included, at which point we do the token exchange.
108
+ console.log("handleCallback", {
109
+ code,
110
+ state,
111
+ appUrl,
112
+ });
113
+ const codeVerifier = request.cookies.get(CodeVerifier.COOKIE_NAME);
114
+ if (!codeVerifier || !appUrl) {
115
+ console.log("handleCallback no code_verifier found", {
116
+ state,
117
+ serverTokenExchange: serverTokenExchangeFromState(`${state}`),
118
+ });
119
+ let response = new NextResponse(`<html><body><span style="display:none">${TOKEN_EXCHANGE_TRIGGER_TEXT}</span></body></html>`);
120
+ // in server-side token exchange mode we need to launch a page that will trigger the token exchange
121
+ // from the same domain, allowing it access to the code_verifier cookie
122
+ // we only need to do this in redirect mode, as the iframe already triggers a client-side token exchange
123
+ // if no code-verifier cookie is found
124
+ if (state && serverTokenExchangeFromState(state)) {
125
+ console.log("handleCallback serverTokenExchangeFromState, launching redirect page...", {
126
+ requestUrl: request.url,
127
+ configCallbackUrl: resolvedConfigs.callbackUrl,
128
+ });
129
+ // generate a page that will callback to the same domain, allowing access
130
+ // to the code_verifier cookie and passing the appUrl.
131
+ response = generateHtmlResponseWithCallback(request, resolvedConfigs.callbackUrl);
132
+ }
133
+ response.headers.set("Content-Type", "text/html; charset=utf-8");
134
+ console.log(`handleCallback no code_verifier found, returning ${TOKEN_EXCHANGE_TRIGGER_TEXT}`);
135
+ return response;
136
+ }
137
+ await performTokenExchangeAndSetCookies(request, resolvedConfigs, code, state, appUrl);
138
+ if (request.url.includes("sameDomainCallback=true")) {
139
+ console.log("handleCallback sameDomainCallback = true, returnining redirectUrl", appUrl);
140
+ return NextResponse.json({
141
+ status: "success",
142
+ redirectUrl: appUrl,
143
+ });
144
+ }
145
+ // this is the case where a 'normal' redirect is happening
146
+ if (serverTokenExchangeFromState(state)) {
147
+ console.log("handleCallback serverTokenExchangeFromState, redirect to appUrl", appUrl);
148
+ if (!appUrl) {
149
+ throw new Error("appUrl undefined. Cannot redirect.");
150
+ }
151
+ return NextResponse.redirect(`${appUrl}`);
152
+ }
153
+ // return an empty HTML response so the iframe doesn't show any response
154
+ // in the short moment between the redirect and the parent window
155
+ // acknowledging the redirect and closing the iframe
156
+ const response = new NextResponse(`<html><span style="display:none">${TOKEN_EXCHANGE_SUCCESS_TEXT}</span></html>`);
157
+ response.headers.set("Content-Type", "text/html; charset=utf-8");
158
+ return response;
159
+ }
160
+ /**
161
+ * If redirectPath is an absolute path, return it as-is.
162
+ * Otherwise for relative paths, append it to the current domain.
163
+ * @param redirectPath
164
+ * @returns
165
+ */
166
+ const getAbsoluteRedirectPath = (redirectPath, currentBasePath) => new URL(redirectPath, currentBasePath).href;
167
+ const getPostLogoutRedirectUrl = (request, config) => {
168
+ const { loginUrl } = resolveAuthConfig(config);
169
+ const redirectTarget = loginUrl ?? "/";
170
+ // if the optional loginUrl is provided and it is an absolute URL,
171
+ // use it as the redirect target
172
+ const isAbsoluteRedirect = /^(https?:\/\/|www\.).+/i.test(redirectTarget);
173
+ if (isAbsoluteRedirect) {
174
+ return redirectTarget;
175
+ }
176
+ // if loginUrl is not defined, the appUrl is passed from the client to the server
177
+ // in the query string or cookies. This is necessary because the server does not
178
+ // have access to the client's window.location and can not accurately determine
179
+ // the appUrl (specially if the app is behind a reverse proxy).
180
+ const appUrl = getAppUrl(request);
181
+ if (appUrl)
182
+ return getAbsoluteRedirectPath(redirectTarget, appUrl);
183
+ return null;
184
+ };
185
+ const revalidateUrlPath = async (url) => {
186
+ try {
187
+ const path = new URL(url).pathname;
188
+ revalidatePath(path);
189
+ }
190
+ catch (error) {
191
+ logger.warn("Failed to revalidate path after logout:", error);
192
+ }
193
+ };
194
+ export async function handleLogout(request, config) {
195
+ console.log("handleLogout", { params: request.nextUrl.searchParams });
196
+ const resolvedConfigs = resolveAuthConfig(config);
197
+ // read the id_token from the cookies
198
+ const idToken = await getIdToken(resolvedConfigs);
199
+ // read the state from the query parameters
200
+ const state = request.nextUrl.searchParams.get("state");
201
+ if (!state || !idToken)
202
+ throw new AuthError("Bad parameters", 400);
203
+ const postLogoutUrl = new URL(resolvedConfigs.logoutCallbackUrl, getAppUrl(request) || request.url);
204
+ const logoutUrl = await generateOauthLogoutUrl({
205
+ clientId: resolvedConfigs.clientId,
206
+ idToken,
207
+ state,
208
+ redirectUrl: postLogoutUrl.href,
209
+ oauthServer: resolvedConfigs.oauthServer,
210
+ });
211
+ console.log("handleLogout: redirecting to ", logoutUrl);
212
+ return logoutUrl.href;
213
+ }
214
+ export async function handleLogoutCallback(request, config) {
215
+ const resolvedConfigs = resolveAuthConfig(config);
216
+ const state = request.nextUrl.searchParams.get("state") || "";
217
+ if (!state)
218
+ throw new AuthError("Bad parameters", 400);
219
+ const displayMode = displayModeFromState(state, "redirect");
220
+ console.log("handleLogout: clear auth cookies", { state, displayMode });
221
+ await clearAuthCookies(resolvedConfigs);
222
+ let response;
223
+ // handle logout for iframe display mode
224
+ if (displayMode === "iframe") {
225
+ // try to read the token from cookies. If cookies cant be read/written
226
+ // because the request cames from a cross-origin redirect,
227
+ // we need to show a page that will trigger the logout from the same domain
228
+ const canReadCookies = !!(await getIdToken(resolvedConfigs));
229
+ if (canReadCookies || request.url.includes("sameDomainCallback=true")) {
230
+ // just return success
231
+ return NextResponse.json({ status: "success" });
232
+ }
233
+ // return a page that will trigger the logout from the same domain
234
+ response = generateHtmlResponseWithCallback(request, resolvedConfigs.logoutCallbackUrl);
235
+ response.headers.set("Content-Type", "text/html; charset=utf-8");
236
+ return response;
237
+ }
238
+ // handle logout for non-iframe display mode
239
+ const redirectUrl = getPostLogoutRedirectUrl(request, resolvedConfigs);
240
+ if (redirectUrl) {
241
+ console.log("handleLogout with redirect mode", { state, redirectUrl });
242
+ // this is comming from the fetch from the HTML page returned by this handler
243
+ if (request.url.includes("sameDomainCallback=true")) {
244
+ console.log("handleCallback sameDomainCallback = true, returnining redirectUrl", redirectUrl);
245
+ return NextResponse.json({
246
+ status: "success",
247
+ redirectUrl: redirectUrl,
248
+ });
249
+ }
250
+ // just redirect to the app url
251
+ response = NextResponse.redirect(`${redirectUrl}`);
252
+ revalidateUrlPath(redirectUrl);
253
+ }
254
+ else {
255
+ console.log("handleLogout no redirectUrl found", { state });
256
+ response = generateHtmlResponseWithCallback(request, resolvedConfigs.logoutCallbackUrl);
257
+ response.headers.set("Content-Type", "text/html; charset=utf-8");
258
+ }
259
+ return response;
260
+ }
261
+ /**
262
+ * Creates an authentication handler for Next.js API routes
263
+ *
264
+ * Usage:
265
+ * ```ts
266
+ * // app/api/auth/[...civicauth]/route.ts
267
+ * import { handler } from '@civic/auth/nextjs'
268
+ * export const GET = handler({
269
+ * // optional config overrides
270
+ * })
271
+ * ```
272
+ */
273
+ export const handler = (authConfig = {}) => async (request) => {
274
+ const config = resolveAuthConfig(authConfig);
275
+ let redirectUrl = null;
276
+ try {
277
+ const pathname = request.nextUrl.pathname;
278
+ const pathSegments = pathname.split("/");
279
+ const lastSegment = pathSegments[pathSegments.length - 1];
280
+ switch (lastSegment) {
281
+ case "challenge":
282
+ return await handleChallenge(request, config);
283
+ case "callback":
284
+ return await handleCallback(request, config);
285
+ case "logout":
286
+ redirectUrl = await handleLogout(request, config);
287
+ break;
288
+ case "logoutcallback":
289
+ return await handleLogoutCallback(request, config);
290
+ default:
291
+ throw new AuthError(`Invalid auth route: ${pathname}`, 404);
292
+ }
293
+ }
294
+ catch (error) {
295
+ logger.error("Auth handler error:", error);
296
+ const status = error instanceof AuthError ? error.status : 500;
297
+ const message = error instanceof Error ? error.message : "Authentication failed";
298
+ const response = NextResponse.json({ error: message }, { status });
299
+ clearAuthCookies(config);
300
+ return response;
301
+ }
302
+ // redirect on Nextjs must be called outside a try-catch block
303
+ // see https://nextjs.org/docs/app/api-reference/functions/redirect
304
+ if (redirectUrl)
305
+ redirect(redirectUrl);
306
+ // do nothing if no redirectUrl
307
+ return NextResponse.json({ status: "ok" });
308
+ };
309
+ //# sourceMappingURL=routeHandler.js.map