@_mustachio/openauth 0.6.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 (192) hide show
  1. package/dist/esm/client.js +186 -0
  2. package/dist/esm/css.d.js +0 -0
  3. package/dist/esm/error.js +73 -0
  4. package/dist/esm/index.js +14 -0
  5. package/dist/esm/issuer.js +558 -0
  6. package/dist/esm/jwt.js +16 -0
  7. package/dist/esm/keys.js +113 -0
  8. package/dist/esm/pkce.js +35 -0
  9. package/dist/esm/provider/apple.js +28 -0
  10. package/dist/esm/provider/arctic.js +43 -0
  11. package/dist/esm/provider/code.js +58 -0
  12. package/dist/esm/provider/cognito.js +16 -0
  13. package/dist/esm/provider/discord.js +15 -0
  14. package/dist/esm/provider/facebook.js +24 -0
  15. package/dist/esm/provider/github.js +15 -0
  16. package/dist/esm/provider/google.js +25 -0
  17. package/dist/esm/provider/index.js +3 -0
  18. package/dist/esm/provider/jumpcloud.js +15 -0
  19. package/dist/esm/provider/keycloak.js +15 -0
  20. package/dist/esm/provider/linkedin.js +15 -0
  21. package/dist/esm/provider/m2m.js +17 -0
  22. package/dist/esm/provider/microsoft.js +24 -0
  23. package/dist/esm/provider/oauth2.js +119 -0
  24. package/dist/esm/provider/oidc.js +69 -0
  25. package/dist/esm/provider/passkey.js +315 -0
  26. package/dist/esm/provider/password.js +306 -0
  27. package/dist/esm/provider/provider.js +10 -0
  28. package/dist/esm/provider/slack.js +15 -0
  29. package/dist/esm/provider/spotify.js +15 -0
  30. package/dist/esm/provider/twitch.js +15 -0
  31. package/dist/esm/provider/x.js +16 -0
  32. package/dist/esm/provider/yahoo.js +15 -0
  33. package/dist/esm/random.js +27 -0
  34. package/dist/esm/storage/aws.js +39 -0
  35. package/dist/esm/storage/cloudflare.js +42 -0
  36. package/dist/esm/storage/dynamo.js +116 -0
  37. package/dist/esm/storage/memory.js +88 -0
  38. package/dist/esm/storage/storage.js +36 -0
  39. package/dist/esm/subject.js +7 -0
  40. package/dist/esm/ui/base.js +407 -0
  41. package/dist/esm/ui/code.js +151 -0
  42. package/dist/esm/ui/form.js +43 -0
  43. package/dist/esm/ui/icon.js +92 -0
  44. package/dist/esm/ui/passkey.js +329 -0
  45. package/dist/esm/ui/password.js +338 -0
  46. package/dist/esm/ui/select.js +187 -0
  47. package/dist/esm/ui/theme.js +115 -0
  48. package/dist/esm/util.js +54 -0
  49. package/dist/types/client.d.ts +466 -0
  50. package/dist/types/client.d.ts.map +1 -0
  51. package/dist/types/error.d.ts +77 -0
  52. package/dist/types/error.d.ts.map +1 -0
  53. package/dist/types/index.d.ts +20 -0
  54. package/dist/types/index.d.ts.map +1 -0
  55. package/dist/types/issuer.d.ts +465 -0
  56. package/dist/types/issuer.d.ts.map +1 -0
  57. package/dist/types/jwt.d.ts +6 -0
  58. package/dist/types/jwt.d.ts.map +1 -0
  59. package/dist/types/keys.d.ts +18 -0
  60. package/dist/types/keys.d.ts.map +1 -0
  61. package/dist/types/pkce.d.ts +7 -0
  62. package/dist/types/pkce.d.ts.map +1 -0
  63. package/dist/types/provider/apple.d.ts +108 -0
  64. package/dist/types/provider/apple.d.ts.map +1 -0
  65. package/dist/types/provider/arctic.d.ts +16 -0
  66. package/dist/types/provider/arctic.d.ts.map +1 -0
  67. package/dist/types/provider/code.d.ts +74 -0
  68. package/dist/types/provider/code.d.ts.map +1 -0
  69. package/dist/types/provider/cognito.d.ts +64 -0
  70. package/dist/types/provider/cognito.d.ts.map +1 -0
  71. package/dist/types/provider/discord.d.ts +38 -0
  72. package/dist/types/provider/discord.d.ts.map +1 -0
  73. package/dist/types/provider/facebook.d.ts +74 -0
  74. package/dist/types/provider/facebook.d.ts.map +1 -0
  75. package/dist/types/provider/github.d.ts +38 -0
  76. package/dist/types/provider/github.d.ts.map +1 -0
  77. package/dist/types/provider/google.d.ts +74 -0
  78. package/dist/types/provider/google.d.ts.map +1 -0
  79. package/dist/types/provider/index.d.ts +4 -0
  80. package/dist/types/provider/index.d.ts.map +1 -0
  81. package/dist/types/provider/jumpcloud.d.ts +38 -0
  82. package/dist/types/provider/jumpcloud.d.ts.map +1 -0
  83. package/dist/types/provider/keycloak.d.ts +67 -0
  84. package/dist/types/provider/keycloak.d.ts.map +1 -0
  85. package/dist/types/provider/linkedin.d.ts +6 -0
  86. package/dist/types/provider/linkedin.d.ts.map +1 -0
  87. package/dist/types/provider/m2m.d.ts +34 -0
  88. package/dist/types/provider/m2m.d.ts.map +1 -0
  89. package/dist/types/provider/microsoft.d.ts +89 -0
  90. package/dist/types/provider/microsoft.d.ts.map +1 -0
  91. package/dist/types/provider/oauth2.d.ts +133 -0
  92. package/dist/types/provider/oauth2.d.ts.map +1 -0
  93. package/dist/types/provider/oidc.d.ts +91 -0
  94. package/dist/types/provider/oidc.d.ts.map +1 -0
  95. package/dist/types/provider/passkey.d.ts +143 -0
  96. package/dist/types/provider/passkey.d.ts.map +1 -0
  97. package/dist/types/provider/password.d.ts +210 -0
  98. package/dist/types/provider/password.d.ts.map +1 -0
  99. package/dist/types/provider/provider.d.ts +29 -0
  100. package/dist/types/provider/provider.d.ts.map +1 -0
  101. package/dist/types/provider/slack.d.ts +59 -0
  102. package/dist/types/provider/slack.d.ts.map +1 -0
  103. package/dist/types/provider/spotify.d.ts +38 -0
  104. package/dist/types/provider/spotify.d.ts.map +1 -0
  105. package/dist/types/provider/twitch.d.ts +38 -0
  106. package/dist/types/provider/twitch.d.ts.map +1 -0
  107. package/dist/types/provider/x.d.ts +38 -0
  108. package/dist/types/provider/x.d.ts.map +1 -0
  109. package/dist/types/provider/yahoo.d.ts +38 -0
  110. package/dist/types/provider/yahoo.d.ts.map +1 -0
  111. package/dist/types/random.d.ts +3 -0
  112. package/dist/types/random.d.ts.map +1 -0
  113. package/dist/types/storage/aws.d.ts +4 -0
  114. package/dist/types/storage/aws.d.ts.map +1 -0
  115. package/dist/types/storage/cloudflare.d.ts +34 -0
  116. package/dist/types/storage/cloudflare.d.ts.map +1 -0
  117. package/dist/types/storage/dynamo.d.ts +65 -0
  118. package/dist/types/storage/dynamo.d.ts.map +1 -0
  119. package/dist/types/storage/memory.d.ts +49 -0
  120. package/dist/types/storage/memory.d.ts.map +1 -0
  121. package/dist/types/storage/storage.d.ts +15 -0
  122. package/dist/types/storage/storage.d.ts.map +1 -0
  123. package/dist/types/subject.d.ts +122 -0
  124. package/dist/types/subject.d.ts.map +1 -0
  125. package/dist/types/ui/base.d.ts +5 -0
  126. package/dist/types/ui/base.d.ts.map +1 -0
  127. package/dist/types/ui/code.d.ts +104 -0
  128. package/dist/types/ui/code.d.ts.map +1 -0
  129. package/dist/types/ui/form.d.ts +6 -0
  130. package/dist/types/ui/form.d.ts.map +1 -0
  131. package/dist/types/ui/icon.d.ts +6 -0
  132. package/dist/types/ui/icon.d.ts.map +1 -0
  133. package/dist/types/ui/passkey.d.ts +5 -0
  134. package/dist/types/ui/passkey.d.ts.map +1 -0
  135. package/dist/types/ui/password.d.ts +139 -0
  136. package/dist/types/ui/password.d.ts.map +1 -0
  137. package/dist/types/ui/select.d.ts +55 -0
  138. package/dist/types/ui/select.d.ts.map +1 -0
  139. package/dist/types/ui/theme.d.ts +207 -0
  140. package/dist/types/ui/theme.d.ts.map +1 -0
  141. package/dist/types/util.d.ts +8 -0
  142. package/dist/types/util.d.ts.map +1 -0
  143. package/package.json +51 -0
  144. package/src/client.ts +749 -0
  145. package/src/css.d.ts +4 -0
  146. package/src/error.ts +120 -0
  147. package/src/index.ts +26 -0
  148. package/src/issuer.ts +1302 -0
  149. package/src/jwt.ts +17 -0
  150. package/src/keys.ts +139 -0
  151. package/src/pkce.ts +40 -0
  152. package/src/provider/apple.ts +127 -0
  153. package/src/provider/arctic.ts +66 -0
  154. package/src/provider/code.ts +227 -0
  155. package/src/provider/cognito.ts +74 -0
  156. package/src/provider/discord.ts +45 -0
  157. package/src/provider/facebook.ts +84 -0
  158. package/src/provider/github.ts +45 -0
  159. package/src/provider/google.ts +85 -0
  160. package/src/provider/index.ts +3 -0
  161. package/src/provider/jumpcloud.ts +45 -0
  162. package/src/provider/keycloak.ts +75 -0
  163. package/src/provider/linkedin.ts +12 -0
  164. package/src/provider/m2m.ts +56 -0
  165. package/src/provider/microsoft.ts +100 -0
  166. package/src/provider/oauth2.ts +297 -0
  167. package/src/provider/oidc.ts +179 -0
  168. package/src/provider/passkey.ts +655 -0
  169. package/src/provider/password.ts +672 -0
  170. package/src/provider/provider.ts +33 -0
  171. package/src/provider/slack.ts +67 -0
  172. package/src/provider/spotify.ts +45 -0
  173. package/src/provider/twitch.ts +45 -0
  174. package/src/provider/x.ts +46 -0
  175. package/src/provider/yahoo.ts +45 -0
  176. package/src/random.ts +24 -0
  177. package/src/storage/aws.ts +59 -0
  178. package/src/storage/cloudflare.ts +77 -0
  179. package/src/storage/dynamo.ts +193 -0
  180. package/src/storage/memory.ts +135 -0
  181. package/src/storage/storage.ts +46 -0
  182. package/src/subject.ts +130 -0
  183. package/src/ui/base.tsx +118 -0
  184. package/src/ui/code.tsx +215 -0
  185. package/src/ui/form.tsx +40 -0
  186. package/src/ui/icon.tsx +95 -0
  187. package/src/ui/passkey.tsx +321 -0
  188. package/src/ui/password.tsx +405 -0
  189. package/src/ui/select.tsx +221 -0
  190. package/src/ui/theme.ts +319 -0
  191. package/src/ui/ui.css +252 -0
  192. package/src/util.ts +58 -0
@@ -0,0 +1,465 @@
1
+ /**
2
+ * The `issuer` create an OpentAuth server, a [Hono](https://hono.dev) app that's
3
+ * designed to run anywhere.
4
+ *
5
+ * The `issuer` function requires a few things:
6
+ *
7
+ * ```ts title="issuer.ts"
8
+ * import { issuer } from "@openauthjs/openauth"
9
+ *
10
+ * const app = issuer({
11
+ * providers: { ... },
12
+ * storage,
13
+ * subjects,
14
+ * success: async (ctx, value) => { ... }
15
+ * })
16
+ * ```
17
+ *
18
+ * #### Add providers
19
+ *
20
+ * You start by specifying the auth providers you are going to use. Let's say you want your users
21
+ * to be able to authenticate with GitHub and with their email and password.
22
+ *
23
+ * ```ts title="issuer.ts"
24
+ * import { GithubProvider } from "@openauthjs/openauth/provider/github"
25
+ * import { PasswordProvider } from "@openauthjs/openauth/provider/password"
26
+ *
27
+ * const app = issuer({
28
+ * providers: {
29
+ * github: GithubProvider({
30
+ * // ...
31
+ * }),
32
+ * password: PasswordProvider({
33
+ * // ...
34
+ * }),
35
+ * },
36
+ * })
37
+ * ```
38
+ *
39
+ * #### Handle success
40
+ *
41
+ * The `success` callback receives the payload when a user completes a provider's auth flow.
42
+ *
43
+ * ```ts title="issuer.ts"
44
+ * const app = issuer({
45
+ * providers: { ... },
46
+ * subjects,
47
+ * async success(ctx, value) {
48
+ * let userID
49
+ * if (value.provider === "password") {
50
+ * console.log(value.email)
51
+ * userID = ... // lookup user or create them
52
+ * }
53
+ * if (value.provider === "github") {
54
+ * console.log(value.tokenset.access)
55
+ * userID = ... // lookup user or create them
56
+ * }
57
+ * return ctx.subject("user", {
58
+ * userID
59
+ * })
60
+ * }
61
+ * })
62
+ * ```
63
+ *
64
+ * Once complete, the `issuer` issues the access tokens that a client can use. The `ctx.subject`
65
+ * call is what is placed in the access token as a JWT.
66
+ *
67
+ * #### Define subjects
68
+ *
69
+ * You define the shape of these in the `subjects` field.
70
+ *
71
+ * ```ts title="subjects.ts"
72
+ * import { object, string } from "valibot"
73
+ * import { createSubjects } from "@openauthjs/openauth/subject"
74
+ *
75
+ * const subjects = createSubjects({
76
+ * user: object({
77
+ * userID: string()
78
+ * })
79
+ * })
80
+ * ```
81
+ *
82
+ * It's good to place this in a separate file since this'll be used in your client apps as well.
83
+ *
84
+ * ```ts title="issuer.ts"
85
+ * import { subjects } from "./subjects.js"
86
+ *
87
+ * const app = issuer({
88
+ * providers: { ... },
89
+ * subjects,
90
+ * // ...
91
+ * })
92
+ * ```
93
+ *
94
+ * #### Deploy
95
+ *
96
+ * Since `issuer` is a Hono app, you can deploy it anywhere Hono supports.
97
+ *
98
+ * <Tabs>
99
+ * <TabItem label="Node">
100
+ * ```ts title="issuer.ts"
101
+ * import { serve } from "@hono/node-server"
102
+ *
103
+ * serve(app)
104
+ * ```
105
+ * </TabItem>
106
+ * <TabItem label="Lambda">
107
+ * ```ts title="issuer.ts"
108
+ * import { handle } from "hono/aws-lambda"
109
+ *
110
+ * export const handler = handle(app)
111
+ * ```
112
+ * </TabItem>
113
+ * <TabItem label="Bun">
114
+ * ```ts title="issuer.ts"
115
+ * export default app
116
+ * ```
117
+ * </TabItem>
118
+ * <TabItem label="Workers">
119
+ * ```ts title="issuer.ts"
120
+ * export default app
121
+ * ```
122
+ * </TabItem>
123
+ * </Tabs>
124
+ *
125
+ * @packageDocumentation
126
+ */
127
+ import { Provider } from "./provider/provider.js";
128
+ import { SubjectPayload, SubjectSchema } from "./subject.js";
129
+ import { Context } from "hono";
130
+ /**
131
+ * Sets the subject payload in the JWT token and returns the response.
132
+ *
133
+ * ```ts
134
+ * ctx.subject("user", {
135
+ * userID
136
+ * })
137
+ * ```
138
+ */
139
+ export interface OnSuccessResponder<T extends {
140
+ type: string;
141
+ properties: any;
142
+ }> {
143
+ /**
144
+ * The `type` is the type of the subject, that was defined in the `subjects` field.
145
+ *
146
+ * The `properties` are the properties of the subject. This is the shape of the subject that
147
+ * you defined in the `subjects` field.
148
+ */
149
+ subject<Type extends T["type"]>(type: Type, properties: Extract<T, {
150
+ type: Type;
151
+ }>["properties"], opts?: {
152
+ ttl?: {
153
+ access?: number;
154
+ refresh?: number;
155
+ };
156
+ subject?: string;
157
+ }): Promise<Response>;
158
+ }
159
+ export interface AllowCallbackInput {
160
+ clientID: string;
161
+ redirectURI: string;
162
+ audience?: string;
163
+ }
164
+ /**
165
+ * @internal
166
+ */
167
+ export interface AuthorizationState {
168
+ redirect_uri: string;
169
+ response_type: string;
170
+ state: string;
171
+ client_id: string;
172
+ audience?: string;
173
+ pkce?: {
174
+ challenge: string;
175
+ method: "S256";
176
+ };
177
+ }
178
+ /**
179
+ * @internal
180
+ */
181
+ export type Prettify<T> = {
182
+ [K in keyof T]: T[K];
183
+ } & {};
184
+ import { UnknownStateError } from "./error.js";
185
+ import { StorageAdapter } from "./storage/storage.js";
186
+ import { Theme } from "./ui/theme.js";
187
+ /** @internal */
188
+ export declare const aws: <E extends import("hono").Env = import("hono").Env, S extends import("hono").Schema = {}, BasePath extends string = "/">(app: import("hono").Hono<E, S, BasePath>, { isContentTypeBinary }?: {
189
+ isContentTypeBinary: ((contentType: string) => boolean) | undefined;
190
+ }) => (<L extends import("hono/aws-lambda").LambdaEvent>(event: L, lambdaContext?: import("hono/aws-lambda").LambdaContext) => Promise<import("hono/aws-lambda").APIGatewayProxyResult & (L extends {
191
+ multiValueHeaders: Record<string, string[]>;
192
+ } ? {
193
+ headers?: undefined;
194
+ multiValueHeaders: Record<string, string[]>;
195
+ } : {
196
+ headers: Record<string, string>;
197
+ multiValueHeaders?: undefined;
198
+ })>);
199
+ export interface IssuerInput<Providers extends Record<string, Provider<any>>, Subjects extends SubjectSchema, Result = {
200
+ [key in keyof Providers]: Prettify<{
201
+ provider: key;
202
+ } & (Providers[key] extends Provider<infer T> ? T : {})>;
203
+ }[keyof Providers]> {
204
+ /**
205
+ * The shape of the subjects that you want to return.
206
+ *
207
+ * @example
208
+ *
209
+ * ```ts title="issuer.ts"
210
+ * import { object, string } from "valibot"
211
+ * import { createSubjects } from "@openauthjs/openauth/subject"
212
+ *
213
+ * issuer({
214
+ * subjects: createSubjects({
215
+ * user: object({
216
+ * userID: string()
217
+ * })
218
+ * })
219
+ * // ...
220
+ * })
221
+ * ```
222
+ */
223
+ subjects: Subjects;
224
+ /**
225
+ * The storage adapter that you want to use.
226
+ *
227
+ * @example
228
+ * ```ts title="issuer.ts"
229
+ * import { DynamoStorage } from "@openauthjs/openauth/storage/dynamo"
230
+ *
231
+ * issuer({
232
+ * storage: DynamoStorage()
233
+ * // ...
234
+ * })
235
+ * ```
236
+ */
237
+ storage?: StorageAdapter;
238
+ /**
239
+ * The providers that you want your OpenAuth server to support.
240
+ *
241
+ * @example
242
+ *
243
+ * ```ts title="issuer.ts"
244
+ * import { GithubProvider } from "@openauthjs/openauth/provider/github"
245
+ *
246
+ * issuer({
247
+ * providers: {
248
+ * github: GithubProvider()
249
+ * }
250
+ * })
251
+ * ```
252
+ *
253
+ * The key is just a string that you can use to identify the provider. It's passed back to
254
+ * the `success` callback.
255
+ *
256
+ * You can also specify multiple providers.
257
+ *
258
+ * ```ts
259
+ * {
260
+ * providers: {
261
+ * github: GithubProvider(),
262
+ * google: GoogleProvider()
263
+ * }
264
+ * }
265
+ * ```
266
+ */
267
+ providers: Providers | ((ctx: Context) => Promise<Providers>);
268
+ /**
269
+ * The theme you want to use for the UI.
270
+ *
271
+ * This includes the UI the user sees when selecting a provider. And the `PasswordUI` and
272
+ * `CodeUI` that are used by the `PasswordProvider` and `CodeProvider`.
273
+ *
274
+ * @example
275
+ * ```ts title="issuer.ts"
276
+ * import { THEME_SST } from "@openauthjs/openauth/ui/theme"
277
+ *
278
+ * issuer({
279
+ * theme: THEME_SST
280
+ * // ...
281
+ * })
282
+ * ```
283
+ *
284
+ * Or define your own.
285
+ *
286
+ * ```ts title="issuer.ts"
287
+ * import type { Theme } from "@openauthjs/openauth/ui/theme"
288
+ *
289
+ * const MY_THEME: Theme = {
290
+ * // ...
291
+ * }
292
+ *
293
+ * issuer({
294
+ * theme: MY_THEME
295
+ * // ...
296
+ * })
297
+ * ```
298
+ */
299
+ theme?: Theme;
300
+ /**
301
+ * Set the TTL, in seconds, for access and refresh tokens.
302
+ *
303
+ * @example
304
+ * ```ts
305
+ * {
306
+ * ttl: {
307
+ * access: 60 * 60 * 24 * 30,
308
+ * refresh: 60 * 60 * 24 * 365
309
+ * }
310
+ * }
311
+ * ```
312
+ */
313
+ ttl?: {
314
+ /**
315
+ * Interval in seconds where the access token is valid.
316
+ * @default 30d
317
+ */
318
+ access?: number;
319
+ /**
320
+ * Interval in seconds where the refresh token is valid.
321
+ * @default 1y
322
+ */
323
+ refresh?: number;
324
+ /**
325
+ * Interval in seconds where refresh token reuse is allowed. This helps mitigrate
326
+ * concurrency issues.
327
+ * @default 60s
328
+ */
329
+ reuse?: number;
330
+ /**
331
+ * Interval in seconds to retain refresh tokens for reuse detection.
332
+ * @default 0s
333
+ */
334
+ retention?: number;
335
+ };
336
+ /**
337
+ * Optionally, configure the UI that's displayed when the user visits the root URL of the
338
+ * of the OpenAuth server.
339
+ *
340
+ * ```ts title="issuer.ts"
341
+ * import { Select } from "@openauthjs/openauth/ui/select"
342
+ *
343
+ * issuer({
344
+ * select: Select({
345
+ * providers: {
346
+ * github: { hide: true },
347
+ * google: { display: "Google" }
348
+ * }
349
+ * })
350
+ * // ...
351
+ * })
352
+ * ```
353
+ *
354
+ * @default Select()
355
+ */
356
+ select?(providers: Record<string, string>, req: Request): Promise<Response>;
357
+ /**
358
+ * @internal
359
+ */
360
+ start?(req: Request): Promise<void>;
361
+ /**
362
+ * The success callback that's called when the user completes the flow.
363
+ *
364
+ * This is called after the user has been redirected back to your app after the OAuth flow.
365
+ *
366
+ * @example
367
+ * ```ts
368
+ * {
369
+ * success: async (ctx, value) => {
370
+ * let userID
371
+ * if (value.provider === "password") {
372
+ * console.log(value.email)
373
+ * userID = ... // lookup user or create them
374
+ * }
375
+ * if (value.provider === "github") {
376
+ * console.log(value.tokenset.access)
377
+ * userID = ... // lookup user or create them
378
+ * }
379
+ * return ctx.subject("user", {
380
+ * userID
381
+ * })
382
+ * },
383
+ * // ...
384
+ * }
385
+ * ```
386
+ */
387
+ success(response: OnSuccessResponder<SubjectPayload<Subjects>>, input: Result, req: Request): Promise<Response>;
388
+ /**
389
+ * Optional callback that's called when a refresh token is used to get new access tokens.
390
+ *
391
+ * This allows you to update dynamic user attributes (permissions, roles, etc.) during
392
+ * token refresh without requiring the user to re-authenticate.
393
+ *
394
+ * If not provided, the original properties from the initial authentication will be reused.
395
+ *
396
+ * @example
397
+ * ```ts
398
+ * {
399
+ * refresh: async (ctx, value) => {
400
+ * // Fetch updated permissions from database
401
+ * const permissions = await db.getPermissions(value.properties.userId)
402
+ * return ctx.subject("user", {
403
+ * ...value.properties,
404
+ * permissions // Updated value
405
+ * })
406
+ * }
407
+ * }
408
+ * ```
409
+ */
410
+ refresh?(response: OnSuccessResponder<SubjectPayload<Subjects>>, input: {
411
+ type: string;
412
+ properties: any;
413
+ subject: string;
414
+ clientID: string;
415
+ }, req: Request): Promise<Response>;
416
+ /**
417
+ * @internal
418
+ */
419
+ error?(error: UnknownStateError, req: Request): Promise<Response>;
420
+ /**
421
+ * Override the logic for whether a client request is allowed to call the issuer.
422
+ *
423
+ * By default, it uses the following:
424
+ *
425
+ * - Allow if the `redirectURI` is localhost.
426
+ * - Compare `redirectURI` to the request's hostname or the `x-forwarded-host` header. If they
427
+ * share the same apex domain, then allow.
428
+ *
429
+ * :::caution[Security Notice]
430
+ * The default implementation allows ANY `redirect_uri` on the same apex domain with no per-client isolation.
431
+ * Consider implementing a custom `allow` function with strict per-client validation if your deployment has:
432
+ * - Untrusted content on subdomains (user-generated content, third-party scripts)
433
+ * - Potential XSS attack vectors
434
+ * - Multiple client applications requiring isolation
435
+ * :::
436
+ *
437
+ * @example
438
+ * Recommended for production (per-client allowlist):
439
+ * ```ts
440
+ * {
441
+ * allow: async (input, req) => {
442
+ * const allowedRedirects = {
443
+ * 'web-client': ['https://app.example.com/callback'],
444
+ * 'mobile-client': ['https://admin.example.com/oauth'],
445
+ * }
446
+ * return allowedRedirects[input.clientID]?.includes(input.redirectURI) ?? false
447
+ * }
448
+ * }
449
+ * ```
450
+ */
451
+ allow?(input: AllowCallbackInput, req: Request): Promise<boolean>;
452
+ }
453
+ /**
454
+ * Create an OpenAuth server, a Hono app.
455
+ */
456
+ export declare function issuer<Providers extends Record<string, Provider<any>>, Subjects extends SubjectSchema, Result = {
457
+ [key in keyof Providers]: Prettify<{
458
+ provider: key;
459
+ } & (Providers[key] extends Provider<infer T> ? T : {})>;
460
+ }[keyof Providers]>(input: IssuerInput<Providers, Subjects, Result>): import("hono/hono-base").HonoBase<{
461
+ Variables: {
462
+ authorization: AuthorizationState;
463
+ };
464
+ }, import("hono/types").BlankSchema, "/", "*">;
465
+ //# sourceMappingURL=issuer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issuer.d.ts","sourceRoot":"","sources":["../../src/issuer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { JWTPayload, KeyLike } from "jose";
2
+ export declare namespace jwt {
3
+ function create(payload: JWTPayload, algorithm: string, privateKey: KeyLike): Promise<string>;
4
+ function verify<T>(token: string, publicKey: KeyLike): Promise<import("jose").JWTVerifyResult<T>>;
5
+ }
6
+ //# sourceMappingURL=jwt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../src/jwt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,OAAO,EAAW,MAAM,MAAM,CAAA;AAE9D,yBAAiB,GAAG,CAAC;IACnB,SAAgB,MAAM,CACpB,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,OAAO,mBAKpB;IAED,SAAgB,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,8CAE1D;CACF"}
@@ -0,0 +1,18 @@
1
+ import { JWK, KeyLike } from "jose";
2
+ import { StorageAdapter } from "./storage/storage.js";
3
+ export interface KeyPair {
4
+ id: string;
5
+ alg: string;
6
+ public: KeyLike;
7
+ private: KeyLike;
8
+ created: Date;
9
+ expired?: Date;
10
+ jwk: JWK;
11
+ }
12
+ /**
13
+ * @deprecated use `signingKeys` instead
14
+ */
15
+ export declare function legacySigningKeys(storage: StorageAdapter): Promise<KeyPair[]>;
16
+ export declare function signingKeys(storage: StorageAdapter): Promise<KeyPair[]>;
17
+ export declare function encryptionKeys(storage: StorageAdapter): Promise<KeyPair[]>;
18
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,GAAG,EACH,OAAO,EACR,MAAM,MAAM,CAAA;AACb,OAAO,EAAW,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAc9D,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,IAAI,CAAA;IACb,OAAO,CAAC,EAAE,IAAI,CAAA;IACd,GAAG,EAAE,GAAG,CAAA;CACT;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,OAAO,EAAE,CAAC,CAsBpB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAoC7E;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,OAAO,EAAE,CAAC,CAmCpB"}
@@ -0,0 +1,7 @@
1
+ export declare function generatePKCE(length?: number): Promise<{
2
+ verifier: string;
3
+ challenge: string;
4
+ method: string;
5
+ }>;
6
+ export declare function validatePKCE(verifier: string, challenge: string, method?: "S256" | "plain"): Promise<boolean>;
7
+ //# sourceMappingURL=pkce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.d.ts","sourceRoot":"","sources":["../../src/pkce.ts"],"names":[],"mappings":"AAgBA,wBAAsB,YAAY,CAAC,MAAM,GAAE,MAAW;;;;GAarD;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,MAAM,GAAG,OAAgB,oBAKlC"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Use this provider to authenticate with Apple. Supports both OAuth2 and OIDC.
3
+ *
4
+ * #### Using OAuth
5
+ *
6
+ * ```ts {5-8}
7
+ * import { AppleProvider } from "@openauthjs/openauth/provider/apple"
8
+ *
9
+ * export default issuer({
10
+ * providers: {
11
+ * apple: AppleProvider({
12
+ * clientID: "1234567890",
13
+ * clientSecret: "0987654321"
14
+ * })
15
+ * }
16
+ * })
17
+ * ```
18
+ *
19
+ * #### Using OAuth with form_post response mode
20
+ *
21
+ * When requesting name or email scopes from Apple, you must use form_post response mode:
22
+ *
23
+ * ```ts {5-9}
24
+ * import { AppleProvider } from "@openauthjs/openauth/provider/apple"
25
+ *
26
+ * export default issuer({
27
+ * providers: {
28
+ * apple: AppleProvider({
29
+ * clientID: "1234567890",
30
+ * clientSecret: "0987654321",
31
+ * responseMode: "form_post"
32
+ * })
33
+ * }
34
+ * })
35
+ * ```
36
+ *
37
+ * #### Using OIDC
38
+ *
39
+ * ```ts {5-7}
40
+ * import { AppleOidcProvider } from "@openauthjs/openauth/provider/apple"
41
+ *
42
+ * export default issuer({
43
+ * providers: {
44
+ * apple: AppleOidcProvider({
45
+ * clientID: "1234567890"
46
+ * })
47
+ * }
48
+ * })
49
+ * ```
50
+ *
51
+ * @packageDocumentation
52
+ */
53
+ import { Oauth2WrappedConfig } from "./oauth2.js";
54
+ import { OidcWrappedConfig } from "./oidc.js";
55
+ export interface AppleConfig extends Oauth2WrappedConfig {
56
+ /**
57
+ * The response mode to use for the authorization request.
58
+ * Apple requires 'form_post' response mode when requesting name or email scopes.
59
+ * @default "query"
60
+ */
61
+ responseMode?: "query" | "form_post";
62
+ }
63
+ export interface AppleOidcConfig extends OidcWrappedConfig {
64
+ }
65
+ /**
66
+ * Create an Apple OAuth2 provider.
67
+ *
68
+ * @param config - The config for the provider.
69
+ * @example
70
+ * ```ts
71
+ * // Using default query response mode (GET callback)
72
+ * AppleProvider({
73
+ * clientID: "1234567890",
74
+ * clientSecret: "0987654321"
75
+ * })
76
+ *
77
+ * // Using form_post response mode (POST callback)
78
+ * // Required when requesting name or email scope
79
+ * AppleProvider({
80
+ * clientID: "1234567890",
81
+ * clientSecret: "0987654321",
82
+ * responseMode: "form_post",
83
+ * scopes: ["name", "email"]
84
+ * })
85
+ * ```
86
+ */
87
+ export declare function AppleProvider(config: AppleConfig): import("./provider.js").Provider<{
88
+ tokenset: import("./oauth2.js").Oauth2Token;
89
+ clientID: string;
90
+ }>;
91
+ /**
92
+ * Create an Apple OIDC provider.
93
+ *
94
+ * This is useful if you just want to verify the user's email address.
95
+ *
96
+ * @param config - The config for the provider.
97
+ * @example
98
+ * ```ts
99
+ * AppleOidcProvider({
100
+ * clientID: "1234567890"
101
+ * })
102
+ * ```
103
+ */
104
+ export declare function AppleOidcProvider(config: AppleOidcConfig): import("./provider.js").Provider<{
105
+ id: import("hono/utils/jwt/types").JWTPayload;
106
+ clientID: string;
107
+ }>;
108
+ //# sourceMappingURL=apple.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apple.d.ts","sourceRoot":"","sources":["../../../src/provider/apple.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AAEH,OAAO,EAAkB,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACjE,OAAO,EAAgB,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAE3D,MAAM,WAAW,WAAY,SAAQ,mBAAmB;IACtD;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,GAAG,WAAW,CAAA;CACrC;AACD,MAAM,WAAW,eAAgB,SAAQ,iBAAiB;CAAG;AAE7D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW;;;GAiBhD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,eAAe;;;GAMxD"}
@@ -0,0 +1,16 @@
1
+ import type { OAuth2Tokens } from "arctic";
2
+ import { Provider } from "./provider.js";
3
+ export interface ArcticProviderOptions {
4
+ scopes: string[];
5
+ clientID: string;
6
+ clientSecret: string;
7
+ query?: Record<string, string>;
8
+ }
9
+ export declare function ArcticProvider(provider: new (clientID: string, clientSecret: string, callback: string) => {
10
+ createAuthorizationURL(state: string, scopes: string[]): URL;
11
+ validateAuthorizationCode(code: string): Promise<OAuth2Tokens>;
12
+ refreshAccessToken(refreshToken: string): Promise<OAuth2Tokens>;
13
+ }, config: ArcticProviderOptions): Provider<{
14
+ tokenset: OAuth2Tokens;
15
+ }>;
16
+ //# sourceMappingURL=arctic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arctic.d.ts","sourceRoot":"","sources":["../../../src/provider/arctic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAE1C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAIxC,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B;AAMD,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,KACR,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,KACb;IACH,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAA;IAC5D,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;IAC9D,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;CAChE,EACD,MAAM,EAAE,qBAAqB,GAC5B,QAAQ,CAAC;IACV,QAAQ,EAAE,YAAY,CAAA;CACvB,CAAC,CAmCD"}