@draftlab/auth 0.15.0 → 0.16.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.
- package/dist/esm/allow.js +26 -0
- package/dist/esm/client.js +254 -0
- package/dist/esm/core.js +597 -0
- package/dist/esm/css.d.js +0 -0
- package/dist/esm/error.js +88 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/keys.js +126 -0
- package/dist/esm/mutex.js +53 -0
- package/dist/esm/pkce.js +87 -0
- package/dist/esm/provider/apple.js +15 -0
- package/dist/esm/provider/code.js +62 -0
- package/dist/esm/provider/discord.js +15 -0
- package/dist/esm/provider/facebook.js +15 -0
- package/dist/esm/provider/github.js +15 -0
- package/dist/esm/provider/gitlab.js +15 -0
- package/dist/esm/provider/google.js +16 -0
- package/dist/esm/provider/linkedin.js +15 -0
- package/dist/esm/provider/magiclink.js +83 -0
- package/dist/esm/provider/microsoft.js +15 -0
- package/dist/esm/provider/oauth2.js +130 -0
- package/dist/esm/provider/password.js +331 -0
- package/dist/esm/provider/provider.js +18 -0
- package/dist/esm/provider/reddit.js +15 -0
- package/dist/esm/provider/slack.js +15 -0
- package/dist/esm/provider/spotify.js +15 -0
- package/dist/esm/provider/twitch.js +15 -0
- package/dist/esm/provider/vercel.js +17 -0
- package/dist/esm/random.js +40 -0
- package/dist/esm/revocation.js +27 -0
- package/dist/esm/storage/memory.js +110 -0
- package/dist/esm/storage/storage.js +56 -0
- package/dist/esm/storage/turso.js +93 -0
- package/dist/esm/storage/unstorage.js +78 -0
- package/dist/esm/subject.js +7 -0
- package/dist/esm/themes/theme.js +115 -0
- package/dist/esm/toolkit/client.js +119 -0
- package/dist/esm/toolkit/index.js +25 -0
- package/dist/esm/toolkit/providers/facebook.js +11 -0
- package/dist/esm/toolkit/providers/github.js +11 -0
- package/dist/esm/toolkit/providers/google.js +11 -0
- package/dist/esm/toolkit/providers/strategy.js +0 -0
- package/dist/esm/toolkit/storage.js +81 -0
- package/dist/esm/toolkit/utils.js +18 -0
- package/dist/esm/types.js +0 -0
- package/dist/esm/ui/base.js +478 -0
- package/dist/esm/ui/code.js +186 -0
- package/dist/esm/ui/form.js +46 -0
- package/dist/esm/ui/icon.js +242 -0
- package/dist/esm/ui/magiclink.js +158 -0
- package/dist/esm/ui/password.js +435 -0
- package/dist/esm/ui/select.js +102 -0
- package/dist/esm/util.js +59 -0
- package/dist/{allow.d.mts → types/allow.d.ts} +9 -11
- package/dist/types/allow.d.ts.map +1 -0
- package/dist/types/client.d.ts +462 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/types/core.d.ts +113 -0
- package/dist/types/core.d.ts.map +1 -0
- package/dist/{error.d.mts → types/error.d.ts} +95 -97
- package/dist/types/error.d.ts.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/{keys.d.mts → types/keys.d.ts} +20 -24
- package/dist/types/keys.d.ts.map +1 -0
- package/dist/types/mutex.d.ts +42 -0
- package/dist/types/mutex.d.ts.map +1 -0
- package/dist/{pkce.d.mts → types/pkce.d.ts} +10 -11
- package/dist/types/pkce.d.ts.map +1 -0
- package/dist/types/provider/apple.d.ts +197 -0
- package/dist/types/provider/apple.d.ts.map +1 -0
- package/dist/types/provider/code.d.ts +288 -0
- package/dist/types/provider/code.d.ts.map +1 -0
- package/dist/types/provider/discord.d.ts +206 -0
- package/dist/types/provider/discord.d.ts.map +1 -0
- package/dist/types/provider/facebook.d.ts +200 -0
- package/dist/types/provider/facebook.d.ts.map +1 -0
- package/dist/types/provider/github.d.ts +220 -0
- package/dist/types/provider/github.d.ts.map +1 -0
- package/dist/types/provider/gitlab.d.ts +180 -0
- package/dist/types/provider/gitlab.d.ts.map +1 -0
- package/dist/types/provider/google.d.ts +158 -0
- package/dist/types/provider/google.d.ts.map +1 -0
- package/dist/types/provider/linkedin.d.ts +190 -0
- package/dist/types/provider/linkedin.d.ts.map +1 -0
- package/dist/types/provider/magiclink.d.ts +141 -0
- package/dist/types/provider/magiclink.d.ts.map +1 -0
- package/dist/types/provider/microsoft.d.ts +247 -0
- package/dist/types/provider/microsoft.d.ts.map +1 -0
- package/dist/types/provider/oauth2.d.ts +229 -0
- package/dist/types/provider/oauth2.d.ts.map +1 -0
- package/dist/types/provider/password.d.ts +408 -0
- package/dist/types/provider/password.d.ts.map +1 -0
- package/dist/types/provider/provider.d.ts +226 -0
- package/dist/types/provider/provider.d.ts.map +1 -0
- package/dist/types/provider/reddit.d.ts +159 -0
- package/dist/types/provider/reddit.d.ts.map +1 -0
- package/dist/types/provider/slack.d.ts +171 -0
- package/dist/types/provider/slack.d.ts.map +1 -0
- package/dist/types/provider/spotify.d.ts +168 -0
- package/dist/types/provider/spotify.d.ts.map +1 -0
- package/dist/types/provider/twitch.d.ts +163 -0
- package/dist/types/provider/twitch.d.ts.map +1 -0
- package/dist/types/provider/vercel.d.ts +294 -0
- package/dist/types/provider/vercel.d.ts.map +1 -0
- package/dist/{random.d.mts → types/random.d.ts} +4 -6
- package/dist/types/random.d.ts.map +1 -0
- package/dist/types/revocation.d.ts +76 -0
- package/dist/types/revocation.d.ts.map +1 -0
- package/dist/{storage/memory.d.mts → types/storage/memory.d.ts} +17 -21
- package/dist/types/storage/memory.d.ts.map +1 -0
- package/dist/types/storage/storage.d.ts +177 -0
- package/dist/types/storage/storage.d.ts.map +1 -0
- package/dist/{storage/turso.d.mts → types/storage/turso.d.ts} +4 -8
- package/dist/types/storage/turso.d.ts.map +1 -0
- package/dist/{storage/unstorage.d.mts → types/storage/unstorage.d.ts} +12 -11
- package/dist/types/storage/unstorage.d.ts.map +1 -0
- package/dist/types/subject.d.ts +115 -0
- package/dist/types/subject.d.ts.map +1 -0
- package/dist/types/themes/theme.d.ts +207 -0
- package/dist/types/themes/theme.d.ts.map +1 -0
- package/dist/types/toolkit/client.d.ts +235 -0
- package/dist/types/toolkit/client.d.ts.map +1 -0
- package/dist/types/toolkit/index.d.ts +45 -0
- package/dist/types/toolkit/index.d.ts.map +1 -0
- package/dist/types/toolkit/providers/facebook.d.ts +8 -0
- package/dist/types/toolkit/providers/facebook.d.ts.map +1 -0
- package/dist/types/toolkit/providers/github.d.ts +8 -0
- package/dist/types/toolkit/providers/github.d.ts.map +1 -0
- package/dist/types/toolkit/providers/google.d.ts +8 -0
- package/dist/types/toolkit/providers/google.d.ts.map +1 -0
- package/dist/types/toolkit/providers/strategy.d.ts +38 -0
- package/dist/types/toolkit/providers/strategy.d.ts.map +1 -0
- package/dist/{toolkit/storage.d.mts → types/toolkit/storage.d.ts} +37 -39
- package/dist/types/toolkit/storage.d.ts.map +1 -0
- package/dist/{toolkit/utils.d.mts → types/toolkit/utils.d.ts} +2 -4
- package/dist/types/toolkit/utils.d.ts.map +1 -0
- package/dist/types/types.d.ts +92 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/ui/base.d.ts +18 -0
- package/dist/types/ui/base.d.ts.map +1 -0
- package/dist/types/ui/code.d.ts +43 -0
- package/dist/types/ui/code.d.ts.map +1 -0
- package/dist/types/ui/form.d.ts +24 -0
- package/dist/types/ui/form.d.ts.map +1 -0
- package/dist/types/ui/icon.d.ts +60 -0
- package/dist/types/ui/icon.d.ts.map +1 -0
- package/dist/types/ui/magiclink.d.ts +41 -0
- package/dist/types/ui/magiclink.d.ts.map +1 -0
- package/dist/types/ui/password.d.ts +43 -0
- package/dist/types/ui/password.d.ts.map +1 -0
- package/dist/types/ui/select.d.ts +33 -0
- package/dist/types/ui/select.d.ts.map +1 -0
- package/dist/{util.d.mts → types/util.d.ts} +11 -13
- package/dist/types/util.d.ts.map +1 -0
- package/package.json +10 -16
- package/dist/adapters/node.d.mts +0 -18
- package/dist/adapters/node.mjs +0 -69
- package/dist/allow.mjs +0 -63
- package/dist/client.d.mts +0 -456
- package/dist/client.mjs +0 -283
- package/dist/core.d.mts +0 -110
- package/dist/core.mjs +0 -595
- package/dist/error.mjs +0 -237
- package/dist/index.d.mts +0 -2
- package/dist/index.mjs +0 -3
- package/dist/keys.mjs +0 -146
- package/dist/mutex.d.mts +0 -44
- package/dist/mutex.mjs +0 -110
- package/dist/pkce.mjs +0 -157
- package/dist/provider/apple.d.mts +0 -111
- package/dist/provider/apple.mjs +0 -164
- package/dist/provider/code.d.mts +0 -228
- package/dist/provider/code.mjs +0 -246
- package/dist/provider/discord.d.mts +0 -146
- package/dist/provider/discord.mjs +0 -156
- package/dist/provider/facebook.d.mts +0 -142
- package/dist/provider/facebook.mjs +0 -150
- package/dist/provider/github.d.mts +0 -140
- package/dist/provider/github.mjs +0 -169
- package/dist/provider/gitlab.d.mts +0 -106
- package/dist/provider/gitlab.mjs +0 -147
- package/dist/provider/google.d.mts +0 -112
- package/dist/provider/google.mjs +0 -109
- package/dist/provider/linkedin.d.mts +0 -132
- package/dist/provider/linkedin.mjs +0 -142
- package/dist/provider/magiclink.d.mts +0 -89
- package/dist/provider/magiclink.mjs +0 -143
- package/dist/provider/microsoft.d.mts +0 -178
- package/dist/provider/microsoft.mjs +0 -177
- package/dist/provider/oauth2.d.mts +0 -176
- package/dist/provider/oauth2.mjs +0 -222
- package/dist/provider/passkey.d.mts +0 -104
- package/dist/provider/passkey.mjs +0 -320
- package/dist/provider/password.d.mts +0 -412
- package/dist/provider/password.mjs +0 -363
- package/dist/provider/provider.d.mts +0 -227
- package/dist/provider/provider.mjs +0 -44
- package/dist/provider/reddit.d.mts +0 -107
- package/dist/provider/reddit.mjs +0 -127
- package/dist/provider/slack.d.mts +0 -114
- package/dist/provider/slack.mjs +0 -138
- package/dist/provider/spotify.d.mts +0 -113
- package/dist/provider/spotify.mjs +0 -135
- package/dist/provider/totp.d.mts +0 -112
- package/dist/provider/totp.mjs +0 -191
- package/dist/provider/twitch.d.mts +0 -108
- package/dist/provider/twitch.mjs +0 -131
- package/dist/provider/vercel.d.mts +0 -177
- package/dist/provider/vercel.mjs +0 -230
- package/dist/random.mjs +0 -86
- package/dist/revocation.d.mts +0 -55
- package/dist/revocation.mjs +0 -63
- package/dist/router/context.d.mts +0 -21
- package/dist/router/context.mjs +0 -193
- package/dist/router/cookies.d.mts +0 -8
- package/dist/router/cookies.mjs +0 -13
- package/dist/router/index.d.mts +0 -21
- package/dist/router/index.mjs +0 -107
- package/dist/router/matcher.d.mts +0 -15
- package/dist/router/matcher.mjs +0 -76
- package/dist/router/middleware/cors.d.mts +0 -15
- package/dist/router/middleware/cors.mjs +0 -114
- package/dist/router/safe-request.d.mts +0 -52
- package/dist/router/safe-request.mjs +0 -160
- package/dist/router/types.d.mts +0 -67
- package/dist/router/types.mjs +0 -1
- package/dist/router/variables.d.mts +0 -12
- package/dist/router/variables.mjs +0 -20
- package/dist/storage/memory.mjs +0 -125
- package/dist/storage/storage.d.mts +0 -179
- package/dist/storage/storage.mjs +0 -104
- package/dist/storage/turso.mjs +0 -117
- package/dist/storage/unstorage.mjs +0 -103
- package/dist/subject.d.mts +0 -62
- package/dist/subject.mjs +0 -36
- package/dist/themes/theme.d.mts +0 -209
- package/dist/themes/theme.mjs +0 -120
- package/dist/toolkit/client.d.mts +0 -169
- package/dist/toolkit/client.mjs +0 -209
- package/dist/toolkit/index.d.mts +0 -9
- package/dist/toolkit/index.mjs +0 -9
- package/dist/toolkit/providers/facebook.d.mts +0 -12
- package/dist/toolkit/providers/facebook.mjs +0 -16
- package/dist/toolkit/providers/github.d.mts +0 -12
- package/dist/toolkit/providers/github.mjs +0 -16
- package/dist/toolkit/providers/google.d.mts +0 -12
- package/dist/toolkit/providers/google.mjs +0 -20
- package/dist/toolkit/providers/strategy.d.mts +0 -40
- package/dist/toolkit/providers/strategy.mjs +0 -1
- package/dist/toolkit/storage.mjs +0 -157
- package/dist/toolkit/utils.mjs +0 -30
- package/dist/types.d.mts +0 -94
- package/dist/types.mjs +0 -1
- package/dist/ui/base.d.mts +0 -30
- package/dist/ui/base.mjs +0 -407
- package/dist/ui/code.d.mts +0 -43
- package/dist/ui/code.mjs +0 -173
- package/dist/ui/form.d.mts +0 -32
- package/dist/ui/form.mjs +0 -49
- package/dist/ui/icon.d.mts +0 -58
- package/dist/ui/icon.mjs +0 -247
- package/dist/ui/magiclink.d.mts +0 -41
- package/dist/ui/magiclink.mjs +0 -152
- package/dist/ui/passkey.d.mts +0 -27
- package/dist/ui/passkey.mjs +0 -323
- package/dist/ui/password.d.mts +0 -42
- package/dist/ui/password.mjs +0 -402
- package/dist/ui/select.d.mts +0 -34
- package/dist/ui/select.mjs +0 -98
- package/dist/ui/totp.d.mts +0 -34
- package/dist/ui/totp.mjs +0 -270
- package/dist/util.mjs +0 -128
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
//#region src/error.d.ts
|
|
2
1
|
/**
|
|
3
2
|
* Error classes and types for Draft Auth operations.
|
|
4
3
|
* Provides comprehensive error handling for OAuth 2.0 and authentication flows.
|
|
@@ -38,93 +37,93 @@
|
|
|
38
37
|
* Standard OAuth error types
|
|
39
38
|
* These error codes are returned by OAuth authorization servers.
|
|
40
39
|
*/
|
|
41
|
-
type OauthErrorType = "invalid_request" | "invalid_client" | "invalid_grant" | "invalid_token" | "invalid_redirect_uri" | "insufficient_scope" | "unauthorized_client" | "access_denied" | "unsupported_grant_type" | "server_error" | "temporarily_unavailable" | "unsupported_response_type";
|
|
40
|
+
export type OauthErrorType = "invalid_request" | "invalid_client" | "invalid_grant" | "invalid_token" | "invalid_redirect_uri" | "insufficient_scope" | "unauthorized_client" | "access_denied" | "unsupported_grant_type" | "server_error" | "temporarily_unavailable" | "unsupported_response_type";
|
|
42
41
|
/**
|
|
43
42
|
* Base OAuth error class for handling standard OAuth error responses.
|
|
44
43
|
* Contains both the error code and human-readable description.
|
|
45
44
|
*/
|
|
46
|
-
declare class OauthError extends Error {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
45
|
+
export declare class OauthError extends Error {
|
|
46
|
+
/** The OAuth error code as defined in the specification */
|
|
47
|
+
readonly error: OauthErrorType;
|
|
48
|
+
/** Human-readable description of the error */
|
|
49
|
+
readonly description: string;
|
|
50
|
+
/**
|
|
51
|
+
* Creates a new OAuth error with the specified error code and description.
|
|
52
|
+
*
|
|
53
|
+
* @param error - The OAuth error type
|
|
54
|
+
* @param description - Human-readable error description
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```ts
|
|
58
|
+
* throw new OauthError("invalid_grant", "Authorization code has expired")
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
constructor(error: OauthErrorType, description: string);
|
|
62
|
+
/**
|
|
63
|
+
* Converts the error to a standard OAuth JSON response format.
|
|
64
|
+
*
|
|
65
|
+
* @returns Object with error and error_description fields
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```ts
|
|
69
|
+
* const oauthError = new OauthError("invalid_request", "Missing parameter")
|
|
70
|
+
* return c.json(oauthError.toJSON(), 400)
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
toJSON(): {
|
|
74
|
+
error: OauthErrorType;
|
|
75
|
+
error_description: string;
|
|
76
|
+
};
|
|
78
77
|
}
|
|
79
78
|
/**
|
|
80
79
|
* Error thrown when a provider parameter is missing from the authorization request.
|
|
81
80
|
* Occurs when multiple providers are configured but no specific provider is selected.
|
|
82
81
|
*/
|
|
83
|
-
declare class MissingProviderError extends OauthError {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
82
|
+
export declare class MissingProviderError extends OauthError {
|
|
83
|
+
/**
|
|
84
|
+
* Creates a missing provider error.
|
|
85
|
+
* Thrown when the provider query parameter is required but not provided.
|
|
86
|
+
*/
|
|
87
|
+
constructor();
|
|
89
88
|
}
|
|
90
89
|
/**
|
|
91
90
|
* Error thrown when a required parameter is missing from a request.
|
|
92
91
|
* Used for validating OAuth request parameters.
|
|
93
92
|
*/
|
|
94
|
-
declare class MissingParameterError extends OauthError {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
93
|
+
export declare class MissingParameterError extends OauthError {
|
|
94
|
+
/** The name of the missing parameter */
|
|
95
|
+
readonly parameter: string;
|
|
96
|
+
/**
|
|
97
|
+
* Creates a missing parameter error.
|
|
98
|
+
*
|
|
99
|
+
* @param parameter - The name of the missing parameter
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* ```ts
|
|
103
|
+
* throw new MissingParameterError("client_id")
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
constructor(parameter: string);
|
|
108
107
|
}
|
|
109
108
|
/**
|
|
110
109
|
* Error thrown when a client is not authorized to use a specific redirect URI.
|
|
111
110
|
* Prevents unauthorized clients from hijacking authorization codes.
|
|
112
111
|
*/
|
|
113
|
-
declare class UnauthorizedClientError extends OauthError {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
112
|
+
export declare class UnauthorizedClientError extends OauthError {
|
|
113
|
+
/** The client ID that attempted unauthorized access */
|
|
114
|
+
readonly clientID: string;
|
|
115
|
+
/**
|
|
116
|
+
* Creates an unauthorized client error.
|
|
117
|
+
*
|
|
118
|
+
* @param clientID - The client ID attempting unauthorized access
|
|
119
|
+
* @param redirectURI - The unauthorized redirect URI
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* ```ts
|
|
123
|
+
* throw new UnauthorizedClientError("malicious-client", "https://evil.com/callback")
|
|
124
|
+
* ```
|
|
125
|
+
*/
|
|
126
|
+
constructor(clientID: string, redirectURI: string);
|
|
128
127
|
}
|
|
129
128
|
/**
|
|
130
129
|
* Error thrown when the authentication flow is in an unknown or invalid state.
|
|
@@ -144,12 +143,12 @@ declare class UnauthorizedClientError extends OauthError {
|
|
|
144
143
|
* }
|
|
145
144
|
* ```
|
|
146
145
|
*/
|
|
147
|
-
declare class UnknownStateError extends Error {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
146
|
+
export declare class UnknownStateError extends Error {
|
|
147
|
+
/**
|
|
148
|
+
* Creates an unknown state error.
|
|
149
|
+
* Indicates that the authentication flow cannot continue due to missing state.
|
|
150
|
+
*/
|
|
151
|
+
constructor();
|
|
153
152
|
}
|
|
154
153
|
/**
|
|
155
154
|
* Error thrown when a subject (user identifier) is invalid or malformed.
|
|
@@ -164,11 +163,11 @@ declare class UnknownStateError extends Error {
|
|
|
164
163
|
* }
|
|
165
164
|
* ```
|
|
166
165
|
*/
|
|
167
|
-
declare class InvalidSubjectError extends Error {
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
166
|
+
export declare class InvalidSubjectError extends Error {
|
|
167
|
+
/**
|
|
168
|
+
* Creates an invalid subject error.
|
|
169
|
+
*/
|
|
170
|
+
constructor();
|
|
172
171
|
}
|
|
173
172
|
/**
|
|
174
173
|
* Error thrown when a refresh token is invalid, expired, or revoked.
|
|
@@ -187,11 +186,11 @@ declare class InvalidSubjectError extends Error {
|
|
|
187
186
|
* }
|
|
188
187
|
* ```
|
|
189
188
|
*/
|
|
190
|
-
declare class InvalidRefreshTokenError extends Error {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
189
|
+
export declare class InvalidRefreshTokenError extends Error {
|
|
190
|
+
/**
|
|
191
|
+
* Creates an invalid refresh token error.
|
|
192
|
+
*/
|
|
193
|
+
constructor();
|
|
195
194
|
}
|
|
196
195
|
/**
|
|
197
196
|
* Error thrown when an access token is invalid, expired, or malformed.
|
|
@@ -210,11 +209,11 @@ declare class InvalidRefreshTokenError extends Error {
|
|
|
210
209
|
* }
|
|
211
210
|
* ```
|
|
212
211
|
*/
|
|
213
|
-
declare class InvalidAccessTokenError extends Error {
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
212
|
+
export declare class InvalidAccessTokenError extends Error {
|
|
213
|
+
/**
|
|
214
|
+
* Creates an invalid access token error.
|
|
215
|
+
*/
|
|
216
|
+
constructor();
|
|
218
217
|
}
|
|
219
218
|
/**
|
|
220
219
|
* Error thrown when an authorization code is invalid, expired, or already used.
|
|
@@ -233,11 +232,10 @@ declare class InvalidAccessTokenError extends Error {
|
|
|
233
232
|
* }
|
|
234
233
|
* ```
|
|
235
234
|
*/
|
|
236
|
-
declare class InvalidAuthorizationCodeError extends Error {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
235
|
+
export declare class InvalidAuthorizationCodeError extends Error {
|
|
236
|
+
/**
|
|
237
|
+
* Creates an invalid authorization code error.
|
|
238
|
+
*/
|
|
239
|
+
constructor();
|
|
241
240
|
}
|
|
242
|
-
//#
|
|
243
|
-
export { InvalidAccessTokenError, InvalidAuthorizationCodeError, InvalidRefreshTokenError, InvalidSubjectError, MissingParameterError, MissingProviderError, OauthError, OauthErrorType, UnauthorizedClientError, UnknownStateError };
|
|
241
|
+
//# sourceMappingURL=error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH;;;GAGG;AACH,MAAM,MAAM,cAAc,GACvB,iBAAiB,GACjB,gBAAgB,GAChB,eAAe,GACf,eAAe,GACf,sBAAsB,GACtB,oBAAoB,GACpB,qBAAqB,GACrB,eAAe,GACf,wBAAwB,GACxB,cAAc,GACd,yBAAyB,GACzB,2BAA2B,CAAA;AAE9B;;;GAGG;AACH,qBAAa,UAAW,SAAQ,KAAK;IACpC,2DAA2D;IAC3D,SAAgB,KAAK,EAAE,cAAc,CAAA;IACrC,8CAA8C;IAC9C,SAAgB,WAAW,EAAE,MAAM,CAAA;IAEnC;;;;;;;;;;OAUG;gBACS,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM;IAOtD;;;;;;;;;;OAUG;IACH,MAAM;;;;CAMN;AAED;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,UAAU;IACnD;;;OAGG;;CAQH;AAED;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,UAAU;IACpD,wCAAwC;IACxC,SAAgB,SAAS,EAAE,MAAM,CAAA;IAEjC;;;;;;;;;OASG;gBACS,SAAS,EAAE,MAAM;CAK7B;AAED;;;GAGG;AACH,qBAAa,uBAAwB,SAAQ,UAAU;IACtD,uDAAuD;IACvD,SAAgB,QAAQ,EAAE,MAAM,CAAA;IAEhC;;;;;;;;;;OAUG;gBACS,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;CAQjD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC3C;;;OAGG;;CAOH;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;IAC7C;;OAEG;;CAKH;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,wBAAyB,SAAQ,KAAK;IAClD;;OAEG;;CAKH;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;IACjD;;OAEG;;CAKH;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,6BAA8B,SAAQ,KAAK;IACvD;;OAEG;;CAKH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA"}
|
|
@@ -1,27 +1,24 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
//#region src/keys.d.ts
|
|
5
|
-
|
|
1
|
+
import { type CryptoKey, type JWK } from "jose";
|
|
2
|
+
import { type StorageAdapter } from "./storage/storage";
|
|
6
3
|
/**
|
|
7
4
|
* Runtime key pair with loaded cryptographic keys and metadata.
|
|
8
5
|
* Ready for immediate use in signing and encryption operations.
|
|
9
6
|
*/
|
|
10
|
-
interface KeyPair {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
7
|
+
export interface KeyPair {
|
|
8
|
+
/** Unique identifier for the key pair */
|
|
9
|
+
readonly id: string;
|
|
10
|
+
/** Algorithm used for this key pair */
|
|
11
|
+
readonly alg: string;
|
|
12
|
+
/** Loaded public key for verification/encryption */
|
|
13
|
+
readonly public: CryptoKey;
|
|
14
|
+
/** Loaded private key for signing/decryption */
|
|
15
|
+
readonly private: CryptoKey;
|
|
16
|
+
/** Date when the key was created */
|
|
17
|
+
readonly created: Date;
|
|
18
|
+
/** Optional expiration date */
|
|
19
|
+
readonly expired?: Date;
|
|
20
|
+
/** JSON Web Key representation for JWKS endpoints */
|
|
21
|
+
readonly jwk: JWK;
|
|
25
22
|
}
|
|
26
23
|
/**
|
|
27
24
|
* Loads or generates signing keys for JWT operations.
|
|
@@ -42,7 +39,7 @@ interface KeyPair {
|
|
|
42
39
|
* .sign(currentKey.private)
|
|
43
40
|
* ```
|
|
44
41
|
*/
|
|
45
|
-
declare const signingKeys: (storage: StorageAdapter) => Promise<KeyPair[]>;
|
|
42
|
+
export declare const signingKeys: (storage: StorageAdapter) => Promise<KeyPair[]>;
|
|
46
43
|
/**
|
|
47
44
|
* Loads or generates encryption keys for token encryption operations.
|
|
48
45
|
* Returns existing valid keys, or generates new ones if none are available.
|
|
@@ -62,6 +59,5 @@ declare const signingKeys: (storage: StorageAdapter) => Promise<KeyPair[]>;
|
|
|
62
59
|
* .encrypt(currentKey.public)
|
|
63
60
|
* ```
|
|
64
61
|
*/
|
|
65
|
-
declare const encryptionKeys: (storage: StorageAdapter) => Promise<KeyPair[]>;
|
|
66
|
-
//#
|
|
67
|
-
export { KeyPair, encryptionKeys, signingKeys };
|
|
62
|
+
export declare const encryptionKeys: (storage: StorageAdapter) => Promise<KeyPair[]>;
|
|
63
|
+
//# sourceMappingURL=keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/keys.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,SAAS,EAOd,KAAK,GAAG,EACR,MAAM,MAAM,CAAA;AAGb,OAAO,EAAW,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAoChE;;;GAGG;AACH,MAAM,WAAW,OAAO;IACvB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,uCAAuC;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,oDAAoD;IACpD,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAA;IAC3B,oCAAoC;IACpC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAA;IACtB,+BAA+B;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAA;IACvB,qDAAqD;IACrD,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAA;CACjB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,WAAW,GAAU,SAAS,cAAc,KAAG,OAAO,CAAC,OAAO,EAAE,CAmE5E,CAAA;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,cAAc,GAAU,SAAS,cAAc,KAAG,OAAO,CAAC,OAAO,EAAE,CAiE/E,CAAA"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A Mutex (mutual exclusion lock) for async functions.
|
|
3
|
+
* It allows only one async task to access a critical section at a time.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* const mutex = new Mutex();
|
|
7
|
+
*
|
|
8
|
+
* async function criticalSection() {
|
|
9
|
+
* await mutex.acquire();
|
|
10
|
+
* try {
|
|
11
|
+
* // This code section cannot be executed simultaneously
|
|
12
|
+
* } finally {
|
|
13
|
+
* mutex.release();
|
|
14
|
+
* }
|
|
15
|
+
* }
|
|
16
|
+
*/
|
|
17
|
+
export declare class Mutex {
|
|
18
|
+
private semaphore;
|
|
19
|
+
/**
|
|
20
|
+
* Checks if the mutex is currently locked.
|
|
21
|
+
* @returns True if the mutex is locked, false otherwise.
|
|
22
|
+
*/
|
|
23
|
+
get isLocked(): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Acquires the mutex, blocking if necessary until it is available.
|
|
26
|
+
* @returns A promise that resolves when the mutex is acquired.
|
|
27
|
+
*/
|
|
28
|
+
acquire(): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Releases the mutex, allowing another waiting task to proceed.
|
|
31
|
+
*/
|
|
32
|
+
release(): void;
|
|
33
|
+
/**
|
|
34
|
+
* Runs a function while holding the mutex lock.
|
|
35
|
+
* Automatically acquires before and releases after the function execution.
|
|
36
|
+
*
|
|
37
|
+
* @param fn - The function to execute while holding the lock
|
|
38
|
+
* @returns The result of the function
|
|
39
|
+
*/
|
|
40
|
+
runExclusive<T>(fn: () => Promise<T>): Promise<T>;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=mutex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutex.d.ts","sourceRoot":"","sources":["../../src/mutex.ts"],"names":[],"mappings":"AA8DA;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,KAAK;IACjB,OAAO,CAAC,SAAS,CAAmB;IAEpC;;;OAGG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf;;;;;;OAMG;IACG,YAAY,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAQvD"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
//#region src/pkce.d.ts
|
|
2
1
|
/**
|
|
3
2
|
* PKCE (Proof Key for Code Exchange) implementation for OAuth security.
|
|
4
3
|
* Provides protection against authorization code interception attacks by using
|
|
@@ -12,12 +11,12 @@ type PKCEMethod = "S256" | "plain";
|
|
|
12
11
|
* Complete PKCE challenge data containing verifier, challenge, and method.
|
|
13
12
|
*/
|
|
14
13
|
interface PKCEChallenge {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
14
|
+
/** The code verifier to be sent to the token endpoint */
|
|
15
|
+
readonly verifier: string;
|
|
16
|
+
/** The code challenge to be sent to the authorization endpoint */
|
|
17
|
+
readonly challenge: string;
|
|
18
|
+
/** The challenge method used */
|
|
19
|
+
readonly method: "S256";
|
|
21
20
|
}
|
|
22
21
|
/**
|
|
23
22
|
* Generates a complete PKCE challenge for OAuth authorization requests.
|
|
@@ -41,7 +40,7 @@ interface PKCEChallenge {
|
|
|
41
40
|
*
|
|
42
41
|
* @throws {RangeError} If length is outside valid range or generated verifier doesn't meet requirements
|
|
43
42
|
*/
|
|
44
|
-
declare const generatePKCE: (length?: number) => Promise<PKCEChallenge>;
|
|
43
|
+
export declare const generatePKCE: (length?: number) => Promise<PKCEChallenge>;
|
|
45
44
|
/**
|
|
46
45
|
* Validates a PKCE code verifier against a previously generated challenge.
|
|
47
46
|
* Uses timing-safe comparison and timing normalization to prevent timing attacks.
|
|
@@ -67,6 +66,6 @@ declare const generatePKCE: (length?: number) => Promise<PKCEChallenge>;
|
|
|
67
66
|
* }
|
|
68
67
|
* ```
|
|
69
68
|
*/
|
|
70
|
-
declare const validatePKCE: (verifier: string, challenge: string, method?: PKCEMethod) => Promise<boolean>;
|
|
71
|
-
|
|
72
|
-
|
|
69
|
+
export declare const validatePKCE: (verifier: string, challenge: string, method?: PKCEMethod) => Promise<boolean>;
|
|
70
|
+
export {};
|
|
71
|
+
//# sourceMappingURL=pkce.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pkce.d.ts","sourceRoot":"","sources":["../../src/pkce.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH;;GAEG;AACH,KAAK,UAAU,GAAG,MAAM,GAAG,OAAO,CAAA;AA0DlC;;GAEG;AACH,UAAU,aAAa;IACtB,yDAAyD;IACzD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,kEAAkE;IAClE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,gCAAgC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACvB;AAmCD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,YAAY,GAAU,eAAW,KAAG,OAAO,CAAC,aAAa,CA0BrE,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,YAAY,GACxB,UAAU,MAAM,EAChB,WAAW,MAAM,EACjB,SAAQ,UAAmB,KACzB,OAAO,CAAC,OAAO,CAqDjB,CAAA"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Apple authentication provider for Draft Auth.
|
|
3
|
+
* Implements OAuth 2.0 flow for authenticating users with their Apple accounts.
|
|
4
|
+
*
|
|
5
|
+
* ## Quick Setup
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* import { AppleProvider } from "@draftlab/auth/provider/apple"
|
|
9
|
+
*
|
|
10
|
+
* export default issuer({
|
|
11
|
+
* basePath: "/auth", // Important for callback URL
|
|
12
|
+
* providers: {
|
|
13
|
+
* apple: AppleProvider({
|
|
14
|
+
* clientID: process.env.APPLE_CLIENT_ID,
|
|
15
|
+
* clientSecret: process.env.APPLE_CLIENT_SECRET,
|
|
16
|
+
* scopes: ["name", "email"]
|
|
17
|
+
* })
|
|
18
|
+
* }
|
|
19
|
+
* })
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* **Callback URL Pattern**: `{baseURL}{basePath}/{provider}/callback`
|
|
23
|
+
* - Development: `http://localhost:3000/auth/apple/callback`
|
|
24
|
+
* - Production: `https://yourapp.com/auth/apple/callback`
|
|
25
|
+
*
|
|
26
|
+
* Register this URL in your Apple Developer Portal.
|
|
27
|
+
*
|
|
28
|
+
* ## Setup Instructions
|
|
29
|
+
*
|
|
30
|
+
* ### 1. Create App ID
|
|
31
|
+
* - Go to [Apple Developer](https://developer.apple.com)
|
|
32
|
+
* - Create a new App ID with "Sign in with Apple" capability
|
|
33
|
+
*
|
|
34
|
+
* ### 2. Create Service ID
|
|
35
|
+
* - Create a new Service ID (this is your clientID)
|
|
36
|
+
* - Configure "Sign in with Apple"
|
|
37
|
+
* - Add your redirect URI
|
|
38
|
+
*
|
|
39
|
+
* ### 3. Create Private Key
|
|
40
|
+
* - Create a private key for "Sign in with Apple"
|
|
41
|
+
* - Download the .p8 file (this is used to create your clientSecret)
|
|
42
|
+
*
|
|
43
|
+
* ## Client Secret Generation
|
|
44
|
+
*
|
|
45
|
+
* Apple requires a JWT token as the client secret. You'll need:
|
|
46
|
+
* - Key ID from the private key
|
|
47
|
+
* - Team ID from your Apple Developer account
|
|
48
|
+
* - Private key (.p8 file)
|
|
49
|
+
*
|
|
50
|
+
* Use a library to generate the JWT (valid for ~15 minutes):
|
|
51
|
+
*
|
|
52
|
+
* ```ts
|
|
53
|
+
* import { SignJWT } from "jose"
|
|
54
|
+
*
|
|
55
|
+
* const secret = await new SignJWT({
|
|
56
|
+
* iss: "YOUR_TEAM_ID",
|
|
57
|
+
* aud: "https://appleid.apple.com",
|
|
58
|
+
* sub: process.env.APPLE_CLIENT_ID,
|
|
59
|
+
* iat: Math.floor(Date.now() / 1000),
|
|
60
|
+
* exp: Math.floor(Date.now() / 1000) + 15 * 60
|
|
61
|
+
* })
|
|
62
|
+
* .setProtectedHeader({ alg: "ES256", kid: "YOUR_KEY_ID" })
|
|
63
|
+
* .sign(privateKey)
|
|
64
|
+
* ```
|
|
65
|
+
*
|
|
66
|
+
* ## Common Scopes
|
|
67
|
+
*
|
|
68
|
+
* - `name` - Access user's name (first and last name)
|
|
69
|
+
* - `email` - Access user's email address
|
|
70
|
+
*
|
|
71
|
+
* Note: Apple only returns user data on the first authorization. Subsequent authorizations won't include name/email.
|
|
72
|
+
*
|
|
73
|
+
* ## User Data Access
|
|
74
|
+
*
|
|
75
|
+
* ```ts
|
|
76
|
+
* success: async (ctx, value) => {
|
|
77
|
+
* if (value.provider === "apple") {
|
|
78
|
+
* const accessToken = value.tokenset.access
|
|
79
|
+
*
|
|
80
|
+
* // Apple doesn't provide a userinfo endpoint
|
|
81
|
+
* // User data is returned in the authorization response
|
|
82
|
+
* // You need to parse the id_token JWT to get user info
|
|
83
|
+
*
|
|
84
|
+
* // For subsequent logins without name/email, use the subject (user_id)
|
|
85
|
+
* // from the ID token to identify the user
|
|
86
|
+
* }
|
|
87
|
+
* }
|
|
88
|
+
* ```
|
|
89
|
+
*
|
|
90
|
+
* @packageDocumentation
|
|
91
|
+
*/
|
|
92
|
+
import { type Oauth2WrappedConfig } from "./oauth2";
|
|
93
|
+
/**
|
|
94
|
+
* Configuration options for Apple OAuth 2.0 provider.
|
|
95
|
+
* Extends the base OAuth 2.0 configuration with Apple-specific documentation.
|
|
96
|
+
*/
|
|
97
|
+
export interface AppleConfig extends Oauth2WrappedConfig {
|
|
98
|
+
/**
|
|
99
|
+
* Apple Service ID (app identifier for your Sign in with Apple implementation).
|
|
100
|
+
* Get this from your Apple Developer account when creating a Service ID.
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* ```ts
|
|
104
|
+
* {
|
|
105
|
+
* clientID: "com.example.app.signin"
|
|
106
|
+
* }
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
readonly clientID: string;
|
|
110
|
+
/**
|
|
111
|
+
* Apple client secret (JWT token signed with your private key).
|
|
112
|
+
* This is different from other providers - Apple requires a JWT token
|
|
113
|
+
* generated from your private key.
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* ```ts
|
|
117
|
+
* {
|
|
118
|
+
* clientSecret: process.env.APPLE_CLIENT_SECRET
|
|
119
|
+
* }
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
readonly clientSecret: string;
|
|
123
|
+
/**
|
|
124
|
+
* Apple OAuth scopes to request access for.
|
|
125
|
+
* Apple only supports "name" and "email" scopes.
|
|
126
|
+
*
|
|
127
|
+
* Important: Apple only provides user data (name, email) on the FIRST authorization.
|
|
128
|
+
* Subsequent authorizations won't include this data.
|
|
129
|
+
*
|
|
130
|
+
* @example
|
|
131
|
+
* ```ts
|
|
132
|
+
* {
|
|
133
|
+
* scopes: ["name", "email"]
|
|
134
|
+
* }
|
|
135
|
+
* ```
|
|
136
|
+
*/
|
|
137
|
+
readonly scopes: string[];
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Creates an Apple OAuth 2.0 authentication provider.
|
|
141
|
+
* Allows users to authenticate using their Apple accounts.
|
|
142
|
+
*
|
|
143
|
+
* @param config - Apple OAuth 2.0 configuration
|
|
144
|
+
* @returns OAuth 2.0 provider configured for Apple
|
|
145
|
+
*
|
|
146
|
+
* @example
|
|
147
|
+
* ```ts
|
|
148
|
+
* // Basic Apple authentication
|
|
149
|
+
* const basicApple = AppleProvider({
|
|
150
|
+
* clientID: process.env.APPLE_CLIENT_ID,
|
|
151
|
+
* clientSecret: process.env.APPLE_CLIENT_SECRET
|
|
152
|
+
* })
|
|
153
|
+
*
|
|
154
|
+
* // Apple with name and email scopes
|
|
155
|
+
* const appleWithScopes = AppleProvider({
|
|
156
|
+
* clientID: process.env.APPLE_CLIENT_ID,
|
|
157
|
+
* clientSecret: process.env.APPLE_CLIENT_SECRET,
|
|
158
|
+
* scopes: ["name", "email"]
|
|
159
|
+
* })
|
|
160
|
+
*
|
|
161
|
+
* // Using the tokens and id_token
|
|
162
|
+
* export default issuer({
|
|
163
|
+
* providers: { apple: appleWithScopes },
|
|
164
|
+
* success: async (ctx, value) => {
|
|
165
|
+
* if (value.provider === "apple") {
|
|
166
|
+
* // Apple returns user data in the initial authorization response
|
|
167
|
+
* // You need to decode the id_token to extract user information
|
|
168
|
+
*
|
|
169
|
+
* // The id_token contains:
|
|
170
|
+
* // - sub: unique Apple user identifier
|
|
171
|
+
* // - email: user email (only on first authorization)
|
|
172
|
+
* // - email_verified: whether email is verified
|
|
173
|
+
* // - is_private_email: whether user used private relay
|
|
174
|
+
*
|
|
175
|
+
* // Decode and verify the id_token using jose:
|
|
176
|
+
* // const verified = await jwtVerify(value.tokenset.id, jwks)
|
|
177
|
+
* // const user = verified.payload
|
|
178
|
+
*
|
|
179
|
+
* return ctx.subject("user", {
|
|
180
|
+
* appleId: user.sub,
|
|
181
|
+
* email: user.email,
|
|
182
|
+
* emailVerified: user.email_verified,
|
|
183
|
+
* isPrivateEmail: user.is_private_email
|
|
184
|
+
* })
|
|
185
|
+
* }
|
|
186
|
+
* }
|
|
187
|
+
* })
|
|
188
|
+
* ```
|
|
189
|
+
*
|
|
190
|
+
* **Callback URL Pattern**: `{baseURL}{basePath}/{provider}/callback`
|
|
191
|
+
* - Development: `http://localhost:3000/auth/apple/callback`
|
|
192
|
+
* - Production: `https://yourapp.com/auth/apple/callback`
|
|
193
|
+
*
|
|
194
|
+
* Register this URL in your Apple Developer Portal.
|
|
195
|
+
*/
|
|
196
|
+
export declare const AppleProvider: (config: AppleConfig) => import("./provider").Provider<import("./oauth2").Oauth2UserData>;
|
|
197
|
+
//# sourceMappingURL=apple.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apple.d.ts","sourceRoot":"","sources":["../../../src/provider/apple.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0FG;AAEH,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAEnE;;;GAGG;AACH,MAAM,WAAW,WAAY,SAAQ,mBAAmB;IACvD;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IAEzB;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAE7B;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CACzB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,eAAO,MAAM,aAAa,GAAI,QAAQ,WAAW,qEAShD,CAAA"}
|