@atproto/oauth-provider 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (631) hide show
  1. package/.postcssrc.yml +3 -0
  2. package/CHANGELOG.md +19 -0
  3. package/LICENSE.txt +7 -0
  4. package/dist/access-token/access-token-type.d.ts +6 -0
  5. package/dist/access-token/access-token-type.d.ts.map +1 -0
  6. package/dist/access-token/access-token-type.js +10 -0
  7. package/dist/access-token/access-token-type.js.map +1 -0
  8. package/dist/account/account-manager.d.ts +14 -0
  9. package/dist/account/account-manager.d.ts.map +1 -0
  10. package/dist/account/account-manager.js +39 -0
  11. package/dist/account/account-manager.js.map +1 -0
  12. package/dist/account/account-store.d.ts +39 -0
  13. package/dist/account/account-store.d.ts.map +1 -0
  14. package/dist/account/account-store.js +19 -0
  15. package/dist/account/account-store.js.map +1 -0
  16. package/dist/account/account.d.ts +8 -0
  17. package/dist/account/account.d.ts.map +1 -0
  18. package/dist/account/account.js +3 -0
  19. package/dist/account/account.js.map +1 -0
  20. package/dist/assets/app/bundle-manifest.json +22 -0
  21. package/dist/assets/app/main.css +3 -0
  22. package/dist/assets/app/main.js +20 -0
  23. package/dist/assets/app/main.js.map +1 -0
  24. package/dist/assets/asset.d.ts +9 -0
  25. package/dist/assets/asset.d.ts.map +1 -0
  26. package/dist/assets/asset.js +3 -0
  27. package/dist/assets/asset.js.map +1 -0
  28. package/dist/assets/assets-middleware.d.ts +2 -0
  29. package/dist/assets/assets-middleware.d.ts.map +1 -0
  30. package/dist/assets/assets-middleware.js +30 -0
  31. package/dist/assets/assets-middleware.js.map +1 -0
  32. package/dist/assets/index.d.ts +4 -0
  33. package/dist/assets/index.d.ts.map +1 -0
  34. package/dist/assets/index.js +65 -0
  35. package/dist/assets/index.js.map +1 -0
  36. package/dist/client/client-auth.d.ts +13 -0
  37. package/dist/client/client-auth.d.ts.map +1 -0
  38. package/dist/client/client-auth.js +35 -0
  39. package/dist/client/client-auth.js.map +1 -0
  40. package/dist/client/client-data.d.ts +8 -0
  41. package/dist/client/client-data.d.ts.map +1 -0
  42. package/dist/client/client-data.js +3 -0
  43. package/dist/client/client-data.js.map +1 -0
  44. package/dist/client/client-id.d.ts +4 -0
  45. package/dist/client/client-id.d.ts.map +1 -0
  46. package/dist/client/client-id.js +6 -0
  47. package/dist/client/client-id.js.map +1 -0
  48. package/dist/client/client-info.d.ts +13 -0
  49. package/dist/client/client-info.d.ts.map +1 -0
  50. package/dist/client/client-info.js +3 -0
  51. package/dist/client/client-info.js.map +1 -0
  52. package/dist/client/client-manager.d.ts +38 -0
  53. package/dist/client/client-manager.d.ts.map +1 -0
  54. package/dist/client/client-manager.js +534 -0
  55. package/dist/client/client-manager.js.map +1 -0
  56. package/dist/client/client-store.d.ts +13 -0
  57. package/dist/client/client-store.d.ts.map +1 -0
  58. package/dist/client/client-store.js +39 -0
  59. package/dist/client/client-store.js.map +1 -0
  60. package/dist/client/client-utils.d.ts +6 -0
  61. package/dist/client/client-utils.d.ts.map +1 -0
  62. package/dist/client/client-utils.js +40 -0
  63. package/dist/client/client-utils.js.map +1 -0
  64. package/dist/client/client.d.ts +41 -0
  65. package/dist/client/client.d.ts.map +1 -0
  66. package/dist/client/client.js +163 -0
  67. package/dist/client/client.js.map +1 -0
  68. package/dist/constants.d.ts +42 -0
  69. package/dist/constants.d.ts.map +1 -0
  70. package/dist/constants.js +53 -0
  71. package/dist/constants.js.map +1 -0
  72. package/dist/device/device-data.d.ts +20 -0
  73. package/dist/device/device-data.d.ts.map +1 -0
  74. package/dist/device/device-data.js +11 -0
  75. package/dist/device/device-data.js.map +1 -0
  76. package/dist/device/device-details.d.ts +17 -0
  77. package/dist/device/device-details.d.ts.map +1 -0
  78. package/dist/device/device-details.js +34 -0
  79. package/dist/device/device-details.js.map +1 -0
  80. package/dist/device/device-id.d.ts +6 -0
  81. package/dist/device/device-id.d.ts.map +1 -0
  82. package/dist/device/device-id.js +18 -0
  83. package/dist/device/device-id.js.map +1 -0
  84. package/dist/device/device-manager.d.ts +88 -0
  85. package/dist/device/device-manager.d.ts.map +1 -0
  86. package/dist/device/device-manager.js +206 -0
  87. package/dist/device/device-manager.js.map +1 -0
  88. package/dist/device/device-store.d.ts +15 -0
  89. package/dist/device/device-store.d.ts.map +1 -0
  90. package/dist/device/device-store.js +36 -0
  91. package/dist/device/device-store.js.map +1 -0
  92. package/dist/device/session-id.d.ts +6 -0
  93. package/dist/device/session-id.d.ts.map +1 -0
  94. package/dist/device/session-id.js +18 -0
  95. package/dist/device/session-id.js.map +1 -0
  96. package/dist/dpop/dpop-manager.d.ts +33 -0
  97. package/dist/dpop/dpop-manager.d.ts.map +1 -0
  98. package/dist/dpop/dpop-manager.js +115 -0
  99. package/dist/dpop/dpop-manager.js.map +1 -0
  100. package/dist/dpop/dpop-nonce.d.ts +13 -0
  101. package/dist/dpop/dpop-nonce.d.ts.map +1 -0
  102. package/dist/dpop/dpop-nonce.js +94 -0
  103. package/dist/dpop/dpop-nonce.js.map +1 -0
  104. package/dist/errors/access-denied-error.d.ts +8 -0
  105. package/dist/errors/access-denied-error.d.ts.map +1 -0
  106. package/dist/errors/access-denied-error.js +21 -0
  107. package/dist/errors/access-denied-error.js.map +1 -0
  108. package/dist/errors/account-selection-required-error.d.ts +6 -0
  109. package/dist/errors/account-selection-required-error.d.ts.map +1 -0
  110. package/dist/errors/account-selection-required-error.js +11 -0
  111. package/dist/errors/account-selection-required-error.js.map +1 -0
  112. package/dist/errors/consent-required-error.d.ts +6 -0
  113. package/dist/errors/consent-required-error.d.ts.map +1 -0
  114. package/dist/errors/consent-required-error.js +11 -0
  115. package/dist/errors/consent-required-error.js.map +1 -0
  116. package/dist/errors/invalid-authorization-details-error.d.ts +20 -0
  117. package/dist/errors/invalid-authorization-details-error.d.ts.map +1 -0
  118. package/dist/errors/invalid-authorization-details-error.js +26 -0
  119. package/dist/errors/invalid-authorization-details-error.js.map +1 -0
  120. package/dist/errors/invalid-client-error.d.ts +18 -0
  121. package/dist/errors/invalid-client-error.d.ts.map +1 -0
  122. package/dist/errors/invalid-client-error.js +24 -0
  123. package/dist/errors/invalid-client-error.js.map +1 -0
  124. package/dist/errors/invalid-client-id-error.d.ts +13 -0
  125. package/dist/errors/invalid-client-id-error.d.ts.map +1 -0
  126. package/dist/errors/invalid-client-id-error.js +25 -0
  127. package/dist/errors/invalid-client-id-error.js.map +1 -0
  128. package/dist/errors/invalid-client-metadata-error.d.ts +13 -0
  129. package/dist/errors/invalid-client-metadata-error.d.ts.map +1 -0
  130. package/dist/errors/invalid-client-metadata-error.js +23 -0
  131. package/dist/errors/invalid-client-metadata-error.js.map +1 -0
  132. package/dist/errors/invalid-dpop-key-binding-error.d.ts +12 -0
  133. package/dist/errors/invalid-dpop-key-binding-error.d.ts.map +1 -0
  134. package/dist/errors/invalid-dpop-key-binding-error.js +20 -0
  135. package/dist/errors/invalid-dpop-key-binding-error.js.map +1 -0
  136. package/dist/errors/invalid-dpop-proof-error.d.ts +5 -0
  137. package/dist/errors/invalid-dpop-proof-error.d.ts.map +1 -0
  138. package/dist/errors/invalid-dpop-proof-error.js +12 -0
  139. package/dist/errors/invalid-dpop-proof-error.js.map +1 -0
  140. package/dist/errors/invalid-grant-error.d.ts +14 -0
  141. package/dist/errors/invalid-grant-error.d.ts.map +1 -0
  142. package/dist/errors/invalid-grant-error.js +20 -0
  143. package/dist/errors/invalid-grant-error.js.map +1 -0
  144. package/dist/errors/invalid-parameters-error.d.ts +6 -0
  145. package/dist/errors/invalid-parameters-error.d.ts.map +1 -0
  146. package/dist/errors/invalid-parameters-error.js +11 -0
  147. package/dist/errors/invalid-parameters-error.js.map +1 -0
  148. package/dist/errors/invalid-redirect-uri-error.d.ts +11 -0
  149. package/dist/errors/invalid-redirect-uri-error.d.ts.map +1 -0
  150. package/dist/errors/invalid-redirect-uri-error.js +21 -0
  151. package/dist/errors/invalid-redirect-uri-error.js.map +1 -0
  152. package/dist/errors/invalid-request-error.d.ts +28 -0
  153. package/dist/errors/invalid-request-error.d.ts.map +1 -0
  154. package/dist/errors/invalid-request-error.js +34 -0
  155. package/dist/errors/invalid-request-error.js.map +1 -0
  156. package/dist/errors/invalid-token-error.d.ts +16 -0
  157. package/dist/errors/invalid-token-error.d.ts.map +1 -0
  158. package/dist/errors/invalid-token-error.js +45 -0
  159. package/dist/errors/invalid-token-error.js.map +1 -0
  160. package/dist/errors/login-required-error.d.ts +6 -0
  161. package/dist/errors/login-required-error.d.ts.map +1 -0
  162. package/dist/errors/login-required-error.js +11 -0
  163. package/dist/errors/login-required-error.js.map +1 -0
  164. package/dist/errors/oauth-error.d.ts +13 -0
  165. package/dist/errors/oauth-error.d.ts.map +1 -0
  166. package/dist/errors/oauth-error.js +29 -0
  167. package/dist/errors/oauth-error.js.map +1 -0
  168. package/dist/errors/unauthorized-client-error.d.ts +18 -0
  169. package/dist/errors/unauthorized-client-error.d.ts.map +1 -0
  170. package/dist/errors/unauthorized-client-error.js +24 -0
  171. package/dist/errors/unauthorized-client-error.js.map +1 -0
  172. package/dist/errors/use-dpop-nonce-error.d.ts +18 -0
  173. package/dist/errors/use-dpop-nonce-error.d.ts.map +1 -0
  174. package/dist/errors/use-dpop-nonce-error.js +27 -0
  175. package/dist/errors/use-dpop-nonce-error.js.map +1 -0
  176. package/dist/errors/www-authenticate-error.d.ts +9 -0
  177. package/dist/errors/www-authenticate-error.d.ts.map +1 -0
  178. package/dist/errors/www-authenticate-error.js +46 -0
  179. package/dist/errors/www-authenticate-error.js.map +1 -0
  180. package/dist/index.d.ts +14 -0
  181. package/dist/index.d.ts.map +1 -0
  182. package/dist/index.js +31 -0
  183. package/dist/index.js.map +1 -0
  184. package/dist/lib/html/build-document.d.ts +32 -0
  185. package/dist/lib/html/build-document.d.ts.map +1 -0
  186. package/dist/lib/html/build-document.js +61 -0
  187. package/dist/lib/html/build-document.js.map +1 -0
  188. package/dist/lib/html/escapers.d.ts +9 -0
  189. package/dist/lib/html/escapers.d.ts.map +1 -0
  190. package/dist/lib/html/escapers.js +66 -0
  191. package/dist/lib/html/escapers.js.map +1 -0
  192. package/dist/lib/html/html.d.ts +13 -0
  193. package/dist/lib/html/html.d.ts.map +1 -0
  194. package/dist/lib/html/html.js +53 -0
  195. package/dist/lib/html/html.js.map +1 -0
  196. package/dist/lib/html/index.d.ts +4 -0
  197. package/dist/lib/html/index.d.ts.map +1 -0
  198. package/dist/lib/html/index.js +21 -0
  199. package/dist/lib/html/index.js.map +1 -0
  200. package/dist/lib/html/tags.d.ts +34 -0
  201. package/dist/lib/html/tags.d.ts.map +1 -0
  202. package/dist/lib/html/tags.js +47 -0
  203. package/dist/lib/html/tags.js.map +1 -0
  204. package/dist/lib/html/util.d.ts +4 -0
  205. package/dist/lib/html/util.d.ts.map +1 -0
  206. package/dist/lib/html/util.js +20 -0
  207. package/dist/lib/html/util.js.map +1 -0
  208. package/dist/lib/http/accept.d.ts +29 -0
  209. package/dist/lib/http/accept.d.ts.map +1 -0
  210. package/dist/lib/http/accept.js +67 -0
  211. package/dist/lib/http/accept.js.map +1 -0
  212. package/dist/lib/http/context.d.ts +5 -0
  213. package/dist/lib/http/context.d.ts.map +1 -0
  214. package/dist/lib/http/context.js +10 -0
  215. package/dist/lib/http/context.js.map +1 -0
  216. package/dist/lib/http/index.d.ts +10 -0
  217. package/dist/lib/http/index.d.ts.map +1 -0
  218. package/dist/lib/http/index.js +26 -0
  219. package/dist/lib/http/index.js.map +1 -0
  220. package/dist/lib/http/method.d.ts +6 -0
  221. package/dist/lib/http/method.d.ts.map +1 -0
  222. package/dist/lib/http/method.js +19 -0
  223. package/dist/lib/http/method.js.map +1 -0
  224. package/dist/lib/http/middleware.d.ts +18 -0
  225. package/dist/lib/http/middleware.d.ts.map +1 -0
  226. package/dist/lib/http/middleware.js +118 -0
  227. package/dist/lib/http/middleware.js.map +1 -0
  228. package/dist/lib/http/parser.d.ts +33 -0
  229. package/dist/lib/http/parser.d.ts.map +1 -0
  230. package/dist/lib/http/parser.js +48 -0
  231. package/dist/lib/http/parser.js.map +1 -0
  232. package/dist/lib/http/path.d.ts +9 -0
  233. package/dist/lib/http/path.d.ts.map +1 -0
  234. package/dist/lib/http/path.js +54 -0
  235. package/dist/lib/http/path.js.map +1 -0
  236. package/dist/lib/http/request.d.ts +33 -0
  237. package/dist/lib/http/request.d.ts.map +1 -0
  238. package/dist/lib/http/request.js +86 -0
  239. package/dist/lib/http/request.js.map +1 -0
  240. package/dist/lib/http/response.d.ts +13 -0
  241. package/dist/lib/http/response.d.ts.map +1 -0
  242. package/dist/lib/http/response.js +98 -0
  243. package/dist/lib/http/response.js.map +1 -0
  244. package/dist/lib/http/route.d.ts +25 -0
  245. package/dist/lib/http/route.d.ts.map +1 -0
  246. package/dist/lib/http/route.js +39 -0
  247. package/dist/lib/http/route.js.map +1 -0
  248. package/dist/lib/http/router.d.ts +32 -0
  249. package/dist/lib/http/router.d.ts.map +1 -0
  250. package/dist/lib/http/router.js +74 -0
  251. package/dist/lib/http/router.js.map +1 -0
  252. package/dist/lib/http/stream.d.ts +13 -0
  253. package/dist/lib/http/stream.d.ts.map +1 -0
  254. package/dist/lib/http/stream.js +46 -0
  255. package/dist/lib/http/stream.js.map +1 -0
  256. package/dist/lib/http/types.d.ts +7 -0
  257. package/dist/lib/http/types.d.ts.map +1 -0
  258. package/dist/lib/http/types.js +3 -0
  259. package/dist/lib/http/types.js.map +1 -0
  260. package/dist/lib/http/url.d.ts +8 -0
  261. package/dist/lib/http/url.d.ts.map +1 -0
  262. package/dist/lib/http/url.js +22 -0
  263. package/dist/lib/http/url.js.map +1 -0
  264. package/dist/lib/redis.d.ts +5 -0
  265. package/dist/lib/redis.d.ts.map +1 -0
  266. package/dist/lib/redis.js +22 -0
  267. package/dist/lib/redis.js.map +1 -0
  268. package/dist/lib/util/authorization-header.d.ts +4 -0
  269. package/dist/lib/util/authorization-header.d.ts.map +1 -0
  270. package/dist/lib/util/authorization-header.js +23 -0
  271. package/dist/lib/util/authorization-header.js.map +1 -0
  272. package/dist/lib/util/cast.d.ts +2 -0
  273. package/dist/lib/util/cast.d.ts.map +1 -0
  274. package/dist/lib/util/cast.js +10 -0
  275. package/dist/lib/util/cast.js.map +1 -0
  276. package/dist/lib/util/crypto.d.ts +3 -0
  277. package/dist/lib/util/crypto.d.ts.map +1 -0
  278. package/dist/lib/util/crypto.js +29 -0
  279. package/dist/lib/util/crypto.js.map +1 -0
  280. package/dist/lib/util/date.d.ts +3 -0
  281. package/dist/lib/util/date.d.ts.map +1 -0
  282. package/dist/lib/util/date.js +12 -0
  283. package/dist/lib/util/date.js.map +1 -0
  284. package/dist/lib/util/hostname.d.ts +6 -0
  285. package/dist/lib/util/hostname.d.ts.map +1 -0
  286. package/dist/lib/util/hostname.js +24 -0
  287. package/dist/lib/util/hostname.js.map +1 -0
  288. package/dist/lib/util/redirect-uri.d.ts +7 -0
  289. package/dist/lib/util/redirect-uri.d.ts.map +1 -0
  290. package/dist/lib/util/redirect-uri.js +44 -0
  291. package/dist/lib/util/redirect-uri.js.map +1 -0
  292. package/dist/lib/util/time.d.ts +6 -0
  293. package/dist/lib/util/time.d.ts.map +1 -0
  294. package/dist/lib/util/time.js +28 -0
  295. package/dist/lib/util/time.js.map +1 -0
  296. package/dist/lib/util/type.d.ts +6 -0
  297. package/dist/lib/util/type.d.ts.map +1 -0
  298. package/dist/lib/util/type.js +3 -0
  299. package/dist/lib/util/type.js.map +1 -0
  300. package/dist/lib/util/well-known.d.ts +3 -0
  301. package/dist/lib/util/well-known.d.ts.map +1 -0
  302. package/dist/lib/util/well-known.js +11 -0
  303. package/dist/lib/util/well-known.js.map +1 -0
  304. package/dist/metadata/build-metadata.d.ts +14 -0
  305. package/dist/metadata/build-metadata.d.ts.map +1 -0
  306. package/dist/metadata/build-metadata.js +132 -0
  307. package/dist/metadata/build-metadata.js.map +1 -0
  308. package/dist/oauth-client.d.ts +4 -0
  309. package/dist/oauth-client.d.ts.map +1 -0
  310. package/dist/oauth-client.js +19 -0
  311. package/dist/oauth-client.js.map +1 -0
  312. package/dist/oauth-dpop.d.ts +3 -0
  313. package/dist/oauth-dpop.d.ts.map +1 -0
  314. package/dist/oauth-dpop.js +19 -0
  315. package/dist/oauth-dpop.js.map +1 -0
  316. package/dist/oauth-errors.d.ts +20 -0
  317. package/dist/oauth-errors.d.ts.map +1 -0
  318. package/dist/oauth-errors.js +43 -0
  319. package/dist/oauth-errors.js.map +1 -0
  320. package/dist/oauth-hooks.d.ts +42 -0
  321. package/dist/oauth-hooks.d.ts.map +1 -0
  322. package/dist/oauth-hooks.js +3 -0
  323. package/dist/oauth-hooks.js.map +1 -0
  324. package/dist/oauth-provider.d.ts +179 -0
  325. package/dist/oauth-provider.d.ts.map +1 -0
  326. package/dist/oauth-provider.js +748 -0
  327. package/dist/oauth-provider.js.map +1 -0
  328. package/dist/oauth-store.d.ts +11 -0
  329. package/dist/oauth-store.d.ts.map +1 -0
  330. package/dist/oauth-store.js +27 -0
  331. package/dist/oauth-store.js.map +1 -0
  332. package/dist/oauth-verifier.d.ts +66 -0
  333. package/dist/oauth-verifier.d.ts.map +1 -0
  334. package/dist/oauth-verifier.js +94 -0
  335. package/dist/oauth-verifier.js.map +1 -0
  336. package/dist/oidc/claims.d.ts +16 -0
  337. package/dist/oidc/claims.d.ts.map +1 -0
  338. package/dist/oidc/claims.js +29 -0
  339. package/dist/oidc/claims.js.map +1 -0
  340. package/dist/oidc/sub.d.ts +4 -0
  341. package/dist/oidc/sub.d.ts.map +1 -0
  342. package/dist/oidc/sub.js +6 -0
  343. package/dist/oidc/sub.js.map +1 -0
  344. package/dist/oidc/userinfo.d.ts +7 -0
  345. package/dist/oidc/userinfo.d.ts.map +1 -0
  346. package/dist/oidc/userinfo.js +3 -0
  347. package/dist/oidc/userinfo.js.map +1 -0
  348. package/dist/output/build-error-payload.d.ts +6 -0
  349. package/dist/output/build-error-payload.d.ts.map +1 -0
  350. package/dist/output/build-error-payload.js +108 -0
  351. package/dist/output/build-error-payload.js.map +1 -0
  352. package/dist/output/customization.d.ts +37 -0
  353. package/dist/output/customization.d.ts.map +1 -0
  354. package/dist/output/customization.js +62 -0
  355. package/dist/output/customization.js.map +1 -0
  356. package/dist/output/send-authorize-page.d.ts +43 -0
  357. package/dist/output/send-authorize-page.d.ts.map +1 -0
  358. package/dist/output/send-authorize-page.js +49 -0
  359. package/dist/output/send-authorize-page.js.map +1 -0
  360. package/dist/output/send-authorize-redirect.d.ts +25 -0
  361. package/dist/output/send-authorize-redirect.d.ts.map +1 -0
  362. package/dist/output/send-authorize-redirect.js +72 -0
  363. package/dist/output/send-authorize-redirect.js.map +1 -0
  364. package/dist/output/send-error-page.d.ts +5 -0
  365. package/dist/output/send-error-page.d.ts.map +1 -0
  366. package/dist/output/send-error-page.js +31 -0
  367. package/dist/output/send-error-page.js.map +1 -0
  368. package/dist/output/send-web-page.d.ts +8 -0
  369. package/dist/output/send-web-page.d.ts.map +1 -0
  370. package/dist/output/send-web-page.js +48 -0
  371. package/dist/output/send-web-page.js.map +1 -0
  372. package/dist/parameters/claims-requested.d.ts +3 -0
  373. package/dist/parameters/claims-requested.d.ts.map +1 -0
  374. package/dist/parameters/claims-requested.js +77 -0
  375. package/dist/parameters/claims-requested.js.map +1 -0
  376. package/dist/parameters/oidc-payload.d.ts +31 -0
  377. package/dist/parameters/oidc-payload.d.ts.map +1 -0
  378. package/dist/parameters/oidc-payload.js +25 -0
  379. package/dist/parameters/oidc-payload.js.map +1 -0
  380. package/dist/replay/replay-manager.d.ts +10 -0
  381. package/dist/replay/replay-manager.d.ts.map +1 -0
  382. package/dist/replay/replay-manager.js +23 -0
  383. package/dist/replay/replay-manager.js.map +1 -0
  384. package/dist/replay/replay-store-memory.d.ts +11 -0
  385. package/dist/replay/replay-store-memory.d.ts.map +1 -0
  386. package/dist/replay/replay-store-memory.js +30 -0
  387. package/dist/replay/replay-store-memory.js.map +1 -0
  388. package/dist/replay/replay-store-redis.d.ts +16 -0
  389. package/dist/replay/replay-store-redis.d.ts.map +1 -0
  390. package/dist/replay/replay-store-redis.js +20 -0
  391. package/dist/replay/replay-store-redis.js.map +1 -0
  392. package/dist/replay/replay-store.d.ts +16 -0
  393. package/dist/replay/replay-store.d.ts.map +1 -0
  394. package/dist/replay/replay-store.js +22 -0
  395. package/dist/replay/replay-store.js.map +1 -0
  396. package/dist/request/code.d.ts +7 -0
  397. package/dist/request/code.d.ts.map +1 -0
  398. package/dist/request/code.js +20 -0
  399. package/dist/request/code.js.map +1 -0
  400. package/dist/request/request-data.d.ts +21 -0
  401. package/dist/request/request-data.d.ts.map +1 -0
  402. package/dist/request/request-data.js +6 -0
  403. package/dist/request/request-data.js.map +1 -0
  404. package/dist/request/request-id.d.ts +6 -0
  405. package/dist/request/request-id.d.ts.map +1 -0
  406. package/dist/request/request-id.js +18 -0
  407. package/dist/request/request-id.js.map +1 -0
  408. package/dist/request/request-info.d.ts +12 -0
  409. package/dist/request/request-info.d.ts.map +1 -0
  410. package/dist/request/request-info.js +3 -0
  411. package/dist/request/request-info.js.map +1 -0
  412. package/dist/request/request-manager.d.ts +40 -0
  413. package/dist/request/request-manager.d.ts.map +1 -0
  414. package/dist/request/request-manager.js +310 -0
  415. package/dist/request/request-manager.js.map +1 -0
  416. package/dist/request/request-store-memory.d.ts +16 -0
  417. package/dist/request/request-store-memory.d.ts.map +1 -0
  418. package/dist/request/request-store-memory.js +31 -0
  419. package/dist/request/request-store-memory.js.map +1 -0
  420. package/dist/request/request-store-redis.d.ts +24 -0
  421. package/dist/request/request-store-redis.d.ts.map +1 -0
  422. package/dist/request/request-store-redis.js +58 -0
  423. package/dist/request/request-store-redis.js.map +1 -0
  424. package/dist/request/request-store.d.ts +27 -0
  425. package/dist/request/request-store.d.ts.map +1 -0
  426. package/dist/request/request-store.js +37 -0
  427. package/dist/request/request-store.js.map +1 -0
  428. package/dist/request/request-uri.d.ts +8 -0
  429. package/dist/request/request-uri.d.ts.map +1 -0
  430. package/dist/request/request-uri.js +24 -0
  431. package/dist/request/request-uri.js.map +1 -0
  432. package/dist/request/types.d.ts +328 -0
  433. package/dist/request/types.d.ts.map +1 -0
  434. package/dist/request/types.js +27 -0
  435. package/dist/request/types.js.map +1 -0
  436. package/dist/signer/signed-token-payload.d.ts +1694 -0
  437. package/dist/signer/signed-token-payload.d.ts.map +1 -0
  438. package/dist/signer/signed-token-payload.js +32 -0
  439. package/dist/signer/signed-token-payload.js.map +1 -0
  440. package/dist/signer/signer.d.ts +193 -0
  441. package/dist/signer/signer.d.ts.map +1 -0
  442. package/dist/signer/signer.js +101 -0
  443. package/dist/signer/signer.js.map +1 -0
  444. package/dist/token/refresh-token.d.ts +7 -0
  445. package/dist/token/refresh-token.d.ts.map +1 -0
  446. package/dist/token/refresh-token.js +20 -0
  447. package/dist/token/refresh-token.js.map +1 -0
  448. package/dist/token/token-claims.d.ts +1687 -0
  449. package/dist/token/token-claims.d.ts.map +1 -0
  450. package/dist/token/token-claims.js +30 -0
  451. package/dist/token/token-claims.js.map +1 -0
  452. package/dist/token/token-data.d.ts +20 -0
  453. package/dist/token/token-data.d.ts.map +1 -0
  454. package/dist/token/token-data.js +3 -0
  455. package/dist/token/token-data.js.map +1 -0
  456. package/dist/token/token-id.d.ts +7 -0
  457. package/dist/token/token-id.d.ts.map +1 -0
  458. package/dist/token/token-id.js +20 -0
  459. package/dist/token/token-id.js.map +1 -0
  460. package/dist/token/token-manager.d.ts +48 -0
  461. package/dist/token/token-manager.d.ts.map +1 -0
  462. package/dist/token/token-manager.js +421 -0
  463. package/dist/token/token-manager.js.map +1 -0
  464. package/dist/token/token-store.d.ts +35 -0
  465. package/dist/token/token-store.d.ts.map +1 -0
  466. package/dist/token/token-store.js +38 -0
  467. package/dist/token/token-store.js.map +1 -0
  468. package/dist/token/types.d.ts +250 -0
  469. package/dist/token/types.d.ts.map +1 -0
  470. package/dist/token/types.js +36 -0
  471. package/dist/token/types.js.map +1 -0
  472. package/dist/token/verify-token-claims.d.ts +17 -0
  473. package/dist/token/verify-token-claims.d.ts.map +1 -0
  474. package/dist/token/verify-token-claims.js +39 -0
  475. package/dist/token/verify-token-claims.js.map +1 -0
  476. package/package.json +83 -0
  477. package/rollup.config.js +55 -0
  478. package/src/access-token/access-token-type.ts +5 -0
  479. package/src/account/account-manager.ts +55 -0
  480. package/src/account/account-store.ts +74 -0
  481. package/src/account/account.ts +10 -0
  482. package/src/assets/app/app.tsx +28 -0
  483. package/src/assets/app/backend-data.ts +65 -0
  484. package/src/assets/app/components/accept-form.tsx +112 -0
  485. package/src/assets/app/components/account-identifier.tsx +18 -0
  486. package/src/assets/app/components/account-picker.tsx +108 -0
  487. package/src/assets/app/components/client-identifier.tsx +32 -0
  488. package/src/assets/app/components/client-name.tsx +30 -0
  489. package/src/assets/app/components/error-card.tsx +41 -0
  490. package/src/assets/app/components/help-card.tsx +42 -0
  491. package/src/assets/app/components/layout-title-page.tsx +43 -0
  492. package/src/assets/app/components/layout-welcome.tsx +58 -0
  493. package/src/assets/app/components/sign-in-form.tsx +290 -0
  494. package/src/assets/app/components/sign-up-account-form.tsx +210 -0
  495. package/src/assets/app/components/sign-up-disclaimer.tsx +44 -0
  496. package/src/assets/app/components/url-viewer.tsx +70 -0
  497. package/src/assets/app/cookies.ts +11 -0
  498. package/src/assets/app/hooks/use-api.ts +104 -0
  499. package/src/assets/app/hooks/use-bound-dispatch.ts +5 -0
  500. package/src/assets/app/hooks/use-csrf-token.ts +5 -0
  501. package/src/assets/app/lib/api.ts +64 -0
  502. package/src/assets/app/lib/clsx.ts +4 -0
  503. package/src/assets/app/lib/util.ts +10 -0
  504. package/src/assets/app/main.css +11 -0
  505. package/src/assets/app/main.tsx +28 -0
  506. package/src/assets/app/views/accept-view.tsx +51 -0
  507. package/src/assets/app/views/authorize-view.tsx +101 -0
  508. package/src/assets/app/views/error-view.tsx +27 -0
  509. package/src/assets/app/views/sign-in-view.tsx +121 -0
  510. package/src/assets/app/views/sign-up-view.tsx +93 -0
  511. package/src/assets/app/views/welcome-view.tsx +61 -0
  512. package/src/assets/asset.ts +8 -0
  513. package/src/assets/assets-middleware.ts +32 -0
  514. package/src/assets/index.ts +74 -0
  515. package/src/client/client-auth.ts +45 -0
  516. package/src/client/client-data.ts +9 -0
  517. package/src/client/client-id.ts +4 -0
  518. package/src/client/client-info.ts +13 -0
  519. package/src/client/client-manager.ts +818 -0
  520. package/src/client/client-store.ts +38 -0
  521. package/src/client/client-utils.ts +43 -0
  522. package/src/client/client.ts +231 -0
  523. package/src/constants.ts +69 -0
  524. package/src/device/device-data.ts +11 -0
  525. package/src/device/device-details.ts +43 -0
  526. package/src/device/device-id.ts +23 -0
  527. package/src/device/device-manager.ts +287 -0
  528. package/src/device/device-store.ts +35 -0
  529. package/src/device/session-id.ts +22 -0
  530. package/src/dpop/dpop-manager.ts +147 -0
  531. package/src/dpop/dpop-nonce.ts +104 -0
  532. package/src/errors/access-denied-error.ts +26 -0
  533. package/src/errors/account-selection-required-error.ts +12 -0
  534. package/src/errors/consent-required-error.ts +12 -0
  535. package/src/errors/invalid-authorization-details-error.ts +22 -0
  536. package/src/errors/invalid-client-error.ts +20 -0
  537. package/src/errors/invalid-client-id-error.ts +20 -0
  538. package/src/errors/invalid-client-metadata-error.ts +19 -0
  539. package/src/errors/invalid-dpop-key-binding-error.ts +21 -0
  540. package/src/errors/invalid-dpop-proof-error.ts +13 -0
  541. package/src/errors/invalid-grant-error.ts +16 -0
  542. package/src/errors/invalid-parameters-error.ts +12 -0
  543. package/src/errors/invalid-redirect-uri-error.ts +17 -0
  544. package/src/errors/invalid-request-error.ts +30 -0
  545. package/src/errors/invalid-token-error.ts +59 -0
  546. package/src/errors/login-required-error.ts +12 -0
  547. package/src/errors/oauth-error.ts +28 -0
  548. package/src/errors/unauthorized-client-error.ts +20 -0
  549. package/src/errors/use-dpop-nonce-error.ts +32 -0
  550. package/src/errors/www-authenticate-error.ts +65 -0
  551. package/src/index.ts +15 -0
  552. package/src/lib/html/README.md +9 -0
  553. package/src/lib/html/build-document.ts +98 -0
  554. package/src/lib/html/escapers.ts +66 -0
  555. package/src/lib/html/html.ts +61 -0
  556. package/src/lib/html/index.ts +5 -0
  557. package/src/lib/html/tags.ts +58 -0
  558. package/src/lib/html/util.ts +21 -0
  559. package/src/lib/http/README.md +11 -0
  560. package/src/lib/http/accept.ts +91 -0
  561. package/src/lib/http/context.ts +11 -0
  562. package/src/lib/http/index.ts +9 -0
  563. package/src/lib/http/method.ts +18 -0
  564. package/src/lib/http/middleware.ts +183 -0
  565. package/src/lib/http/parser.ts +64 -0
  566. package/src/lib/http/path.ts +82 -0
  567. package/src/lib/http/request.ts +141 -0
  568. package/src/lib/http/response.ts +133 -0
  569. package/src/lib/http/route.ts +56 -0
  570. package/src/lib/http/router.ts +118 -0
  571. package/src/lib/http/stream.ts +78 -0
  572. package/src/lib/http/types.ts +22 -0
  573. package/src/lib/http/url.ts +23 -0
  574. package/src/lib/redis.ts +23 -0
  575. package/src/lib/util/authorization-header.ts +26 -0
  576. package/src/lib/util/cast.ts +4 -0
  577. package/src/lib/util/crypto.ts +27 -0
  578. package/src/lib/util/date.ts +7 -0
  579. package/src/lib/util/hostname.ts +19 -0
  580. package/src/lib/util/redirect-uri.ts +46 -0
  581. package/src/lib/util/time.ts +33 -0
  582. package/src/lib/util/type.ts +4 -0
  583. package/src/lib/util/well-known.ts +8 -0
  584. package/src/metadata/build-metadata.ts +165 -0
  585. package/src/oauth-client.ts +3 -0
  586. package/src/oauth-dpop.ts +2 -0
  587. package/src/oauth-errors.ts +21 -0
  588. package/src/oauth-hooks.ts +66 -0
  589. package/src/oauth-provider.ts +1409 -0
  590. package/src/oauth-store.ts +11 -0
  591. package/src/oauth-verifier.ts +219 -0
  592. package/src/oidc/claims.ts +35 -0
  593. package/src/oidc/sub.ts +4 -0
  594. package/src/oidc/userinfo.ts +11 -0
  595. package/src/output/build-error-payload.ts +143 -0
  596. package/src/output/customization.ts +96 -0
  597. package/src/output/send-authorize-page.ts +111 -0
  598. package/src/output/send-authorize-redirect.ts +130 -0
  599. package/src/output/send-error-page.ts +41 -0
  600. package/src/output/send-web-page.ts +66 -0
  601. package/src/parameters/claims-requested.ts +106 -0
  602. package/src/parameters/oidc-payload.ts +28 -0
  603. package/src/replay/replay-manager.ts +38 -0
  604. package/src/replay/replay-store-memory.ts +36 -0
  605. package/src/replay/replay-store-redis.ts +31 -0
  606. package/src/replay/replay-store.ts +44 -0
  607. package/src/request/code.ts +24 -0
  608. package/src/request/request-data.ts +26 -0
  609. package/src/request/request-id.ts +23 -0
  610. package/src/request/request-info.ts +12 -0
  611. package/src/request/request-manager.ts +479 -0
  612. package/src/request/request-store-memory.ts +39 -0
  613. package/src/request/request-store-redis.ts +71 -0
  614. package/src/request/request-store.ts +54 -0
  615. package/src/request/request-uri.ts +29 -0
  616. package/src/request/types.ts +48 -0
  617. package/src/signer/signed-token-payload.ts +35 -0
  618. package/src/signer/signer.ts +165 -0
  619. package/src/token/refresh-token.ts +31 -0
  620. package/src/token/token-claims.ts +31 -0
  621. package/src/token/token-data.ts +33 -0
  622. package/src/token/token-id.ts +26 -0
  623. package/src/token/token-manager.ts +591 -0
  624. package/src/token/token-store.ts +78 -0
  625. package/src/token/types.ts +86 -0
  626. package/src/token/verify-token-claims.ts +65 -0
  627. package/tailwind.config.js +13 -0
  628. package/tsconfig.backend.json +9 -0
  629. package/tsconfig.frontend.json +11 -0
  630. package/tsconfig.json +8 -0
  631. package/tsconfig.tools.json +8 -0
@@ -0,0 +1,20 @@
1
+ import { OAuthError } from './oauth-error.js'
2
+
3
+ /**
4
+ * @see {@link https://datatracker.ietf.org/doc/html/rfc7591#section-3.2.2 | RFC7591 - Client Registration Error Response}
5
+ *
6
+ * The value of one of the client metadata fields is invalid and the server has
7
+ * rejected this request. Note that an authorization server MAY choose to
8
+ * substitute a valid value for any requested parameter of a client's metadata.
9
+ */
10
+ export class InvalidClientIdError extends OAuthError {
11
+ constructor(error_description: string, cause?: unknown) {
12
+ super('invalid_client_id', error_description, 400, cause)
13
+ }
14
+
15
+ static from(err: unknown): InvalidClientIdError {
16
+ if (err instanceof InvalidClientIdError) return err
17
+ if (err instanceof TypeError) return new InvalidClientIdError(err.message)
18
+ return new InvalidClientIdError('Invalid client identifier', err)
19
+ }
20
+ }
@@ -0,0 +1,19 @@
1
+ import { OAuthError } from './oauth-error.js'
2
+
3
+ /**
4
+ * @see {@link https://datatracker.ietf.org/doc/html/rfc7591#section-3.2.2 | RFC7591 - Client Registration Error Response}
5
+ *
6
+ * The value of one of the client metadata fields is invalid and the server has
7
+ * rejected this request. Note that an authorization server MAY choose to
8
+ * substitute a valid value for any requested parameter of a client's metadata.
9
+ */
10
+ export class InvalidClientMetadataError extends OAuthError {
11
+ constructor(error_description: string, cause?: unknown) {
12
+ super('invalid_client_metadata', error_description, 400, cause)
13
+ }
14
+
15
+ static from(cause: unknown): InvalidClientMetadataError {
16
+ if (cause instanceof InvalidClientMetadataError) return cause
17
+ return new InvalidClientMetadataError('Invalid client configuration', cause)
18
+ }
19
+ }
@@ -0,0 +1,21 @@
1
+ import { WWWAuthenticateError } from './www-authenticate-error.js'
2
+
3
+ /**
4
+ * @see
5
+ * {@link https://datatracker.ietf.org/doc/html/rfc6750#section-3.1 | RFC6750 - The WWW-Authenticate Response Header Field}
6
+ *
7
+ * @see
8
+ * {@link https://datatracker.ietf.org/doc/html/rfc9449#name-the-dpop-authentication-sch | RFC9449 - The DPoP Authentication Scheme}
9
+ */
10
+ export class InvalidDpopKeyBindingError extends WWWAuthenticateError {
11
+ constructor(cause?: unknown) {
12
+ const error = 'invalid_token'
13
+ const error_description = 'Invalid DPoP key binding'
14
+ super(
15
+ error,
16
+ error_description,
17
+ { DPoP: { error, error_description } },
18
+ cause,
19
+ )
20
+ }
21
+ }
@@ -0,0 +1,13 @@
1
+ import { WWWAuthenticateError } from './www-authenticate-error.js'
2
+
3
+ export class InvalidDpopProofError extends WWWAuthenticateError {
4
+ constructor(error_description: string, cause?: unknown) {
5
+ const error = 'invalid_dpop_proof'
6
+ super(
7
+ error,
8
+ error_description,
9
+ { DPoP: { error, error_description } },
10
+ cause,
11
+ )
12
+ }
13
+ }
@@ -0,0 +1,16 @@
1
+ import { OAuthError } from './oauth-error.js'
2
+
3
+ /**
4
+ * @see
5
+ * {@link https://datatracker.ietf.org/doc/html/rfc6749#section-5.2 | RFC6749 - Issuing an Access Token }
6
+ *
7
+ * The provided authorization grant (e.g., authorization code, resource owner
8
+ * credentials) or refresh token is invalid, expired, revoked, does not match
9
+ * the redirection URI used in the authorization request, or was issued to
10
+ * another client.
11
+ */
12
+ export class InvalidGrantError extends OAuthError {
13
+ constructor(error_description: string, cause?: unknown) {
14
+ super('invalid_grant', error_description, 400, cause)
15
+ }
16
+ }
@@ -0,0 +1,12 @@
1
+ import { OAuthAuthenticationRequestParameters } from '@atproto/oauth-types'
2
+ import { AccessDeniedError } from './access-denied-error.js'
3
+
4
+ export class InvalidParametersError extends AccessDeniedError {
5
+ constructor(
6
+ parameters: OAuthAuthenticationRequestParameters,
7
+ error_description: string,
8
+ cause?: unknown,
9
+ ) {
10
+ super(parameters, error_description, 'invalid_request', cause)
11
+ }
12
+ }
@@ -0,0 +1,17 @@
1
+ import { OAuthError } from './oauth-error.js'
2
+
3
+ /**
4
+ * @see {@link https://datatracker.ietf.org/doc/html/rfc7591#section-3.2.2 | RFC7591}
5
+ *
6
+ * The value of one or more redirection URIs is invalid.
7
+ */
8
+ export class InvalidRedirectUriError extends OAuthError {
9
+ constructor(error_description: string, cause?: unknown) {
10
+ super('invalid_redirect_uri', error_description, 400, cause)
11
+ }
12
+
13
+ static from(cause?: unknown): InvalidRedirectUriError {
14
+ if (cause instanceof InvalidRedirectUriError) return cause
15
+ return new InvalidRedirectUriError('Invalid redirect URI', cause)
16
+ }
17
+ }
@@ -0,0 +1,30 @@
1
+ import { OAuthError } from './oauth-error.js'
2
+
3
+ /**
4
+ * @see
5
+ * {@link https://datatracker.ietf.org/doc/html/rfc6749#section-5.2 | RFC6749 - Issuing an Access Token }
6
+ *
7
+ * The request is missing a required parameter, includes an unsupported
8
+ * parameter value (other than grant type), repeats a parameter, includes
9
+ * multiple credentials, utilizes more than one mechanism for authenticating the
10
+ * client, or is otherwise malformed.
11
+ *
12
+ * @see
13
+ * {@link https://datatracker.ietf.org/doc/html/rfc6749#section-4.1.2.1 | RFC6749 - Authorization Code Grant, Authorization Request}
14
+ *
15
+ * The request is missing a required parameter, includes an invalid parameter
16
+ * value, includes a parameter more than once, or is otherwise malformed.
17
+ *
18
+ * @see
19
+ * {@link https://datatracker.ietf.org/doc/html/rfc6750#section-3.1 | RFC6750 - The WWW-Authenticate Response Header Field }
20
+ *
21
+ * The request is missing a required parameter, includes an unsupported
22
+ * parameter or parameter value, repeats the same parameter, uses more than one
23
+ * method for including an access token, or is otherwise malformed. The resource
24
+ * server SHOULD respond with the HTTP 400 (Bad Request) status code.
25
+ */
26
+ export class InvalidRequestError extends OAuthError {
27
+ constructor(error_description: string, cause?: unknown) {
28
+ super('invalid_request', error_description, 400, cause)
29
+ }
30
+ }
@@ -0,0 +1,59 @@
1
+ import { JwtVerifyError } from '@atproto/jwk'
2
+ import { JOSEError } from 'jose/errors'
3
+ import { ZodError } from 'zod'
4
+
5
+ import { OAuthError } from './oauth-error.js'
6
+ import { WWWAuthenticateError } from './www-authenticate-error.js'
7
+
8
+ /**
9
+ * @see
10
+ * {@link https://datatracker.ietf.org/doc/html/rfc6750#section-3.1 | RFC6750 - The WWW-Authenticate Response Header Field }
11
+ *
12
+ * The access token provided is expired, revoked, malformed, or invalid for
13
+ * other reasons. The resource SHOULD respond with the HTTP 401 (Unauthorized)
14
+ * status code. The client MAY request a new access token and retry the
15
+ * protected resource request.
16
+ */
17
+ export class InvalidTokenError extends WWWAuthenticateError {
18
+ static from(
19
+ err: unknown,
20
+ tokenType: string,
21
+ fallbackMessage = 'Invalid token',
22
+ ): InvalidTokenError {
23
+ if (err instanceof InvalidTokenError) {
24
+ return err
25
+ }
26
+
27
+ if (err instanceof OAuthError) {
28
+ return new InvalidTokenError(tokenType, err.error_description, err)
29
+ }
30
+
31
+ if (err instanceof JOSEError) {
32
+ return new InvalidTokenError(tokenType, err.message, err)
33
+ }
34
+
35
+ if (err instanceof JwtVerifyError) {
36
+ return new InvalidTokenError(tokenType, err.message, err)
37
+ }
38
+
39
+ if (err instanceof ZodError) {
40
+ return new InvalidTokenError(tokenType, err.message, err)
41
+ }
42
+
43
+ return new InvalidTokenError(tokenType, fallbackMessage, err)
44
+ }
45
+
46
+ constructor(
47
+ readonly tokenType: string,
48
+ error_description: string,
49
+ cause?: unknown,
50
+ ) {
51
+ const error = 'invalid_token'
52
+ super(
53
+ error,
54
+ error_description,
55
+ { [tokenType]: { error, error_description } },
56
+ cause,
57
+ )
58
+ }
59
+ }
@@ -0,0 +1,12 @@
1
+ import { OAuthAuthenticationRequestParameters } from '@atproto/oauth-types'
2
+ import { AccessDeniedError } from './access-denied-error.js'
3
+
4
+ export class LoginRequiredError extends AccessDeniedError {
5
+ constructor(
6
+ parameters: OAuthAuthenticationRequestParameters,
7
+ error_description = 'Login is required',
8
+ cause?: unknown,
9
+ ) {
10
+ super(parameters, error_description, 'login_required', cause)
11
+ }
12
+ }
@@ -0,0 +1,28 @@
1
+ export class OAuthError extends Error {
2
+ public expose: boolean
3
+
4
+ constructor(
5
+ public readonly error: string,
6
+ public readonly error_description: string,
7
+ public readonly status = 400,
8
+ cause?: unknown,
9
+ ) {
10
+ super(error_description, { cause })
11
+
12
+ Error.captureStackTrace?.(this, this.constructor)
13
+
14
+ this.name = this.constructor.name
15
+ this.expose = status < 500
16
+ }
17
+
18
+ get statusCode() {
19
+ return this.status
20
+ }
21
+
22
+ toJSON() {
23
+ return {
24
+ error: this.error,
25
+ error_description: this.error_description,
26
+ } as const
27
+ }
28
+ }
@@ -0,0 +1,20 @@
1
+ import { OAuthError } from './oauth-error.js'
2
+
3
+ /**
4
+ * @see
5
+ * {@link https://datatracker.ietf.org/doc/html/rfc6749#section-5.2 | RFC6749 - Issuing an Access Token }
6
+ *
7
+ * The authenticated client is not authorized to use this authorization grant
8
+ * type.
9
+ *
10
+ * @see
11
+ * {@link https://datatracker.ietf.org/doc/html/rfc6749#section-4.1.2.1 | RFC6749 - Authorization Code Grant, Authorization Request}
12
+ *
13
+ * The client is not authorized to request an authorization code using this
14
+ * method.
15
+ */
16
+ export class UnauthorizedClientError extends OAuthError {
17
+ constructor(error_description: string, cause?: unknown) {
18
+ super('unauthorized_client', error_description, 400, cause)
19
+ }
20
+ }
@@ -0,0 +1,32 @@
1
+ import { OAuthError } from './oauth-error.js'
2
+ import { WWWAuthenticateError } from './www-authenticate-error.js'
3
+
4
+ /**
5
+ * @see
6
+ * {@link https://datatracker.ietf.org/doc/html/rfc9449#section-8 | RFC9449 - Section 8. Authorization Server-Provided Nonce}
7
+ */
8
+ export class UseDpopNonceError extends OAuthError {
9
+ constructor(
10
+ error_description = 'Authorization server requires nonce in DPoP proof',
11
+ cause?: unknown,
12
+ ) {
13
+ super('use_dpop_nonce', error_description, 400, cause)
14
+ }
15
+
16
+ /**
17
+ * Convert this error into an error meant to be used as "Resource
18
+ * Server-Provided Nonce" error.
19
+ *
20
+ * @see
21
+ * {@link https://datatracker.ietf.org/doc/html/rfc9449#section-9 | RFC9449 - Section 9. Resource Server-Provided Nonce}
22
+ */
23
+ toWwwAuthenticateError(): WWWAuthenticateError {
24
+ const { error, error_description } = this
25
+ return new WWWAuthenticateError(
26
+ error,
27
+ error_description,
28
+ { DPoP: { error, error_description } },
29
+ this,
30
+ )
31
+ }
32
+ }
@@ -0,0 +1,65 @@
1
+ import { VERIFY_ALGOS } from '../lib/util/crypto.js'
2
+
3
+ import { OAuthError } from './oauth-error.js'
4
+
5
+ export type WWWAuthenticateParams = Record<string, string | undefined>
6
+ export type WWWAuthenticate = Record<string, undefined | WWWAuthenticateParams>
7
+
8
+ export class WWWAuthenticateError extends OAuthError {
9
+ public readonly wwwAuthenticate: WWWAuthenticate
10
+
11
+ constructor(
12
+ error: string,
13
+ error_description: string,
14
+ wwwAuthenticate: WWWAuthenticate,
15
+ cause?: unknown,
16
+ ) {
17
+ super(error, error_description, 401, cause)
18
+
19
+ this.wwwAuthenticate =
20
+ wwwAuthenticate['DPoP'] != null
21
+ ? {
22
+ ...wwwAuthenticate,
23
+ DPoP: { algs: VERIFY_ALGOS.join(' '), ...wwwAuthenticate['DPoP'] },
24
+ }
25
+ : wwwAuthenticate
26
+ }
27
+
28
+ get wwwAuthenticateHeader() {
29
+ return formatWWWAuthenticateHeader(this.wwwAuthenticate)
30
+ }
31
+ }
32
+
33
+ function formatWWWAuthenticateHeader(wwwAuthenticate: WWWAuthenticate): string {
34
+ return Object.entries(wwwAuthenticate)
35
+ .filter(isWWWAuthenticateEntry)
36
+ .map(wwwAuthenticateEntryToString)
37
+ .join(', ')
38
+ }
39
+
40
+ type WWWAuthenticateEntry = [type: string, params: WWWAuthenticateParams]
41
+ function isWWWAuthenticateEntry(
42
+ entry: [string, unknown],
43
+ ): entry is WWWAuthenticateEntry {
44
+ const [, value] = entry
45
+ return value != null && typeof value === 'object'
46
+ }
47
+
48
+ function wwwAuthenticateEntryToString([type, params]: WWWAuthenticateEntry) {
49
+ const paramsEnc = Object.entries(params)
50
+ .filter(isParamEntry)
51
+ .map(paramEntryToString)
52
+
53
+ return paramsEnc.length ? `${type} ${paramsEnc.join(', ')}` : type
54
+ }
55
+
56
+ type ParamEntry = [name: string, value: string]
57
+
58
+ function isParamEntry(entry: [string, unknown]): entry is ParamEntry {
59
+ const [, value] = entry
60
+ return typeof value === 'string' && value !== '' && !value.includes('"')
61
+ }
62
+
63
+ function paramEntryToString([name, value]: ParamEntry): string {
64
+ return `${name}="${value}"`
65
+ }
package/src/index.ts ADDED
@@ -0,0 +1,15 @@
1
+ // Avoid having to explicitly depend sub dependencies
2
+ export * from '@atproto-labs/fetch'
3
+ export * from '@atproto-labs/fetch-node'
4
+ export * from '@atproto/jwk'
5
+ export * from '@atproto/jwk-jose'
6
+ export * from '@atproto/oauth-types'
7
+
8
+ export * from './constants.js'
9
+ export * from './oauth-client.js'
10
+ export * from './oauth-dpop.js'
11
+ export * from './oauth-errors.js'
12
+ export * from './oauth-hooks.js'
13
+ export * from './oauth-provider.js'
14
+ export * from './oauth-store.js'
15
+ export * from './oauth-verifier.js'
@@ -0,0 +1,9 @@
1
+ # Safe HTML generation and concatenation utility
2
+
3
+ This library provides a safe way to generate and concatenate HTML strings.
4
+
5
+ This code _could_ be used as a standalone library, but the Bluesky dev team does
6
+ not want to maintain it as such. As it is currently only used by the
7
+ `@atproto/oauth-provider` package, it is included here. Future development
8
+ should aim to keep this library independent of the rest of the
9
+ `@atproto/oauth-provider` package, so that it can be extracted and published.
@@ -0,0 +1,98 @@
1
+ import { HtmlValue } from './escapers.js'
2
+ import { Html } from './html.js'
3
+ import { html } from './tags.js'
4
+
5
+ export type AssetRef = {
6
+ url: string
7
+ sha256: string
8
+ }
9
+
10
+ export type Attrs = Record<string, boolean | string | undefined>
11
+ export type LinkAttrs = { href: string } & Attrs
12
+ export type MetaAttrs =
13
+ | { name: string; content: string }
14
+ | { 'http-equiv': string; content: string }
15
+
16
+ const defaultViewport = html`<meta
17
+ name="viewport"
18
+ content="width=device-width, initial-scale=1.0"
19
+ />`
20
+
21
+ export type BuildDocumentOptions = {
22
+ htmlAttrs?: Attrs
23
+ base?: URL
24
+ meta?: readonly MetaAttrs[]
25
+ links?: readonly LinkAttrs[]
26
+ head?: HtmlValue
27
+ title?: HtmlValue
28
+ scripts?: readonly (Html | AssetRef)[]
29
+ styles?: readonly (Html | AssetRef)[]
30
+ body: HtmlValue
31
+ bodyAttrs?: Attrs
32
+ }
33
+
34
+ export const buildDocument = ({
35
+ htmlAttrs,
36
+ head,
37
+ title,
38
+ body,
39
+ bodyAttrs,
40
+ base,
41
+ meta,
42
+ links,
43
+ scripts,
44
+ styles,
45
+ }: BuildDocumentOptions) => html`<!doctype html>
46
+ <html${attrsToHtml(htmlAttrs)}>
47
+ <head>
48
+ <meta charset="UTF-8" />
49
+ ${title && html`<title>${title}</title>`}
50
+ ${base && html`<base href="${base.href}" />`}
51
+ ${meta?.some(isViewportMeta) ? null : defaultViewport}
52
+ ${meta?.map(metaToHtml)}
53
+ ${links?.map(linkToHtml)}
54
+ ${head} ${styles?.map(styleToHtml)}
55
+ </head>
56
+ <body${attrsToHtml(bodyAttrs)}>
57
+ ${body} ${scripts?.map(scriptToHtml)}
58
+ </body>
59
+ </html>`
60
+
61
+ function isViewportMeta<T extends MetaAttrs>(
62
+ attrs: T,
63
+ ): attrs is T & { name: 'viewport' } {
64
+ return 'name' in attrs && attrs.name === 'viewport'
65
+ }
66
+
67
+ function* linkToHtml(attrs: LinkAttrs) {
68
+ yield html`<link${attrsToHtml(attrs)} />`
69
+ }
70
+
71
+ function* metaToHtml(attrs: MetaAttrs) {
72
+ yield html`<meta${attrsToHtml(attrs)} />`
73
+ }
74
+
75
+ function* attrsToHtml(attrs?: Attrs) {
76
+ if (attrs) {
77
+ for (const [name, value] of Object.entries(attrs)) {
78
+ if (value == null) continue
79
+ else if (value === false) continue
80
+ else if (value === true) yield html` ${name}`
81
+ else yield html` ${name}="${value}"`
82
+ }
83
+ }
84
+ }
85
+
86
+ function* scriptToHtml(script: Html | AssetRef) {
87
+ yield script instanceof Html
88
+ ? // prettier-ignore
89
+ html`<script>${script}</script>` // hash validity requires no space around the content
90
+ : html`<script type="module" src="${script.url}?${script.sha256}"></script>`
91
+ }
92
+
93
+ function* styleToHtml(style: Html | AssetRef) {
94
+ yield style instanceof Html
95
+ ? // prettier-ignore
96
+ html`<style>${style}</style>` // hash validity requires no space around the content
97
+ : html`<link rel="stylesheet" href="${style.url}?${style.sha256}" />`
98
+ }
@@ -0,0 +1,66 @@
1
+ import { Html } from './html.js'
2
+ import { NestedIterable, stringReplacer } from './util.js'
3
+
4
+ export function* javascriptEscaper(code: string) {
5
+ // "</script>" can only appear in javascript strings, so we can safely escape
6
+ // the "<" without breaking the javascript.
7
+ yield* stringReplacer(code, '</script>', '\\u003c/script>')
8
+ }
9
+
10
+ export function* jsonEscaper(value: unknown) {
11
+ // https://redux.js.org/usage/server-rendering#security-considerations
12
+ const json = JSON.stringify(value)
13
+ if (json === undefined) throw new TypeError('Cannot serialize to JSON')
14
+ // "<" can only appear in JSON strings, so we can safely escape it without
15
+ // breaking the JSON.
16
+ yield* stringReplacer(json, '<', '\\u003c')
17
+ }
18
+
19
+ export function* cssEscaper(css: string) {
20
+ yield* stringReplacer(css, '</style>', '\\u003c/style>')
21
+ }
22
+
23
+ export type HtmlVariable = Html | string | number | null | undefined
24
+ export type HtmlValue = NestedIterable<HtmlVariable>
25
+
26
+ export function* htmlEscaper(
27
+ htmlFragments: TemplateStringsArray,
28
+ values: readonly HtmlValue[],
29
+ ): Generator<string | Html, void, undefined> {
30
+ for (let i = 0; i < htmlFragments.length; i++) {
31
+ yield htmlFragments[i]!
32
+
33
+ const value = values[i]
34
+ if (value != null) yield* htmlVariableToFragments(value)
35
+ }
36
+ }
37
+
38
+ function* htmlVariableToFragments(
39
+ value: HtmlValue,
40
+ ): Generator<string | Html, void, undefined> {
41
+ if (value == null) {
42
+ return
43
+ } else if (typeof value === 'number') {
44
+ yield String(value)
45
+ } else if (typeof value === 'string') {
46
+ yield encode(value)
47
+ } else if (value instanceof Html) {
48
+ yield value
49
+ } else {
50
+ // Will throw if the value is not an iterable
51
+ for (const v of value) yield* htmlVariableToFragments(v)
52
+ }
53
+ }
54
+
55
+ const specialCharRegExp = /[<>"'&]/g
56
+ const specialCharMap = new Map([
57
+ ['<', '&lt;'],
58
+ ['>', '&gt;'],
59
+ ['"', '&quot;'],
60
+ ["'", '&apos;'],
61
+ ['&', '&amp;'],
62
+ ])
63
+ const specialCharMapGet = (c: string) => specialCharMap.get(c)!
64
+ function encode(value: string): string {
65
+ return value.replace(specialCharRegExp, specialCharMapGet)
66
+ }
@@ -0,0 +1,61 @@
1
+ import { isString } from './util'
2
+
3
+ const symbol = Symbol('Html.dangerouslyCreate')
4
+
5
+ /**
6
+ * This class represents trusted HTML that can be safely embedded in a web page,
7
+ * or used as fragments to build a larger HTML document.
8
+ */
9
+ export class Html {
10
+ #fragments: Iterable<Html | string>
11
+
12
+ private constructor(fragments: Iterable<Html | string>, guard: symbol) {
13
+ if (guard !== symbol) {
14
+ // Force developers to use `Html.dangerouslyCreate` to create an Html
15
+ // instance, to make it clear that the content needs to be trusted.
16
+ throw new TypeError(
17
+ 'Use Html.dangerouslyCreate() to create an Html instance',
18
+ )
19
+ }
20
+
21
+ this.#fragments = fragments
22
+ }
23
+
24
+ toString(): string {
25
+ // Lazily compute & join the fragments when they are used, to avoid
26
+ // unnecessary intermediate strings when concatenating multiple Html as
27
+ // fragments.
28
+ if (
29
+ !Array.isArray(this.#fragments) ||
30
+ this.#fragments.length > 1 ||
31
+ !this.#fragments.every(isString)
32
+ ) {
33
+ // Will call `toString` recursively, as well as generating iterator
34
+ // results.
35
+ const fragment = Array.from(this.#fragments, String).join('')
36
+ this.#fragments = [fragment] // Cache result for future calls
37
+ return fragment
38
+ }
39
+
40
+ return this.#fragments.join('')
41
+ }
42
+
43
+ [Symbol.toPrimitive](hint): string {
44
+ switch (hint) {
45
+ case 'string':
46
+ case 'default':
47
+ return this.toString()
48
+ default:
49
+ throw new TypeError(`Cannot convert Html to a ${hint}`)
50
+ }
51
+ }
52
+
53
+ *[Symbol.iterator](): IterableIterator<string> {
54
+ // Using toString() here to use the optimized path for string concatenation
55
+ yield this.toString()
56
+ }
57
+
58
+ static dangerouslyCreate(fragments: Iterable<Html | string>): Html {
59
+ return new Html(fragments, symbol)
60
+ }
61
+ }
@@ -0,0 +1,5 @@
1
+ export * from './html.js'
2
+ export * from './tags.js'
3
+
4
+ // Extra util
5
+ export * from './build-document.js'