@atproto/oauth-provider 0.6.6 → 0.7.1

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 (465) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/dist/access-token/access-token-mode.d.ts +5 -0
  3. package/dist/access-token/access-token-mode.d.ts.map +1 -0
  4. package/dist/access-token/access-token-mode.js +9 -0
  5. package/dist/access-token/access-token-mode.js.map +1 -0
  6. package/dist/account/account-manager.d.ts +13 -7
  7. package/dist/account/account-manager.d.ts.map +1 -1
  8. package/dist/account/account-manager.js +69 -52
  9. package/dist/account/account-manager.js.map +1 -1
  10. package/dist/account/account-store.d.ts +88 -77
  11. package/dist/account/account-store.d.ts.map +1 -1
  12. package/dist/account/account-store.js +24 -73
  13. package/dist/account/account-store.js.map +1 -1
  14. package/dist/account/sign-in-data.d.ts +4 -13
  15. package/dist/account/sign-in-data.d.ts.map +1 -1
  16. package/dist/account/sign-in-data.js +9 -9
  17. package/dist/account/sign-in-data.js.map +1 -1
  18. package/dist/account/sign-up-input.d.ts +4 -5
  19. package/dist/account/sign-up-input.d.ts.map +1 -1
  20. package/dist/account/sign-up-input.js +13 -3
  21. package/dist/account/sign-up-input.js.map +1 -1
  22. package/dist/client/client-manager.d.ts +4 -1
  23. package/dist/client/client-manager.d.ts.map +1 -1
  24. package/dist/client/client-manager.js +13 -1
  25. package/dist/client/client-manager.js.map +1 -1
  26. package/dist/client/client-store.d.ts +1 -1
  27. package/dist/client/client-store.d.ts.map +1 -1
  28. package/dist/constants.d.ts +5 -1
  29. package/dist/constants.d.ts.map +1 -1
  30. package/dist/constants.js +6 -2
  31. package/dist/constants.js.map +1 -1
  32. package/dist/customization/branding.d.ts +54 -0
  33. package/dist/customization/branding.d.ts.map +1 -0
  34. package/dist/customization/branding.js +13 -0
  35. package/dist/customization/branding.js.map +1 -0
  36. package/dist/customization/build-customization-css.d.ts +3 -0
  37. package/dist/customization/build-customization-css.d.ts.map +1 -0
  38. package/dist/customization/build-customization-css.js +27 -0
  39. package/dist/customization/build-customization-css.js.map +1 -0
  40. package/dist/customization/build-customization-data.d.ts +4 -0
  41. package/dist/customization/build-customization-data.d.ts.map +1 -0
  42. package/dist/customization/build-customization-data.js +18 -0
  43. package/dist/customization/build-customization-data.js.map +1 -0
  44. package/dist/customization/colors.d.ts +7 -0
  45. package/dist/customization/colors.d.ts.map +1 -0
  46. package/dist/customization/colors.js +27 -0
  47. package/dist/customization/colors.js.map +1 -0
  48. package/dist/customization/customization.d.ts +129 -0
  49. package/dist/customization/customization.d.ts.map +1 -0
  50. package/dist/customization/customization.js +26 -0
  51. package/dist/customization/customization.js.map +1 -0
  52. package/dist/customization/links.d.ts +26 -0
  53. package/dist/customization/links.d.ts.map +1 -0
  54. package/dist/customization/links.js +12 -0
  55. package/dist/customization/links.js.map +1 -0
  56. package/dist/device/device-id.d.ts +1 -0
  57. package/dist/device/device-id.d.ts.map +1 -1
  58. package/dist/device/device-id.js +4 -0
  59. package/dist/device/device-id.js.map +1 -1
  60. package/dist/device/device-manager.d.ts +6 -36
  61. package/dist/device/device-manager.d.ts.map +1 -1
  62. package/dist/device/device-manager.js +49 -43
  63. package/dist/device/device-manager.js.map +1 -1
  64. package/dist/device/device-store.d.ts +1 -0
  65. package/dist/device/device-store.d.ts.map +1 -1
  66. package/dist/device/device-store.js.map +1 -1
  67. package/dist/dpop/dpop-manager.d.ts +3 -3
  68. package/dist/dpop/dpop-nonce.d.ts +3 -3
  69. package/dist/dpop/dpop-nonce.d.ts.map +1 -1
  70. package/dist/errors/access-denied-error.d.ts +4 -3
  71. package/dist/errors/access-denied-error.d.ts.map +1 -1
  72. package/dist/errors/access-denied-error.js +5 -6
  73. package/dist/errors/access-denied-error.js.map +1 -1
  74. package/dist/{output/build-error-payload.d.ts → errors/error-parser.d.ts} +1 -1
  75. package/dist/errors/error-parser.d.ts.map +1 -0
  76. package/dist/{output/build-error-payload.js → errors/error-parser.js} +2 -2
  77. package/dist/errors/error-parser.js.map +1 -0
  78. package/dist/errors/invalid-grant-error.d.ts +1 -0
  79. package/dist/errors/invalid-grant-error.d.ts.map +1 -1
  80. package/dist/errors/invalid-grant-error.js +5 -0
  81. package/dist/errors/invalid-grant-error.js.map +1 -1
  82. package/dist/errors/login-required-error.d.ts +1 -0
  83. package/dist/errors/login-required-error.d.ts.map +1 -1
  84. package/dist/errors/login-required-error.js +5 -0
  85. package/dist/errors/login-required-error.js.map +1 -1
  86. package/dist/index.d.ts +1 -0
  87. package/dist/index.d.ts.map +1 -1
  88. package/dist/index.js +1 -0
  89. package/dist/index.js.map +1 -1
  90. package/dist/lib/html/build-document.d.ts +2 -2
  91. package/dist/lib/html/build-document.d.ts.map +1 -1
  92. package/dist/lib/html/build-document.js +4 -0
  93. package/dist/lib/html/build-document.js.map +1 -1
  94. package/dist/lib/html/hydration-data.d.ts +4 -0
  95. package/dist/lib/html/hydration-data.d.ts.map +1 -0
  96. package/dist/{output/backend-data.js → lib/html/hydration-data.js} +8 -8
  97. package/dist/lib/html/hydration-data.js.map +1 -0
  98. package/dist/lib/html/tags.d.ts +1 -1
  99. package/dist/lib/html/tags.d.ts.map +1 -1
  100. package/dist/lib/html/tags.js +1 -1
  101. package/dist/lib/html/tags.js.map +1 -1
  102. package/dist/lib/http/accept.d.ts +2 -2
  103. package/dist/lib/http/accept.d.ts.map +1 -1
  104. package/dist/lib/http/accept.js +1 -1
  105. package/dist/lib/http/accept.js.map +1 -1
  106. package/dist/lib/http/context.d.ts +2 -4
  107. package/dist/lib/http/context.d.ts.map +1 -1
  108. package/dist/lib/http/context.js +29 -4
  109. package/dist/lib/http/context.js.map +1 -1
  110. package/dist/lib/http/headers.d.ts +3 -0
  111. package/dist/lib/http/headers.d.ts.map +1 -0
  112. package/dist/lib/http/headers.js +14 -0
  113. package/dist/lib/http/headers.js.map +1 -0
  114. package/dist/lib/http/index.d.ts +1 -0
  115. package/dist/lib/http/index.d.ts.map +1 -1
  116. package/dist/lib/http/index.js +1 -0
  117. package/dist/lib/http/index.js.map +1 -1
  118. package/dist/lib/http/middleware.d.ts +1 -1
  119. package/dist/lib/http/middleware.d.ts.map +1 -1
  120. package/dist/lib/http/middleware.js +8 -24
  121. package/dist/lib/http/middleware.js.map +1 -1
  122. package/dist/lib/http/parser.d.ts +3 -3
  123. package/dist/lib/http/parser.d.ts.map +1 -1
  124. package/dist/lib/http/request.d.ts +13 -9
  125. package/dist/lib/http/request.d.ts.map +1 -1
  126. package/dist/lib/http/request.js +27 -49
  127. package/dist/lib/http/request.js.map +1 -1
  128. package/dist/lib/http/response.d.ts +6 -2
  129. package/dist/lib/http/response.d.ts.map +1 -1
  130. package/dist/lib/http/response.js +31 -11
  131. package/dist/lib/http/response.js.map +1 -1
  132. package/dist/lib/http/route.d.ts +3 -3
  133. package/dist/lib/http/route.d.ts.map +1 -1
  134. package/dist/lib/http/route.js +1 -1
  135. package/dist/lib/http/route.js.map +1 -1
  136. package/dist/lib/http/router.d.ts +12 -11
  137. package/dist/lib/http/router.d.ts.map +1 -1
  138. package/dist/lib/http/router.js +26 -34
  139. package/dist/lib/http/router.js.map +1 -1
  140. package/dist/lib/http/security-headers.js +1 -1
  141. package/dist/lib/http/security-headers.js.map +1 -1
  142. package/dist/lib/http/stream.d.ts +3 -3
  143. package/dist/lib/http/stream.d.ts.map +1 -1
  144. package/dist/lib/http/types.d.ts +1 -1
  145. package/dist/lib/http/types.d.ts.map +1 -1
  146. package/dist/lib/send-web-page.d.ts +8 -0
  147. package/dist/lib/send-web-page.d.ts.map +1 -0
  148. package/dist/{output → lib}/send-web-page.js +9 -7
  149. package/dist/lib/send-web-page.js.map +1 -0
  150. package/dist/lib/util/authorization-header.d.ts.map +1 -1
  151. package/dist/lib/util/color.d.ts +32 -0
  152. package/dist/lib/util/color.d.ts.map +1 -0
  153. package/dist/lib/util/color.js +116 -0
  154. package/dist/lib/util/color.js.map +1 -0
  155. package/dist/lib/util/crypto.d.ts +1 -0
  156. package/dist/lib/util/crypto.d.ts.map +1 -1
  157. package/dist/lib/util/crypto.js +8 -3
  158. package/dist/lib/util/crypto.js.map +1 -1
  159. package/dist/lib/util/function.d.ts +1 -0
  160. package/dist/lib/util/function.d.ts.map +1 -1
  161. package/dist/lib/util/function.js +12 -0
  162. package/dist/lib/util/function.js.map +1 -1
  163. package/dist/lib/util/locale.d.ts +20 -0
  164. package/dist/lib/util/locale.d.ts.map +1 -0
  165. package/dist/lib/util/locale.js +14 -0
  166. package/dist/lib/util/locale.js.map +1 -0
  167. package/dist/lib/util/time.d.ts +1 -1
  168. package/dist/lib/util/time.d.ts.map +1 -1
  169. package/dist/lib/util/time.js +1 -1
  170. package/dist/lib/util/time.js.map +1 -1
  171. package/dist/lib/util/type.d.ts +22 -0
  172. package/dist/lib/util/type.d.ts.map +1 -1
  173. package/dist/lib/util/type.js.map +1 -1
  174. package/dist/lib/util/ui8.d.ts +4 -0
  175. package/dist/lib/util/ui8.d.ts.map +1 -0
  176. package/dist/lib/util/ui8.js +17 -0
  177. package/dist/lib/util/ui8.js.map +1 -0
  178. package/dist/lib/util/zod-error.d.ts +2 -0
  179. package/dist/lib/util/zod-error.d.ts.map +1 -0
  180. package/dist/lib/util/zod-error.js +16 -0
  181. package/dist/lib/util/zod-error.js.map +1 -0
  182. package/dist/oauth-errors.d.ts +22 -22
  183. package/dist/oauth-errors.d.ts.map +1 -1
  184. package/dist/oauth-errors.js +37 -45
  185. package/dist/oauth-errors.js.map +1 -1
  186. package/dist/oauth-hooks.d.ts +11 -23
  187. package/dist/oauth-hooks.d.ts.map +1 -1
  188. package/dist/oauth-hooks.js.map +1 -1
  189. package/dist/oauth-middleware.d.ts +12 -0
  190. package/dist/oauth-middleware.d.ts.map +1 -0
  191. package/dist/oauth-middleware.js +32 -0
  192. package/dist/oauth-middleware.js.map +1 -0
  193. package/dist/oauth-provider.d.ts +109 -113
  194. package/dist/oauth-provider.d.ts.map +1 -1
  195. package/dist/oauth-provider.js +124 -542
  196. package/dist/oauth-provider.js.map +1 -1
  197. package/dist/oauth-verifier.d.ts +7 -26
  198. package/dist/oauth-verifier.d.ts.map +1 -1
  199. package/dist/oauth-verifier.js +6 -16
  200. package/dist/oauth-verifier.js.map +1 -1
  201. package/dist/request/code.d.ts.map +1 -1
  202. package/dist/request/request-data.d.ts +2 -4
  203. package/dist/request/request-data.d.ts.map +1 -1
  204. package/dist/request/request-data.js.map +1 -1
  205. package/dist/request/request-manager.d.ts +4 -2
  206. package/dist/request/request-manager.d.ts.map +1 -1
  207. package/dist/request/request-manager.js +9 -8
  208. package/dist/request/request-manager.js.map +1 -1
  209. package/dist/request/request-store.d.ts +6 -0
  210. package/dist/request/request-store.d.ts.map +1 -1
  211. package/dist/request/request-store.js +3 -1
  212. package/dist/request/request-store.js.map +1 -1
  213. package/dist/result/authorization-redirect-parameters.d.ts +18 -0
  214. package/dist/result/authorization-redirect-parameters.d.ts.map +1 -0
  215. package/dist/result/authorization-redirect-parameters.js +3 -0
  216. package/dist/result/authorization-redirect-parameters.js.map +1 -0
  217. package/dist/result/authorization-result-authorize-page.d.ts +13 -0
  218. package/dist/result/authorization-result-authorize-page.d.ts.map +1 -0
  219. package/dist/result/authorization-result-authorize-page.js +3 -0
  220. package/dist/result/authorization-result-authorize-page.js.map +1 -0
  221. package/dist/result/authorization-result-redirect.d.ts +8 -0
  222. package/dist/result/authorization-result-redirect.d.ts.map +1 -0
  223. package/dist/result/authorization-result-redirect.js +3 -0
  224. package/dist/result/authorization-result-redirect.js.map +1 -0
  225. package/dist/router/assets/assets-manifest.d.ts +10 -0
  226. package/dist/router/assets/assets-manifest.d.ts.map +1 -0
  227. package/dist/router/assets/assets-manifest.js +77 -0
  228. package/dist/router/assets/assets-manifest.js.map +1 -0
  229. package/dist/router/assets/assets.d.ts +16 -0
  230. package/dist/router/assets/assets.d.ts.map +1 -0
  231. package/dist/router/assets/assets.js +43 -0
  232. package/dist/router/assets/assets.js.map +1 -0
  233. package/dist/router/assets/csrf.d.ts +4 -0
  234. package/dist/router/assets/csrf.d.ts.map +1 -0
  235. package/dist/router/assets/csrf.js +51 -0
  236. package/dist/router/assets/csrf.js.map +1 -0
  237. package/dist/router/assets/send-account-page.d.ts +7 -0
  238. package/dist/router/assets/send-account-page.d.ts.map +1 -0
  239. package/dist/router/assets/send-account-page.js +34 -0
  240. package/dist/router/assets/send-account-page.js.map +1 -0
  241. package/dist/router/assets/send-authorization-page.d.ts +5 -0
  242. package/dist/router/assets/send-authorization-page.d.ts.map +1 -0
  243. package/dist/router/assets/send-authorization-page.js +49 -0
  244. package/dist/router/assets/send-authorization-page.js.map +1 -0
  245. package/dist/router/assets/send-error-page.d.ts +4 -0
  246. package/dist/router/assets/send-error-page.d.ts.map +1 -0
  247. package/dist/router/assets/send-error-page.js +34 -0
  248. package/dist/router/assets/send-error-page.js.map +1 -0
  249. package/dist/router/create-account-page-middleware.d.ts +6 -0
  250. package/dist/router/create-account-page-middleware.d.ts.map +1 -0
  251. package/dist/router/create-account-page-middleware.js +39 -0
  252. package/dist/router/create-account-page-middleware.js.map +1 -0
  253. package/dist/router/create-api-middleware.d.ts +8 -0
  254. package/dist/router/create-api-middleware.d.ts.map +1 -0
  255. package/dist/router/create-api-middleware.js +501 -0
  256. package/dist/router/create-api-middleware.js.map +1 -0
  257. package/dist/router/create-authorization-page-middleware.d.ts +6 -0
  258. package/dist/router/create-authorization-page-middleware.d.ts.map +1 -0
  259. package/dist/router/create-authorization-page-middleware.js +104 -0
  260. package/dist/router/create-authorization-page-middleware.js.map +1 -0
  261. package/dist/router/create-oauth-middleware.d.ts +6 -0
  262. package/dist/router/create-oauth-middleware.d.ts.map +1 -0
  263. package/dist/router/create-oauth-middleware.js +142 -0
  264. package/dist/router/create-oauth-middleware.js.map +1 -0
  265. package/dist/router/error-handler.d.ts +3 -0
  266. package/dist/router/error-handler.d.ts.map +1 -0
  267. package/dist/{account/account.js → router/error-handler.js} +1 -1
  268. package/dist/router/error-handler.js.map +1 -0
  269. package/dist/router/middleware-options.d.ts +6 -0
  270. package/dist/router/middleware-options.d.ts.map +1 -0
  271. package/dist/router/middleware-options.js +3 -0
  272. package/dist/router/middleware-options.js.map +1 -0
  273. package/dist/router/send-redirect.d.ts +16 -0
  274. package/dist/router/send-redirect.d.ts.map +1 -0
  275. package/dist/{output/send-authorize-redirect.js → router/send-redirect.js} +40 -24
  276. package/dist/router/send-redirect.js.map +1 -0
  277. package/dist/{token/token-claims.d.ts → signer/api-token-payload.d.ts} +237 -232
  278. package/dist/signer/api-token-payload.d.ts.map +1 -0
  279. package/dist/signer/api-token-payload.js +17 -0
  280. package/dist/signer/api-token-payload.js.map +1 -0
  281. package/dist/signer/signed-token-payload.d.ts +164 -159
  282. package/dist/signer/signed-token-payload.d.ts.map +1 -1
  283. package/dist/signer/signed-token-payload.js +10 -16
  284. package/dist/signer/signed-token-payload.js.map +1 -1
  285. package/dist/signer/signer.d.ts +42 -11246
  286. package/dist/signer/signer.d.ts.map +1 -1
  287. package/dist/signer/signer.js +30 -15
  288. package/dist/signer/signer.js.map +1 -1
  289. package/dist/token/refresh-token.d.ts.map +1 -1
  290. package/dist/token/token-data.d.ts +1 -1
  291. package/dist/token/token-data.d.ts.map +1 -1
  292. package/dist/token/token-id.d.ts.map +1 -1
  293. package/dist/token/token-manager.d.ts +28 -26
  294. package/dist/token/token-manager.d.ts.map +1 -1
  295. package/dist/token/token-manager.js +138 -196
  296. package/dist/token/token-manager.js.map +1 -1
  297. package/dist/token/token-store.d.ts +4 -4
  298. package/dist/token/token-store.d.ts.map +1 -1
  299. package/dist/token/token-store.js +1 -0
  300. package/dist/token/token-store.js.map +1 -1
  301. package/dist/token/verify-token-claims.d.ts +3 -3
  302. package/dist/token/verify-token-claims.d.ts.map +1 -1
  303. package/dist/token/verify-token-claims.js +1 -1
  304. package/dist/token/verify-token-claims.js.map +1 -1
  305. package/dist/types/email-otp.d.ts +3 -0
  306. package/dist/types/email-otp.d.ts.map +1 -0
  307. package/dist/types/email-otp.js +6 -0
  308. package/dist/types/email-otp.js.map +1 -0
  309. package/dist/types/email.d.ts +3 -0
  310. package/dist/types/email.d.ts.map +1 -0
  311. package/dist/types/email.js +29 -0
  312. package/dist/types/email.js.map +1 -0
  313. package/dist/types/handle.d.ts +3 -0
  314. package/dist/types/handle.d.ts.map +1 -0
  315. package/dist/types/handle.js +22 -0
  316. package/dist/types/handle.js.map +1 -0
  317. package/dist/types/invite-code.d.ts +4 -0
  318. package/dist/types/invite-code.d.ts.map +1 -0
  319. package/dist/types/invite-code.js +6 -0
  320. package/dist/types/invite-code.js.map +1 -0
  321. package/dist/types/password.d.ts +4 -0
  322. package/dist/types/password.d.ts.map +1 -0
  323. package/dist/types/password.js +7 -0
  324. package/dist/types/password.js.map +1 -0
  325. package/package.json +11 -14
  326. package/src/access-token/access-token-mode.ts +4 -0
  327. package/src/account/account-manager.ts +105 -75
  328. package/src/account/account-store.ts +118 -114
  329. package/src/account/sign-in-data.ts +10 -10
  330. package/src/account/sign-up-input.ts +13 -4
  331. package/src/client/client-manager.ts +34 -2
  332. package/src/client/client-store.ts +1 -1
  333. package/src/constants.ts +6 -1
  334. package/src/customization/branding.ts +12 -0
  335. package/src/customization/build-customization-css.ts +30 -0
  336. package/src/customization/build-customization-data.ts +22 -0
  337. package/src/customization/colors.ts +30 -0
  338. package/src/customization/customization.ts +25 -0
  339. package/src/customization/links.ts +10 -0
  340. package/src/device/device-id.ts +5 -0
  341. package/src/device/device-manager.ts +76 -66
  342. package/src/device/device-store.ts +2 -0
  343. package/src/errors/access-denied-error.ts +24 -17
  344. package/src/{output/build-error-payload.ts → errors/error-parser.ts} +1 -1
  345. package/src/errors/invalid-grant-error.ts +5 -0
  346. package/src/errors/login-required-error.ts +10 -0
  347. package/src/index.ts +1 -0
  348. package/src/lib/html/build-document.ts +6 -4
  349. package/src/{output/backend-data.ts → lib/html/hydration-data.ts} +7 -5
  350. package/src/lib/html/tags.ts +2 -2
  351. package/src/lib/http/accept.ts +3 -3
  352. package/src/lib/http/context.ts +41 -10
  353. package/src/lib/http/headers.ts +15 -0
  354. package/src/lib/http/index.ts +1 -0
  355. package/src/lib/http/middleware.ts +8 -23
  356. package/src/lib/http/request.ts +40 -75
  357. package/src/lib/http/response.ts +39 -15
  358. package/src/lib/http/route.ts +8 -5
  359. package/src/lib/http/router.ts +40 -46
  360. package/src/lib/http/security-headers.ts +1 -1
  361. package/src/lib/http/types.ts +1 -6
  362. package/src/{output → lib}/send-web-page.ts +10 -9
  363. package/src/lib/util/color.ts +132 -0
  364. package/src/lib/util/crypto.ts +9 -4
  365. package/src/lib/util/function.ts +14 -0
  366. package/src/lib/util/locale.ts +18 -0
  367. package/src/lib/util/time.ts +3 -4
  368. package/src/lib/util/type.ts +24 -0
  369. package/src/lib/util/ui8.ts +14 -0
  370. package/src/lib/util/zod-error.ts +14 -0
  371. package/src/oauth-errors.ts +22 -22
  372. package/src/oauth-hooks.ts +11 -24
  373. package/src/oauth-middleware.ts +53 -0
  374. package/src/oauth-provider.ts +290 -1061
  375. package/src/oauth-verifier.ts +9 -55
  376. package/src/request/request-data.ts +5 -4
  377. package/src/request/request-manager.ts +11 -11
  378. package/src/request/request-store.ts +7 -0
  379. package/src/result/authorization-redirect-parameters.ts +24 -0
  380. package/src/result/authorization-result-authorize-page.ts +14 -0
  381. package/src/result/authorization-result-redirect.ts +8 -0
  382. package/src/router/assets/assets-manifest.ts +115 -0
  383. package/src/router/assets/assets.ts +54 -0
  384. package/src/router/assets/csrf.ts +63 -0
  385. package/src/router/assets/send-account-page.ts +43 -0
  386. package/src/router/assets/send-authorization-page.ts +62 -0
  387. package/src/router/assets/send-error-page.ts +42 -0
  388. package/src/router/create-account-page-middleware.ts +69 -0
  389. package/src/router/create-api-middleware.ts +814 -0
  390. package/src/router/create-authorization-page-middleware.ts +173 -0
  391. package/src/router/create-oauth-middleware.ts +247 -0
  392. package/src/router/error-handler.ts +6 -0
  393. package/src/router/middleware-options.ts +9 -0
  394. package/src/router/send-redirect.ts +142 -0
  395. package/src/signer/api-token-payload.ts +18 -0
  396. package/src/signer/signed-token-payload.ts +18 -28
  397. package/src/signer/signer.ts +49 -34
  398. package/src/token/token-data.ts +1 -1
  399. package/src/token/token-manager.ts +190 -239
  400. package/src/token/token-store.ts +6 -4
  401. package/src/token/verify-token-claims.ts +4 -4
  402. package/src/types/email-otp.ts +3 -0
  403. package/src/types/email.ts +26 -0
  404. package/src/types/handle.ts +18 -0
  405. package/src/types/invite-code.ts +4 -0
  406. package/src/types/password.ts +4 -0
  407. package/tsconfig.build.tsbuildinfo +1 -0
  408. package/tsconfig.json +1 -1
  409. package/dist/access-token/access-token-type.d.ts +0 -6
  410. package/dist/access-token/access-token-type.d.ts.map +0 -1
  411. package/dist/access-token/access-token-type.js +0 -10
  412. package/dist/access-token/access-token-type.js.map +0 -1
  413. package/dist/account/account.d.ts +0 -2
  414. package/dist/account/account.d.ts.map +0 -1
  415. package/dist/account/account.js.map +0 -1
  416. package/dist/assets/assets-middleware.d.ts +0 -5
  417. package/dist/assets/assets-middleware.d.ts.map +0 -1
  418. package/dist/assets/assets-middleware.js +0 -41
  419. package/dist/assets/assets-middleware.js.map +0 -1
  420. package/dist/lib/locale.d.ts +0 -15
  421. package/dist/lib/locale.d.ts.map +0 -1
  422. package/dist/lib/locale.js +0 -17
  423. package/dist/lib/locale.js.map +0 -1
  424. package/dist/output/backend-data.d.ts +0 -4
  425. package/dist/output/backend-data.d.ts.map +0 -1
  426. package/dist/output/backend-data.js.map +0 -1
  427. package/dist/output/build-authorize-data.d.ts +0 -29
  428. package/dist/output/build-authorize-data.d.ts.map +0 -1
  429. package/dist/output/build-authorize-data.js +0 -21
  430. package/dist/output/build-authorize-data.js.map +0 -1
  431. package/dist/output/build-customization-data.d.ts +0 -234
  432. package/dist/output/build-customization-data.d.ts.map +0 -1
  433. package/dist/output/build-customization-data.js +0 -174
  434. package/dist/output/build-customization-data.js.map +0 -1
  435. package/dist/output/build-error-data.d.ts +0 -3
  436. package/dist/output/build-error-data.d.ts.map +0 -1
  437. package/dist/output/build-error-data.js +0 -10
  438. package/dist/output/build-error-data.js.map +0 -1
  439. package/dist/output/build-error-payload.d.ts.map +0 -1
  440. package/dist/output/build-error-payload.js.map +0 -1
  441. package/dist/output/output-manager.d.ts +0 -28
  442. package/dist/output/output-manager.d.ts.map +0 -1
  443. package/dist/output/output-manager.js +0 -134
  444. package/dist/output/output-manager.js.map +0 -1
  445. package/dist/output/send-authorize-redirect.d.ts +0 -25
  446. package/dist/output/send-authorize-redirect.d.ts.map +0 -1
  447. package/dist/output/send-authorize-redirect.js.map +0 -1
  448. package/dist/output/send-web-page.d.ts +0 -8
  449. package/dist/output/send-web-page.d.ts.map +0 -1
  450. package/dist/output/send-web-page.js.map +0 -1
  451. package/dist/token/token-claims.d.ts.map +0 -1
  452. package/dist/token/token-claims.js +0 -27
  453. package/dist/token/token-claims.js.map +0 -1
  454. package/src/access-token/access-token-type.ts +0 -5
  455. package/src/account/account.ts +0 -1
  456. package/src/assets/assets-middleware.ts +0 -44
  457. package/src/lib/locale.ts +0 -21
  458. package/src/output/build-authorize-data.ts +0 -53
  459. package/src/output/build-customization-data.ts +0 -217
  460. package/src/output/build-error-data.ts +0 -8
  461. package/src/output/output-manager.ts +0 -188
  462. package/src/output/send-authorize-redirect.ts +0 -137
  463. package/src/token/token-claims.ts +0 -30
  464. package/tsconfig.backend.tsbuildinfo +0 -1
  465. /package/{tsconfig.backend.json → tsconfig.build.json} +0 -0
@@ -0,0 +1,501 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createApiMiddleware = createApiMiddleware;
7
+ exports.parseRedirectUrl = parseRedirectUrl;
8
+ const http_errors_1 = __importDefault(require("http-errors"));
9
+ const zod_1 = require("zod");
10
+ const jwk_1 = require("@atproto/jwk");
11
+ const oauth_provider_api_1 = require("@atproto/oauth-provider-api");
12
+ const oauth_types_1 = require("@atproto/oauth-types");
13
+ const sign_in_data_js_1 = require("../account/sign-in-data.js");
14
+ const sign_up_input_js_1 = require("../account/sign-up-input.js");
15
+ const device_id_js_1 = require("../device/device-id.js");
16
+ const access_denied_error_js_1 = require("../errors/access-denied-error.js");
17
+ const error_parser_js_1 = require("../errors/error-parser.js");
18
+ const invalid_request_error_js_1 = require("../errors/invalid-request-error.js");
19
+ const www_authenticate_error_js_1 = require("../errors/www-authenticate-error.js");
20
+ const index_js_1 = require("../lib/http/index.js");
21
+ const route_js_1 = require("../lib/http/route.js");
22
+ const cast_js_1 = require("../lib/util/cast.js");
23
+ const locale_js_1 = require("../lib/util/locale.js");
24
+ const sub_js_1 = require("../oidc/sub.js");
25
+ const request_uri_js_1 = require("../request/request-uri.js");
26
+ const token_id_js_1 = require("../token/token-id.js");
27
+ const email_otp_js_1 = require("../types/email-otp.js");
28
+ const email_js_1 = require("../types/email.js");
29
+ const handle_js_1 = require("../types/handle.js");
30
+ const password_js_1 = require("../types/password.js");
31
+ const csrf_js_1 = require("./assets/csrf.js");
32
+ const send_redirect_js_1 = require("./send-redirect.js");
33
+ const verifyHandleSchema = zod_1.z.object({ handle: handle_js_1.handleSchema }).strict();
34
+ function createApiMiddleware(server, { onError }) {
35
+ const issuerUrl = new URL(server.issuer);
36
+ const issuerOrigin = issuerUrl.origin;
37
+ const router = new index_js_1.Router(issuerUrl);
38
+ router.use(apiRoute({
39
+ method: 'POST',
40
+ endpoint: '/verify-handle-availability',
41
+ schema: verifyHandleSchema,
42
+ async handler() {
43
+ await server.accountManager.verifyHandleAvailability(this.input.handle);
44
+ return { available: true };
45
+ },
46
+ }));
47
+ router.use(apiRoute({
48
+ method: 'POST',
49
+ endpoint: '/sign-up',
50
+ schema: sign_up_input_js_1.signUpInputSchema,
51
+ rotateDeviceCookies: true,
52
+ async handler() {
53
+ const { deviceId, deviceMetadata, input, requestUri } = this;
54
+ const account = await server.accountManager.createAccount(deviceId, deviceMetadata, input);
55
+ // Remember when not in the context of a request by default
56
+ const remember = requestUri == null;
57
+ // Only "remember" the newly created account if it was not created during an
58
+ // OAuth flow.
59
+ if (remember) {
60
+ await server.accountManager.upsertDeviceAccount(deviceId, account.sub);
61
+ }
62
+ const ephemeralToken = remember
63
+ ? undefined
64
+ : await server.signer.createEphemeralToken({
65
+ sub: account.sub,
66
+ deviceId,
67
+ requestUri: this.requestUri,
68
+ });
69
+ return { account, ephemeralToken };
70
+ },
71
+ }));
72
+ router.use(apiRoute({
73
+ method: 'POST',
74
+ endpoint: '/sign-in',
75
+ schema: sign_in_data_js_1.signInDataSchema.extend({ remember: zod_1.z.boolean().optional() }),
76
+ rotateDeviceCookies: true,
77
+ async handler() {
78
+ const { deviceId, deviceMetadata, requestUri } = this;
79
+ // Remember when not in the context of a request by default
80
+ const { remember = requestUri == null, ...input } = this.input;
81
+ const account = await server.accountManager.authenticateAccount(deviceId, deviceMetadata, input);
82
+ if (remember) {
83
+ await server.accountManager.upsertDeviceAccount(deviceId, account.sub);
84
+ }
85
+ else {
86
+ // In case the user was already signed in, and signed in again, this
87
+ // time without "remember me", let's sign them off of the device.
88
+ await server.accountManager.removeDeviceAccount(deviceId, account.sub);
89
+ }
90
+ const ephemeralToken = remember
91
+ ? undefined
92
+ : await server.signer.createEphemeralToken({
93
+ sub: account.sub,
94
+ deviceId,
95
+ requestUri,
96
+ });
97
+ if (requestUri) {
98
+ // Check if a consent is required for the client, but only if this
99
+ // call is made within the context of an oauth request.
100
+ const { clientId, parameters } = await server.requestManager.get(requestUri, deviceId);
101
+ const { authorizedClients } = await server.accountManager.getAccount(account.sub);
102
+ return {
103
+ account,
104
+ ephemeralToken,
105
+ consentRequired: server.checkConsentRequired(parameters, authorizedClients.get(clientId)),
106
+ };
107
+ }
108
+ return { account, ephemeralToken };
109
+ },
110
+ }));
111
+ router.use(apiRoute({
112
+ method: 'POST',
113
+ endpoint: '/sign-out',
114
+ schema: zod_1.z
115
+ .object({
116
+ sub: zod_1.z.union([sub_js_1.subSchema, zod_1.z.array(sub_js_1.subSchema)]),
117
+ })
118
+ .strict(),
119
+ rotateDeviceCookies: true,
120
+ async handler() {
121
+ const uniqueSubs = new Set((0, cast_js_1.asArray)(this.input.sub));
122
+ for (const sub of uniqueSubs) {
123
+ await server.accountManager.removeDeviceAccount(this.deviceId, sub);
124
+ }
125
+ return { success: true };
126
+ },
127
+ }));
128
+ router.use(apiRoute({
129
+ method: 'POST',
130
+ endpoint: '/reset-password-request',
131
+ schema: zod_1.z
132
+ .object({
133
+ locale: locale_js_1.localeSchema,
134
+ email: email_js_1.emailSchema,
135
+ })
136
+ .strict(),
137
+ async handler() {
138
+ await server.accountManager.resetPasswordRequest(this.input);
139
+ return { success: true };
140
+ },
141
+ }));
142
+ router.use(apiRoute({
143
+ method: 'POST',
144
+ endpoint: '/reset-password-confirm',
145
+ schema: zod_1.z
146
+ .object({
147
+ token: email_otp_js_1.emailOtpSchema,
148
+ password: password_js_1.newPasswordSchema,
149
+ })
150
+ .strict(),
151
+ async handler() {
152
+ await server.accountManager.resetPasswordConfirm(this.input);
153
+ return { success: true };
154
+ },
155
+ }));
156
+ router.use(apiRoute({
157
+ method: 'GET',
158
+ endpoint: '/device-sessions',
159
+ schema: undefined,
160
+ async handler() {
161
+ const deviceAccounts = await server.accountManager.listDeviceAccounts(this.deviceId);
162
+ return deviceAccounts.map((deviceAccount) => ({
163
+ account: deviceAccount.account,
164
+ loginRequired: server.checkLoginRequired(deviceAccount),
165
+ }));
166
+ },
167
+ }));
168
+ router.use(apiRoute({
169
+ method: 'GET',
170
+ endpoint: '/oauth-sessions',
171
+ schema: zod_1.z.object({ sub: sub_js_1.subSchema }).strict(),
172
+ async handler(req, res) {
173
+ const { account } = await authenticate.call(this, req, res);
174
+ const tokenInfos = await server.tokenManager.listAccountTokens(account.sub);
175
+ const clientIds = tokenInfos.map((tokenInfo) => tokenInfo.data.clientId);
176
+ const clients = await server.clientManager.loadClients(clientIds, {
177
+ onError: (err, clientId) => {
178
+ onError?.(req, res, err, `Failed to load client ${clientId}`);
179
+ return undefined; // metadata won't be available in the UI
180
+ },
181
+ });
182
+ // @TODO: We should ideally filter sessions that are expired (or even
183
+ // expose the expiration date). This requires a change to the way
184
+ // TokenInfo are stored (see TokenManager#isTokenExpired and
185
+ // TokenManager#isTokenInactive).
186
+ return tokenInfos.map(({ id, data }) => {
187
+ return {
188
+ tokenId: id,
189
+ createdAt: data.createdAt.toISOString(),
190
+ updatedAt: data.updatedAt.toISOString(),
191
+ clientId: data.clientId,
192
+ clientMetadata: clients.get(data.clientId)?.metadata,
193
+ scope: data.parameters.scope,
194
+ };
195
+ });
196
+ },
197
+ }));
198
+ router.use(apiRoute({
199
+ method: 'GET',
200
+ endpoint: '/account-sessions',
201
+ schema: zod_1.z.object({ sub: sub_js_1.subSchema }).strict(),
202
+ async handler(req, res) {
203
+ const { account } = await authenticate.call(this, req, res);
204
+ const deviceAccounts = await server.accountManager.listAccountDevices(account.sub);
205
+ return deviceAccounts.map((accountSession) => ({
206
+ deviceId: accountSession.deviceId,
207
+ deviceMetadata: {
208
+ ipAddress: accountSession.deviceData.ipAddress,
209
+ userAgent: accountSession.deviceData.userAgent,
210
+ lastSeenAt: accountSession.deviceData.lastSeenAt.toISOString(),
211
+ },
212
+ isCurrentDevice: accountSession.deviceId === this.deviceId,
213
+ }));
214
+ },
215
+ }));
216
+ router.use(apiRoute({
217
+ method: 'POST',
218
+ endpoint: '/revoke-account-session',
219
+ schema: zod_1.z.object({ sub: sub_js_1.subSchema, deviceId: device_id_js_1.deviceIdSchema }).strict(),
220
+ async handler() {
221
+ // @NOTE This route is not authenticated. If a user is able to steal
222
+ // another user's session cookie, we allow them to revoke the device
223
+ // session.
224
+ await server.accountManager.removeDeviceAccount(this.input.deviceId, this.input.sub);
225
+ return { success: true };
226
+ },
227
+ }));
228
+ router.use(apiRoute({
229
+ method: 'POST',
230
+ endpoint: '/revoke-oauth-session',
231
+ schema: zod_1.z.object({ sub: sub_js_1.subSchema, tokenId: token_id_js_1.tokenIdSchema }).strict(),
232
+ async handler(req, res) {
233
+ const { account } = await authenticate.call(this, req, res);
234
+ const tokenInfo = await server.tokenManager.getTokenInfo(this.input.tokenId);
235
+ if (tokenInfo.account.sub !== account.sub) {
236
+ // report this as though the token was not found
237
+ throw new invalid_request_error_js_1.InvalidRequestError(`Invalid token`);
238
+ }
239
+ await server.tokenManager.deleteToken(tokenInfo.id);
240
+ return { success: true };
241
+ },
242
+ }));
243
+ router.use(apiRoute({
244
+ method: 'POST',
245
+ endpoint: '/accept',
246
+ schema: zod_1.z.object({ sub: zod_1.z.union([sub_js_1.subSchema, jwk_1.signedJwtSchema]) }).strict(),
247
+ async handler(req, res) {
248
+ if (!this.requestUri) {
249
+ throw new invalid_request_error_js_1.InvalidRequestError('This endpoint can only be used in the context of an OAuth request');
250
+ }
251
+ // Any AccessDeniedError caught in this block will result in a redirect
252
+ // to the client's redirect_uri with an error.
253
+ try {
254
+ const { clientId, parameters } = await server.requestManager.get(this.requestUri, this.deviceId);
255
+ // Any error thrown in this block will be transformed into an
256
+ // AccessDeniedError.
257
+ try {
258
+ const { account, authorizedClients } = await authenticate.call(this, req, res);
259
+ const client = await server.clientManager.getClient(clientId);
260
+ const code = await server.requestManager.setAuthorized(this.requestUri, client, account, this.deviceId, this.deviceMetadata);
261
+ const clientData = authorizedClients.get(clientId);
262
+ if (server.checkConsentRequired(parameters, clientData)) {
263
+ const scopes = new Set(clientData?.authorizedScopes);
264
+ // Add the newly accepted scopes to the authorized scopes
265
+ // @NOTE `oauthScopeSchema` ensures that `scope` contains no
266
+ // leading/trailing/duplicate spaces.
267
+ for (const s of parameters.scope?.split(' ') ?? [])
268
+ scopes.add(s);
269
+ await server.accountManager.setAuthorizedClient(account, client, {
270
+ ...clientData,
271
+ authorizedScopes: [...scopes],
272
+ });
273
+ }
274
+ const url = buildRedirectUrl(server.issuer, parameters, { code });
275
+ return { url };
276
+ }
277
+ catch (err) {
278
+ // Since we have access to the parameters, we can re-throw an
279
+ // AccessDeniedError with the redirect_uri parameter.
280
+ throw access_denied_error_js_1.AccessDeniedError.from(parameters, err, 'server_error');
281
+ }
282
+ }
283
+ catch (err) {
284
+ // If any error happened (unauthenticated, invalid request, etc.),
285
+ // lets make sure the request can no longer be used.
286
+ try {
287
+ await server.requestManager.delete(this.requestUri);
288
+ }
289
+ catch (err) {
290
+ onError?.(req, res, err, 'Failed to delete request');
291
+ }
292
+ if (err instanceof access_denied_error_js_1.AccessDeniedError && err.parameters.redirect_uri) {
293
+ // Prefer logging the cause
294
+ onError?.(req, res, err.cause ?? err, 'Authorization failed');
295
+ const url = buildRedirectUrl(server.issuer, err.parameters, err.toJSON());
296
+ return { url };
297
+ }
298
+ throw err;
299
+ }
300
+ },
301
+ }));
302
+ router.use(apiRoute({
303
+ method: 'POST',
304
+ endpoint: '/reject',
305
+ schema: zod_1.z.object({}).strict(),
306
+ rotateDeviceCookies: true,
307
+ async handler(req, res) {
308
+ const { requestUri } = this;
309
+ if (!requestUri) {
310
+ throw new invalid_request_error_js_1.InvalidRequestError('This endpoint can only be used in the context of an OAuth request');
311
+ }
312
+ // Once this endpoint is called, the request will definitely be
313
+ // rejected.
314
+ try {
315
+ // No need to authenticate the user here as they are not authorizing a
316
+ // particular account (CSRF protection is enough).
317
+ // @NOTE that the client could *technically* trigger this endpoint while
318
+ // the user is on the authorize page by forging the request (because the
319
+ // client knows the RequestURI from PAR and has all the info needed to
320
+ // forge the request, including CSRF). This cannot be used as DoS attack
321
+ // as the request ID is not guessable and would only result in a bad UX
322
+ // for misbehaving clients, only for the users of those clients.
323
+ const { parameters } = await server.requestManager.get(requestUri, this.deviceId);
324
+ const url = buildRedirectUrl(server.issuer, parameters, {
325
+ error: 'access_denied',
326
+ error_description: 'The user rejected the request',
327
+ });
328
+ return { url };
329
+ }
330
+ catch (err) {
331
+ if (err instanceof access_denied_error_js_1.AccessDeniedError && err.parameters.redirect_uri) {
332
+ // Prefer logging the cause
333
+ onError?.(req, res, err.cause ?? err, 'Authorization failed');
334
+ const url = buildRedirectUrl(server.issuer, err.parameters, err.toJSON());
335
+ return { url };
336
+ }
337
+ throw err;
338
+ }
339
+ finally {
340
+ await server.requestManager.delete(requestUri).catch((err) => {
341
+ onError?.(req, res, err, 'Failed to delete request');
342
+ });
343
+ }
344
+ },
345
+ }));
346
+ return router.buildMiddleware();
347
+ async function authenticate(req, res) {
348
+ const authorization = req.headers.authorization?.split(' ');
349
+ if (authorization?.[0].toLowerCase() === 'bearer') {
350
+ try {
351
+ // If there is an authorization header, verify that the ephemeral token it
352
+ // contains is a jwt bound to the right [sub, device, request].
353
+ const ephemeralToken = jwk_1.signedJwtSchema.parse(authorization[1]);
354
+ const { payload } = await server.signer.verifyEphemeralToken(ephemeralToken);
355
+ if (payload.sub === this.input.sub &&
356
+ payload.deviceId === this.deviceId &&
357
+ payload.requestUri === this.requestUri) {
358
+ return await server.accountManager.getAccount(payload.sub);
359
+ }
360
+ }
361
+ catch (err) {
362
+ onError?.(req, res, err, 'Failed to authenticate ephemeral token');
363
+ // Fall back to session based authentication
364
+ }
365
+ }
366
+ try {
367
+ // Ensures the "sub" has an active session on the device
368
+ const deviceAccount = await server.accountManager.getDeviceAccount(this.deviceId, this.input.sub);
369
+ // The session exists but was created too long ago
370
+ if (server.checkLoginRequired(deviceAccount)) {
371
+ throw new invalid_request_error_js_1.InvalidRequestError('Login required');
372
+ }
373
+ return deviceAccount;
374
+ }
375
+ catch (err) {
376
+ throw new www_authenticate_error_js_1.WWWAuthenticateError('unauthorized', `User ${this.input.sub} not authenticated on this device`, { Bearer: {} }, err);
377
+ }
378
+ }
379
+ /**
380
+ * The main purpose of this function is to ensure that the endpoint
381
+ * implementation matches its type definition from {@link ApiEndpoints}.
382
+ * @private
383
+ */
384
+ function apiRoute(options) {
385
+ return (0, route_js_1.createRoute)(options.method, `${oauth_provider_api_1.API_ENDPOINT_PREFIX}${options.endpoint}`, apiMiddleware(options));
386
+ }
387
+ function apiMiddleware({ method, schema, rotateDeviceCookies, handler, }) {
388
+ const parseInput = schema == null // No schema means endpoint doesn't accept any input
389
+ ? async function (req) {
390
+ req.resume(); // Flush body
391
+ return undefined;
392
+ }
393
+ : method === 'POST'
394
+ ? async function (req) {
395
+ const body = await (0, index_js_1.parseHttpRequest)(req, ['json']);
396
+ return schema.parseAsync(body, { path: ['body'] });
397
+ }
398
+ : async function (req) {
399
+ // @NOTE This should not be necessary with GET requests
400
+ req.resume().once('error', (_err) => {
401
+ // Ignore errors when flushing the request body
402
+ // (e.g. client closed connection)
403
+ });
404
+ const query = Object.fromEntries(this.url.searchParams);
405
+ return schema.parseAsync(query, { path: ['query'] });
406
+ };
407
+ return (0, index_js_1.jsonHandler)(async function (req, res) {
408
+ try {
409
+ // Prevent caching of API routes
410
+ res.setHeader('Cache-Control', 'no-store');
411
+ res.setHeader('Pragma', 'no-cache');
412
+ // Prevent CORS requests
413
+ (0, index_js_1.validateFetchMode)(req, ['same-origin']);
414
+ (0, index_js_1.validateFetchSite)(req, ['same-origin']);
415
+ (0, index_js_1.validateOrigin)(req, issuerOrigin);
416
+ const referrer = (0, index_js_1.validateReferrer)(req, { origin: issuerOrigin });
417
+ // Ensure we are one the right page
418
+ if (
419
+ // trailing slashes are not allowed
420
+ referrer.pathname !== '/oauth/authorize' &&
421
+ referrer.pathname !== '/account' &&
422
+ !referrer.pathname.startsWith(`/account/`)) {
423
+ throw (0, http_errors_1.default)(400, `Invalid referrer ${referrer}`);
424
+ }
425
+ // Check if the request originated from the authorize page
426
+ const requestUri = referrer.pathname === '/oauth/authorize'
427
+ ? await request_uri_js_1.requestUriSchema.parseAsync(referrer.searchParams.get('request_uri'))
428
+ : undefined;
429
+ // Validate CSRF token
430
+ await (0, csrf_js_1.validateCsrfToken)(req, res);
431
+ // Parse and validate the input data
432
+ const input = await parseInput.call(this, req);
433
+ // Load session data, rotating the session cookie if needed
434
+ const { deviceId, deviceMetadata } = await server.deviceManager.load(req, res, rotateDeviceCookies);
435
+ const context = (0, index_js_1.subCtx)(this, {
436
+ input,
437
+ requestUri,
438
+ deviceId,
439
+ deviceMetadata,
440
+ });
441
+ // Generate the API response
442
+ const payload = await handler.call(context, req, res);
443
+ return { payload, status: 200 };
444
+ }
445
+ catch (err) {
446
+ onError?.(req, res, err, 'Failed to handle API request');
447
+ // @TODO Rework the API error responses (relying on codes)
448
+ const payload = (0, error_parser_js_1.buildErrorPayload)(err);
449
+ const status = (0, error_parser_js_1.buildErrorStatus)(err);
450
+ return { payload, status };
451
+ }
452
+ });
453
+ }
454
+ }
455
+ function buildRedirectUrl(iss, parameters, redirect) {
456
+ const url = new URL('/oauth/authorize/redirect', iss);
457
+ url.searchParams.set('redirect_mode', (0, send_redirect_js_1.buildRedirectMode)(parameters));
458
+ url.searchParams.set('redirect_uri', (0, send_redirect_js_1.buildRedirectUri)(parameters));
459
+ for (const [key, value] of (0, send_redirect_js_1.buildRedirectParams)(iss, parameters, redirect)) {
460
+ url.searchParams.set(key, value);
461
+ }
462
+ return url.href;
463
+ }
464
+ function parseRedirectUrl(url) {
465
+ if (url.pathname !== '/oauth/authorize/redirect') {
466
+ throw new invalid_request_error_js_1.InvalidRequestError(`Invalid redirect URL: ${url.pathname} is not a valid path`);
467
+ }
468
+ const params = [];
469
+ const state = url.searchParams.get('state');
470
+ if (state)
471
+ params.push(['state', state]);
472
+ const iss = url.searchParams.get('iss');
473
+ if (iss)
474
+ params.push(['iss', iss]);
475
+ if (url.searchParams.has('code')) {
476
+ for (const key of send_redirect_js_1.SUCCESS_REDIRECT_KEYS) {
477
+ const value = url.searchParams.get(key);
478
+ if (value != null)
479
+ params.push([key, value]);
480
+ }
481
+ }
482
+ else if (url.searchParams.has('error')) {
483
+ for (const key of send_redirect_js_1.ERROR_REDIRECT_KEYS) {
484
+ const value = url.searchParams.get(key);
485
+ if (value != null)
486
+ params.push([key, value]);
487
+ }
488
+ }
489
+ else {
490
+ throw new invalid_request_error_js_1.InvalidRequestError('Invalid redirect URL: neither code nor error found');
491
+ }
492
+ try {
493
+ const mode = oauth_types_1.oauthResponseModeSchema.parse(url.searchParams.get('redirect_mode'));
494
+ const redirectUri = oauth_types_1.oauthRedirectUriSchema.parse(url.searchParams.get('redirect_uri'));
495
+ return { mode, redirectUri, params };
496
+ }
497
+ catch (err) {
498
+ throw invalid_request_error_js_1.InvalidRequestError.from(err, 'Invalid redirect URL');
499
+ }
500
+ }
501
+ //# sourceMappingURL=create-api-middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-api-middleware.js","sourceRoot":"","sources":["../../src/router/create-api-middleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ import { Middleware } from '../lib/http/index.js';
3
+ import type { OAuthProvider } from '../oauth-provider.js';
4
+ import type { MiddlewareOptions } from './middleware-options.js';
5
+ export declare function createAuthorizationPageMiddleware<Ctx extends object | void = void, Req extends IncomingMessage = IncomingMessage, Res extends ServerResponse = ServerResponse>(server: OAuthProvider, { onError }: MiddlewareOptions<Req, Res>): Middleware<Ctx, Req, Res>;
6
+ //# sourceMappingURL=create-authorization-page-middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-authorization-page-middleware.d.ts","sourceRoot":"","sources":["../../src/router/create-authorization-page-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAOhE,OAAO,EACL,UAAU,EAQX,MAAM,sBAAsB,CAAA;AAG7B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAMzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAQhE,wBAAgB,iCAAiC,CAC/C,GAAG,SAAS,MAAM,GAAG,IAAI,GAAG,IAAI,EAChC,GAAG,SAAS,eAAe,GAAG,eAAe,EAC7C,GAAG,SAAS,cAAc,GAAG,cAAc,EAE3C,MAAM,EAAE,aAAa,EACrB,EAAE,OAAO,EAAE,EAAE,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,GACvC,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAmH3B"}
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createAuthorizationPageMiddleware = createAuthorizationPageMiddleware;
4
+ const oauth_types_1 = require("@atproto/oauth-types");
5
+ const access_denied_error_js_1 = require("../errors/access-denied-error.js");
6
+ const invalid_request_error_js_1 = require("../errors/invalid-request-error.js");
7
+ const index_js_1 = require("../lib/http/index.js");
8
+ const zod_error_js_1 = require("../lib/util/zod-error.js");
9
+ const request_uri_js_1 = require("../request/request-uri.js");
10
+ const send_authorization_page_js_1 = require("./assets/send-authorization-page.js");
11
+ const send_error_page_js_1 = require("./assets/send-error-page.js");
12
+ const create_api_middleware_js_1 = require("./create-api-middleware.js");
13
+ const send_redirect_js_1 = require("./send-redirect.js");
14
+ function createAuthorizationPageMiddleware(server, { onError }) {
15
+ const sendAuthorizePage = (0, send_authorization_page_js_1.sendAuthorizePageFactory)(server.customization);
16
+ const sendErrorPage = (0, send_error_page_js_1.sendErrorPageFactory)(server.customization);
17
+ const issuerUrl = new URL(server.issuer);
18
+ const issuerOrigin = issuerUrl.origin;
19
+ const router = new index_js_1.Router(issuerUrl);
20
+ router.get('/oauth/authorize', withErrorHandler(async function (req, res) {
21
+ res.setHeader('Cache-Control', 'no-store');
22
+ res.setHeader('Pragma', 'no-cache');
23
+ (0, index_js_1.validateFetchSite)(req, ['cross-site', 'none']);
24
+ (0, index_js_1.validateFetchMode)(req, ['navigate']);
25
+ (0, index_js_1.validateFetchDest)(req, ['document']);
26
+ (0, index_js_1.validateOrigin)(req, issuerOrigin);
27
+ const query = Object.fromEntries(this.url.searchParams);
28
+ const clientCredentials = await oauth_types_1.oauthClientCredentialsSchema
29
+ .parseAsync(query, { path: ['query'] })
30
+ .catch(throwInvalidRequest);
31
+ if ('client_secret' in clientCredentials) {
32
+ throw new invalid_request_error_js_1.InvalidRequestError('Client secret must not be provided');
33
+ }
34
+ const authorizationRequest = await oauth_types_1.oauthAuthorizationRequestQuerySchema
35
+ .parseAsync(query, { path: ['query'] })
36
+ .catch(throwInvalidRequest);
37
+ const deviceInfo = await server.deviceManager.load(req, res);
38
+ try {
39
+ const result = await server.authorize(clientCredentials, authorizationRequest, deviceInfo.deviceId, deviceInfo.deviceMetadata);
40
+ if ('redirect' in result) {
41
+ return sendAuthorizeRedirect(res, result);
42
+ }
43
+ else {
44
+ return sendAuthorizePage(req, res, result);
45
+ }
46
+ }
47
+ catch (err) {
48
+ // If we have the "redirect_uri" parameter, we can redirect the user
49
+ // to the client with an error.
50
+ if (err instanceof access_denied_error_js_1.AccessDeniedError && err.parameters.redirect_uri) {
51
+ // Prefer logging the cause
52
+ onError?.(req, res, err.cause ?? err, 'Authorization failed');
53
+ return sendAuthorizeRedirect(res, {
54
+ issuer: server.issuer,
55
+ parameters: err.parameters,
56
+ redirect: err.toJSON(),
57
+ });
58
+ }
59
+ throw err;
60
+ }
61
+ }));
62
+ // This is a private endpoint that will be called by the user after the
63
+ // authorization request was either approved or denied. The logic performed
64
+ // here **could** be performed directly in the frontend. We decided to
65
+ // implement it here to avoid duplicating the logic.
66
+ router.get('/oauth/authorize/redirect', withErrorHandler(async function (req, res) {
67
+ // Ensure we come from the authorization page
68
+ (0, index_js_1.validateFetchSite)(req, ['same-origin']);
69
+ (0, index_js_1.validateFetchMode)(req, ['navigate']);
70
+ (0, index_js_1.validateFetchDest)(req, ['document']);
71
+ (0, index_js_1.validateOrigin)(req, issuerOrigin);
72
+ const referrer = (0, index_js_1.validateReferrer)(req, {
73
+ origin: issuerOrigin,
74
+ pathname: '/oauth/authorize',
75
+ });
76
+ // Ensure we are coming from the authorization page
77
+ request_uri_js_1.requestUriSchema.parse(referrer.searchParams.get('request_uri'));
78
+ return (0, send_redirect_js_1.sendRedirect)(res, (0, create_api_middleware_js_1.parseRedirectUrl)(this.url));
79
+ }));
80
+ return router.buildMiddleware();
81
+ function withErrorHandler(handler) {
82
+ return async function (req, res) {
83
+ try {
84
+ await handler.call(this, req, res);
85
+ }
86
+ catch (err) {
87
+ onError?.(req, res, err, `Failed to handle navigation request to "${req.url}"`);
88
+ if (!res.headersSent) {
89
+ sendErrorPage(req, res, err);
90
+ }
91
+ }
92
+ };
93
+ }
94
+ }
95
+ function throwInvalidRequest(err) {
96
+ throw new invalid_request_error_js_1.InvalidRequestError((0, zod_error_js_1.extractZodErrorMessage)(err) ?? 'Input validation error', err);
97
+ }
98
+ function sendAuthorizeRedirect(res, { issuer, parameters, redirect }) {
99
+ const redirectUri = (0, send_redirect_js_1.buildRedirectUri)(parameters);
100
+ const mode = (0, send_redirect_js_1.buildRedirectMode)(parameters);
101
+ const params = (0, send_redirect_js_1.buildRedirectParams)(issuer, parameters, redirect);
102
+ return (0, send_redirect_js_1.sendRedirect)(res, { mode, redirectUri, params });
103
+ }
104
+ //# sourceMappingURL=create-authorization-page-middleware.js.map