@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,112 +0,0 @@
|
|
|
1
|
-
import { Provider } from "./provider.mjs";
|
|
2
|
-
import { Oauth2UserData, Oauth2WrappedConfig } from "./oauth2.mjs";
|
|
3
|
-
|
|
4
|
-
//#region src/provider/google.d.ts
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Configuration options for Google OAuth 2.0 provider.
|
|
8
|
-
* Extends the base OAuth 2.0 configuration with Google-specific defaults.
|
|
9
|
-
*/
|
|
10
|
-
interface GoogleConfig extends Oauth2WrappedConfig {
|
|
11
|
-
/**
|
|
12
|
-
* Google OAuth 2.0 client ID from Google Cloud Console.
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* ```ts
|
|
16
|
-
* {
|
|
17
|
-
* clientID: "123456789-abc123.apps.googleusercontent.com"
|
|
18
|
-
* }
|
|
19
|
-
* ```
|
|
20
|
-
*/
|
|
21
|
-
readonly clientID: string;
|
|
22
|
-
/**
|
|
23
|
-
* Google OAuth 2.0 client secret from Google Cloud Console.
|
|
24
|
-
* Required for server-side OAuth 2.0 flows.
|
|
25
|
-
*
|
|
26
|
-
* @example
|
|
27
|
-
* ```ts
|
|
28
|
-
* {
|
|
29
|
-
* clientSecret: process.env.GOOGLE_CLIENT_SECRET
|
|
30
|
-
* }
|
|
31
|
-
* ```
|
|
32
|
-
*/
|
|
33
|
-
readonly clientSecret: string;
|
|
34
|
-
/**
|
|
35
|
-
* Google OAuth 2.0 scopes to request.
|
|
36
|
-
* Common scopes include 'profile', 'email', and specific Google API scopes.
|
|
37
|
-
*
|
|
38
|
-
* @example
|
|
39
|
-
* ```ts
|
|
40
|
-
* {
|
|
41
|
-
* scopes: [
|
|
42
|
-
* "profile",
|
|
43
|
-
* "email",
|
|
44
|
-
* "https://www.googleapis.com/auth/calendar.readonly",
|
|
45
|
-
* "https://www.googleapis.com/auth/drive.file"
|
|
46
|
-
* ]
|
|
47
|
-
* }
|
|
48
|
-
* ```
|
|
49
|
-
*/
|
|
50
|
-
readonly scopes: string[];
|
|
51
|
-
/**
|
|
52
|
-
* Additional query parameters for Google OAuth 2.0.
|
|
53
|
-
* Useful for Google-specific options like hosted domain restrictions.
|
|
54
|
-
*
|
|
55
|
-
* @example
|
|
56
|
-
* ```ts
|
|
57
|
-
* {
|
|
58
|
-
* query: {
|
|
59
|
-
* hd: "mycompany.com", // Restrict to Google Workspace domain
|
|
60
|
-
* access_type: "offline", // Request refresh token
|
|
61
|
-
* prompt: "consent", // Force consent screen
|
|
62
|
-
* include_granted_scopes: "true" // Incremental authorization
|
|
63
|
-
* }
|
|
64
|
-
* }
|
|
65
|
-
* ```
|
|
66
|
-
*/
|
|
67
|
-
readonly query?: Record<string, string>;
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Creates a Google OAuth 2.0 authentication provider.
|
|
71
|
-
* Use this when you need access tokens to call Google APIs on behalf of the user.
|
|
72
|
-
*
|
|
73
|
-
* @param config - Google OAuth 2.0 configuration
|
|
74
|
-
* @returns OAuth 2.0 provider configured for Google
|
|
75
|
-
*
|
|
76
|
-
* @example
|
|
77
|
-
* ```ts
|
|
78
|
-
* // Basic setup for user authentication
|
|
79
|
-
* const basicGoogle = GoogleProvider({
|
|
80
|
-
* clientID: process.env.GOOGLE_CLIENT_ID,
|
|
81
|
-
* clientSecret: process.env.GOOGLE_CLIENT_SECRET
|
|
82
|
-
* })
|
|
83
|
-
*
|
|
84
|
-
* // Advanced setup with API access
|
|
85
|
-
* const advancedGoogle = GoogleProvider({
|
|
86
|
-
* clientID: process.env.GOOGLE_CLIENT_ID,
|
|
87
|
-
* clientSecret: process.env.GOOGLE_CLIENT_SECRET,
|
|
88
|
-
* scopes: [
|
|
89
|
-
* "profile",
|
|
90
|
-
* "email",
|
|
91
|
-
* "https://www.googleapis.com/auth/calendar.readonly",
|
|
92
|
-
* "https://www.googleapis.com/auth/drive.file"
|
|
93
|
-
* ],
|
|
94
|
-
* query: {
|
|
95
|
-
* access_type: "offline", // Get refresh token
|
|
96
|
-
* prompt: "consent", // Force consent for refresh token
|
|
97
|
-
* hd: "mycompany.com" // Restrict to company domain
|
|
98
|
-
* }
|
|
99
|
-
* })
|
|
100
|
-
*
|
|
101
|
-
* // Use the access token for API calls
|
|
102
|
-
* success: async (ctx, value) => {
|
|
103
|
-
* const accessToken = value.tokenset.access
|
|
104
|
-
* const response = await fetch('https://www.googleapis.com/calendar/v3/calendars/primary/events', {
|
|
105
|
-
* headers: { Authorization: `Bearer ${accessToken}` }
|
|
106
|
-
* })
|
|
107
|
-
* }
|
|
108
|
-
* ```
|
|
109
|
-
*/
|
|
110
|
-
declare const GoogleProvider: (config: GoogleConfig) => Provider<Oauth2UserData>;
|
|
111
|
-
//#endregion
|
|
112
|
-
export { GoogleConfig, GoogleProvider };
|
package/dist/provider/google.mjs
DELETED
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import { Oauth2Provider } from "./oauth2.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/provider/google.ts
|
|
4
|
-
/**
|
|
5
|
-
* Google OAuth 2.0 authentication provider for Draft Auth.
|
|
6
|
-
* Provides access tokens for calling Google APIs on behalf of users.
|
|
7
|
-
*
|
|
8
|
-
* ## Quick Setup
|
|
9
|
-
*
|
|
10
|
-
* ```ts
|
|
11
|
-
* import { GoogleProvider } from "@draftlab/auth/provider/google"
|
|
12
|
-
*
|
|
13
|
-
* export default issuer({
|
|
14
|
-
* basePath: "/auth", // Important for callback URL
|
|
15
|
-
* providers: {
|
|
16
|
-
* google: GoogleProvider({
|
|
17
|
-
* clientID: process.env.GOOGLE_CLIENT_ID,
|
|
18
|
-
* clientSecret: process.env.GOOGLE_CLIENT_SECRET,
|
|
19
|
-
* scopes: ["profile", "email", "https://www.googleapis.com/auth/calendar.readonly"]
|
|
20
|
-
* })
|
|
21
|
-
* }
|
|
22
|
-
* })
|
|
23
|
-
* ```
|
|
24
|
-
*
|
|
25
|
-
* **Callback URL Pattern**: `{baseURL}{basePath}/{provider}/callback`
|
|
26
|
-
* - Development: `http://localhost:3000/auth/google/callback`
|
|
27
|
-
* - Production: `https://yourapp.com/auth/google/callback`
|
|
28
|
-
*
|
|
29
|
-
* Register this URL in your Google Cloud Console OAuth 2.0 credentials.
|
|
30
|
-
*
|
|
31
|
-
* ## Configuration Options
|
|
32
|
-
*
|
|
33
|
-
* - Access tokens for Google API calls
|
|
34
|
-
* - Refresh tokens for long-lived access
|
|
35
|
-
* - Support for offline access
|
|
36
|
-
* - Custom scopes for specific Google services
|
|
37
|
-
*
|
|
38
|
-
* ## User Data Access
|
|
39
|
-
*
|
|
40
|
-
* ```ts
|
|
41
|
-
* success: async (ctx, value) => {
|
|
42
|
-
* if (value.provider === "google") {
|
|
43
|
-
* // Access token for API calls: value.tokenset.access
|
|
44
|
-
* // Refresh token (if requested): value.tokenset.refresh
|
|
45
|
-
* // Use the access token to call Google APIs
|
|
46
|
-
* const response = await fetch('https://www.googleapis.com/oauth2/v2/userinfo', {
|
|
47
|
-
* headers: { Authorization: `Bearer ${value.tokenset.access}` }
|
|
48
|
-
* })
|
|
49
|
-
* }
|
|
50
|
-
* }
|
|
51
|
-
* ```
|
|
52
|
-
*
|
|
53
|
-
* @packageDocumentation
|
|
54
|
-
*/
|
|
55
|
-
/**
|
|
56
|
-
* Creates a Google OAuth 2.0 authentication provider.
|
|
57
|
-
* Use this when you need access tokens to call Google APIs on behalf of the user.
|
|
58
|
-
*
|
|
59
|
-
* @param config - Google OAuth 2.0 configuration
|
|
60
|
-
* @returns OAuth 2.0 provider configured for Google
|
|
61
|
-
*
|
|
62
|
-
* @example
|
|
63
|
-
* ```ts
|
|
64
|
-
* // Basic setup for user authentication
|
|
65
|
-
* const basicGoogle = GoogleProvider({
|
|
66
|
-
* clientID: process.env.GOOGLE_CLIENT_ID,
|
|
67
|
-
* clientSecret: process.env.GOOGLE_CLIENT_SECRET
|
|
68
|
-
* })
|
|
69
|
-
*
|
|
70
|
-
* // Advanced setup with API access
|
|
71
|
-
* const advancedGoogle = GoogleProvider({
|
|
72
|
-
* clientID: process.env.GOOGLE_CLIENT_ID,
|
|
73
|
-
* clientSecret: process.env.GOOGLE_CLIENT_SECRET,
|
|
74
|
-
* scopes: [
|
|
75
|
-
* "profile",
|
|
76
|
-
* "email",
|
|
77
|
-
* "https://www.googleapis.com/auth/calendar.readonly",
|
|
78
|
-
* "https://www.googleapis.com/auth/drive.file"
|
|
79
|
-
* ],
|
|
80
|
-
* query: {
|
|
81
|
-
* access_type: "offline", // Get refresh token
|
|
82
|
-
* prompt: "consent", // Force consent for refresh token
|
|
83
|
-
* hd: "mycompany.com" // Restrict to company domain
|
|
84
|
-
* }
|
|
85
|
-
* })
|
|
86
|
-
*
|
|
87
|
-
* // Use the access token for API calls
|
|
88
|
-
* success: async (ctx, value) => {
|
|
89
|
-
* const accessToken = value.tokenset.access
|
|
90
|
-
* const response = await fetch('https://www.googleapis.com/calendar/v3/calendars/primary/events', {
|
|
91
|
-
* headers: { Authorization: `Bearer ${accessToken}` }
|
|
92
|
-
* })
|
|
93
|
-
* }
|
|
94
|
-
* ```
|
|
95
|
-
*/
|
|
96
|
-
const GoogleProvider = (config) => {
|
|
97
|
-
return Oauth2Provider({
|
|
98
|
-
...config,
|
|
99
|
-
type: "google",
|
|
100
|
-
endpoint: {
|
|
101
|
-
authorization: "https://accounts.google.com/o/oauth2/v2/auth",
|
|
102
|
-
token: "https://oauth2.googleapis.com/token",
|
|
103
|
-
jwks: "https://www.googleapis.com/oauth2/v3/certs"
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
};
|
|
107
|
-
|
|
108
|
-
//#endregion
|
|
109
|
-
export { GoogleProvider };
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import { Provider } from "./provider.mjs";
|
|
2
|
-
import { Oauth2UserData, Oauth2WrappedConfig } from "./oauth2.mjs";
|
|
3
|
-
|
|
4
|
-
//#region src/provider/linkedin.d.ts
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Configuration options for LinkedIn OAuth 2.0 provider.
|
|
8
|
-
* Extends the base OAuth 2.0 configuration with LinkedIn-specific documentation.
|
|
9
|
-
*/
|
|
10
|
-
interface LinkedInConfig extends Oauth2WrappedConfig {
|
|
11
|
-
/**
|
|
12
|
-
* LinkedIn OAuth 2.0 client ID from LinkedIn Developer Console.
|
|
13
|
-
* Found in your LinkedIn app settings.
|
|
14
|
-
*
|
|
15
|
-
* @example
|
|
16
|
-
* ```ts
|
|
17
|
-
* {
|
|
18
|
-
* clientID: "78abc123456789"
|
|
19
|
-
* }
|
|
20
|
-
* ```
|
|
21
|
-
*/
|
|
22
|
-
readonly clientID: string;
|
|
23
|
-
/**
|
|
24
|
-
* LinkedIn OAuth 2.0 client secret from LinkedIn Developer Console.
|
|
25
|
-
* Keep this secure and never expose it to client-side code.
|
|
26
|
-
*
|
|
27
|
-
* @example
|
|
28
|
-
* ```ts
|
|
29
|
-
* {
|
|
30
|
-
* clientSecret: process.env.LINKEDIN_CLIENT_SECRET
|
|
31
|
-
* }
|
|
32
|
-
* ```
|
|
33
|
-
*/
|
|
34
|
-
readonly clientSecret: string;
|
|
35
|
-
/**
|
|
36
|
-
* LinkedIn OAuth scopes to request access for.
|
|
37
|
-
* Determines what data and actions your app can access.
|
|
38
|
-
*
|
|
39
|
-
* @example
|
|
40
|
-
* ```ts
|
|
41
|
-
* {
|
|
42
|
-
* scopes: [
|
|
43
|
-
* "r_liteprofile", // Basic profile information
|
|
44
|
-
* "r_emailaddress", // Email address
|
|
45
|
-
* "w_member_social", // Share content on behalf of user
|
|
46
|
-
* "r_organization_social" // Organization content access
|
|
47
|
-
* ]
|
|
48
|
-
* }
|
|
49
|
-
* ```
|
|
50
|
-
*/
|
|
51
|
-
readonly scopes: string[];
|
|
52
|
-
/**
|
|
53
|
-
* Additional query parameters for LinkedIn OAuth authorization.
|
|
54
|
-
* Useful for LinkedIn-specific options.
|
|
55
|
-
*
|
|
56
|
-
* @example
|
|
57
|
-
* ```ts
|
|
58
|
-
* {
|
|
59
|
-
* query: {
|
|
60
|
-
* state: "custom-state-value" // Custom state parameter
|
|
61
|
-
* }
|
|
62
|
-
* }
|
|
63
|
-
* ```
|
|
64
|
-
*/
|
|
65
|
-
readonly query?: Record<string, string>;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Creates a LinkedIn OAuth 2.0 authentication provider.
|
|
69
|
-
* Use this when you need access tokens to call LinkedIn APIs on behalf of the user.
|
|
70
|
-
*
|
|
71
|
-
* @param config - LinkedIn OAuth 2.0 configuration
|
|
72
|
-
* @returns OAuth 2.0 provider configured for LinkedIn
|
|
73
|
-
*
|
|
74
|
-
* @example
|
|
75
|
-
* ```ts
|
|
76
|
-
* // Basic LinkedIn authentication
|
|
77
|
-
* const basicLinkedIn = LinkedInProvider({
|
|
78
|
-
* clientID: process.env.LINKEDIN_CLIENT_ID,
|
|
79
|
-
* clientSecret: process.env.LINKEDIN_CLIENT_SECRET
|
|
80
|
-
* })
|
|
81
|
-
*
|
|
82
|
-
* // LinkedIn with specific scopes
|
|
83
|
-
* const linkedInWithScopes = LinkedInProvider({
|
|
84
|
-
* clientID: process.env.LINKEDIN_CLIENT_ID,
|
|
85
|
-
* clientSecret: process.env.LINKEDIN_CLIENT_SECRET,
|
|
86
|
-
* scopes: [
|
|
87
|
-
* "r_liteprofile",
|
|
88
|
-
* "r_emailaddress",
|
|
89
|
-
* "w_member_social"
|
|
90
|
-
* ]
|
|
91
|
-
* })
|
|
92
|
-
*
|
|
93
|
-
* // Using the access token to fetch data
|
|
94
|
-
* export default issuer({
|
|
95
|
-
* providers: { linkedin: linkedInWithScopes },
|
|
96
|
-
* success: async (ctx, value) => {
|
|
97
|
-
* if (value.provider === "linkedin") {
|
|
98
|
-
* const token = value.tokenset.access
|
|
99
|
-
*
|
|
100
|
-
* // Get user profile
|
|
101
|
-
* const profileRes = await fetch('https://api.linkedin.com/v2/people/~', {
|
|
102
|
-
* headers: { Authorization: `Bearer ${token}` }
|
|
103
|
-
* })
|
|
104
|
-
* const profile = await profileRes.json()
|
|
105
|
-
*
|
|
106
|
-
* // Get user email
|
|
107
|
-
* const emailRes = await fetch('https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements*(handle~))', {
|
|
108
|
-
* headers: { Authorization: `Bearer ${token}` }
|
|
109
|
-
* })
|
|
110
|
-
* const emailData = await emailRes.json()
|
|
111
|
-
*
|
|
112
|
-
* return ctx.subject("user", {
|
|
113
|
-
* linkedinId: profile.id,
|
|
114
|
-
* firstName: profile.localizedFirstName,
|
|
115
|
-
* lastName: profile.localizedLastName,
|
|
116
|
-
* email: emailData.elements[0]['handle~'].emailAddress,
|
|
117
|
-
* profileUrl: `https://www.linkedin.com/in/${profile.vanityName || profile.id}`
|
|
118
|
-
* })
|
|
119
|
-
* }
|
|
120
|
-
* }
|
|
121
|
-
* })
|
|
122
|
-
* ```
|
|
123
|
-
*
|
|
124
|
-
* **Callback URL Pattern**: `{baseURL}{basePath}/{provider}/callback`
|
|
125
|
-
* - Development: `http://localhost:3000/auth/linkedin/callback`
|
|
126
|
-
* - Production: `https://yourapp.com/auth/linkedin/callback`
|
|
127
|
-
*
|
|
128
|
-
* Register this URL in your LinkedIn Developer Portal.
|
|
129
|
-
*/
|
|
130
|
-
declare const LinkedInProvider: (config: LinkedInConfig) => Provider<Oauth2UserData>;
|
|
131
|
-
//#endregion
|
|
132
|
-
export { LinkedInConfig, LinkedInProvider };
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
import { Oauth2Provider } from "./oauth2.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/provider/linkedin.ts
|
|
4
|
-
/**
|
|
5
|
-
* LinkedIn OAuth 2.0 authentication provider for Draft Auth.
|
|
6
|
-
* Provides access tokens for calling LinkedIn APIs on behalf of users.
|
|
7
|
-
*
|
|
8
|
-
* ## Quick Setup
|
|
9
|
-
*
|
|
10
|
-
* ```ts
|
|
11
|
-
* import { LinkedInProvider } from "@draftlab/auth/provider/linkedin"
|
|
12
|
-
*
|
|
13
|
-
* export default issuer({
|
|
14
|
-
* basePath: "/auth", // Important for callback URL
|
|
15
|
-
* providers: {
|
|
16
|
-
* linkedin: LinkedInProvider({
|
|
17
|
-
* clientID: process.env.LINKEDIN_CLIENT_ID,
|
|
18
|
-
* clientSecret: process.env.LINKEDIN_CLIENT_SECRET,
|
|
19
|
-
* scopes: ["r_liteprofile", "r_emailaddress", "w_member_social"]
|
|
20
|
-
* })
|
|
21
|
-
* }
|
|
22
|
-
* })
|
|
23
|
-
* ```
|
|
24
|
-
*
|
|
25
|
-
* **Callback URL Pattern**: `{baseURL}{basePath}/{provider}/callback`
|
|
26
|
-
* - Development: `http://localhost:3000/auth/linkedin/callback`
|
|
27
|
-
* - Production: `https://yourapp.com/auth/linkedin/callback`
|
|
28
|
-
*
|
|
29
|
-
* Register this URL in your LinkedIn Developer Portal.
|
|
30
|
-
*
|
|
31
|
-
* ## Common Scopes
|
|
32
|
-
*
|
|
33
|
-
* - `r_liteprofile` - Access to basic profile information
|
|
34
|
-
* - `r_emailaddress` - Access to user's email address
|
|
35
|
-
* - `r_basicprofile` - Access to full profile information (deprecated)
|
|
36
|
-
* - `w_member_social` - Share content on behalf of user
|
|
37
|
-
* - `r_organization_social` - Access to organization social content
|
|
38
|
-
* - `rw_organization_admin` - Manage organization pages
|
|
39
|
-
*
|
|
40
|
-
* ## User Data Access
|
|
41
|
-
*
|
|
42
|
-
* ```ts
|
|
43
|
-
* success: async (ctx, value) => {
|
|
44
|
-
* if (value.provider === "linkedin") {
|
|
45
|
-
* const accessToken = value.tokenset.access
|
|
46
|
-
*
|
|
47
|
-
* // Fetch user profile
|
|
48
|
-
* const profileResponse = await fetch('https://api.linkedin.com/v2/people/~', {
|
|
49
|
-
* headers: { Authorization: `Bearer ${accessToken}` }
|
|
50
|
-
* })
|
|
51
|
-
* const profile = await profileResponse.json()
|
|
52
|
-
*
|
|
53
|
-
* // Fetch user email (requires r_emailaddress scope)
|
|
54
|
-
* const emailResponse = await fetch('https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements*(handle~))', {
|
|
55
|
-
* headers: { Authorization: `Bearer ${accessToken}` }
|
|
56
|
-
* })
|
|
57
|
-
* const emailData = await emailResponse.json()
|
|
58
|
-
*
|
|
59
|
-
* // User info: profile.localizedFirstName + profile.localizedLastName
|
|
60
|
-
* // Email: emailData.elements[0]['handle~'].emailAddress
|
|
61
|
-
* }
|
|
62
|
-
* }
|
|
63
|
-
* ```
|
|
64
|
-
*
|
|
65
|
-
* @packageDocumentation
|
|
66
|
-
*/
|
|
67
|
-
/**
|
|
68
|
-
* Creates a LinkedIn OAuth 2.0 authentication provider.
|
|
69
|
-
* Use this when you need access tokens to call LinkedIn APIs on behalf of the user.
|
|
70
|
-
*
|
|
71
|
-
* @param config - LinkedIn OAuth 2.0 configuration
|
|
72
|
-
* @returns OAuth 2.0 provider configured for LinkedIn
|
|
73
|
-
*
|
|
74
|
-
* @example
|
|
75
|
-
* ```ts
|
|
76
|
-
* // Basic LinkedIn authentication
|
|
77
|
-
* const basicLinkedIn = LinkedInProvider({
|
|
78
|
-
* clientID: process.env.LINKEDIN_CLIENT_ID,
|
|
79
|
-
* clientSecret: process.env.LINKEDIN_CLIENT_SECRET
|
|
80
|
-
* })
|
|
81
|
-
*
|
|
82
|
-
* // LinkedIn with specific scopes
|
|
83
|
-
* const linkedInWithScopes = LinkedInProvider({
|
|
84
|
-
* clientID: process.env.LINKEDIN_CLIENT_ID,
|
|
85
|
-
* clientSecret: process.env.LINKEDIN_CLIENT_SECRET,
|
|
86
|
-
* scopes: [
|
|
87
|
-
* "r_liteprofile",
|
|
88
|
-
* "r_emailaddress",
|
|
89
|
-
* "w_member_social"
|
|
90
|
-
* ]
|
|
91
|
-
* })
|
|
92
|
-
*
|
|
93
|
-
* // Using the access token to fetch data
|
|
94
|
-
* export default issuer({
|
|
95
|
-
* providers: { linkedin: linkedInWithScopes },
|
|
96
|
-
* success: async (ctx, value) => {
|
|
97
|
-
* if (value.provider === "linkedin") {
|
|
98
|
-
* const token = value.tokenset.access
|
|
99
|
-
*
|
|
100
|
-
* // Get user profile
|
|
101
|
-
* const profileRes = await fetch('https://api.linkedin.com/v2/people/~', {
|
|
102
|
-
* headers: { Authorization: `Bearer ${token}` }
|
|
103
|
-
* })
|
|
104
|
-
* const profile = await profileRes.json()
|
|
105
|
-
*
|
|
106
|
-
* // Get user email
|
|
107
|
-
* const emailRes = await fetch('https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements*(handle~))', {
|
|
108
|
-
* headers: { Authorization: `Bearer ${token}` }
|
|
109
|
-
* })
|
|
110
|
-
* const emailData = await emailRes.json()
|
|
111
|
-
*
|
|
112
|
-
* return ctx.subject("user", {
|
|
113
|
-
* linkedinId: profile.id,
|
|
114
|
-
* firstName: profile.localizedFirstName,
|
|
115
|
-
* lastName: profile.localizedLastName,
|
|
116
|
-
* email: emailData.elements[0]['handle~'].emailAddress,
|
|
117
|
-
* profileUrl: `https://www.linkedin.com/in/${profile.vanityName || profile.id}`
|
|
118
|
-
* })
|
|
119
|
-
* }
|
|
120
|
-
* }
|
|
121
|
-
* })
|
|
122
|
-
* ```
|
|
123
|
-
*
|
|
124
|
-
* **Callback URL Pattern**: `{baseURL}{basePath}/{provider}/callback`
|
|
125
|
-
* - Development: `http://localhost:3000/auth/linkedin/callback`
|
|
126
|
-
* - Production: `https://yourapp.com/auth/linkedin/callback`
|
|
127
|
-
*
|
|
128
|
-
* Register this URL in your LinkedIn Developer Portal.
|
|
129
|
-
*/
|
|
130
|
-
const LinkedInProvider = (config) => {
|
|
131
|
-
return Oauth2Provider({
|
|
132
|
-
...config,
|
|
133
|
-
type: "linkedin",
|
|
134
|
-
endpoint: {
|
|
135
|
-
authorization: "https://www.linkedin.com/oauth/v2/authorization",
|
|
136
|
-
token: "https://www.linkedin.com/oauth/v2/accessToken"
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
};
|
|
140
|
-
|
|
141
|
-
//#endregion
|
|
142
|
-
export { LinkedInProvider };
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import { Provider } from "./provider.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/provider/magiclink.d.ts
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Configuration options for the Magic Link authentication provider.
|
|
7
|
-
*
|
|
8
|
-
* @template Claims - Type of claims collected during authentication (email, phone, etc.)
|
|
9
|
-
*/
|
|
10
|
-
interface MagicLinkConfig<Claims extends Record<string, string> = Record<string, string>> {
|
|
11
|
-
/**
|
|
12
|
-
* Token expiration time in seconds.
|
|
13
|
-
* After this time, the magic link becomes invalid.
|
|
14
|
-
*
|
|
15
|
-
* @default 900 (15 minutes)
|
|
16
|
-
*/
|
|
17
|
-
readonly expiry?: number;
|
|
18
|
-
/**
|
|
19
|
-
* Request handler for rendering the magic link UI.
|
|
20
|
-
* Handles both the initial claim collection and "check your email" screens.
|
|
21
|
-
*
|
|
22
|
-
* @param req - The HTTP request object
|
|
23
|
-
* @param state - Current authentication state
|
|
24
|
-
* @param form - Form data from POST requests (if any)
|
|
25
|
-
* @param error - Authentication error to display (if any)
|
|
26
|
-
* @returns Promise resolving to the authentication page response
|
|
27
|
-
*/
|
|
28
|
-
request: (req: Request, state: MagicLinkState, form?: FormData, error?: MagicLinkError) => Promise<Response>;
|
|
29
|
-
/**
|
|
30
|
-
* Callback for sending magic links to users.
|
|
31
|
-
* Should handle delivery via email, SMS, or other communication channels.
|
|
32
|
-
*
|
|
33
|
-
* @param claims - User claims containing contact information
|
|
34
|
-
* @param magicUrl - The magic link URL to send
|
|
35
|
-
* @returns Promise resolving to undefined on success, or error object on failure
|
|
36
|
-
*/
|
|
37
|
-
sendLink: (claims: Claims, magicUrl: string) => Promise<MagicLinkError | undefined>;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Authentication flow states for the magic link provider.
|
|
41
|
-
* The provider transitions between these states during authentication.
|
|
42
|
-
*/
|
|
43
|
-
type MagicLinkState = {
|
|
44
|
-
/** Initial state: user enters their claims (email, phone, etc.) */
|
|
45
|
-
readonly type: "start";
|
|
46
|
-
} | {
|
|
47
|
-
/** Link sent state: user checks their email/phone */
|
|
48
|
-
readonly type: "sent";
|
|
49
|
-
/** Whether this is a resend request */
|
|
50
|
-
readonly resend?: boolean;
|
|
51
|
-
/** The secure token for verification */
|
|
52
|
-
readonly token: string;
|
|
53
|
-
/** User claims collected during the start phase */
|
|
54
|
-
readonly claims: Record<string, string>;
|
|
55
|
-
};
|
|
56
|
-
/**
|
|
57
|
-
* Possible errors during magic link authentication.
|
|
58
|
-
*/
|
|
59
|
-
type MagicLinkError = {
|
|
60
|
-
/** The magic link is invalid or expired */
|
|
61
|
-
readonly type: "invalid_link";
|
|
62
|
-
} | {
|
|
63
|
-
/** A user claim is invalid or missing */
|
|
64
|
-
readonly type: "invalid_claim";
|
|
65
|
-
/** The claim field that failed validation */
|
|
66
|
-
readonly key: string;
|
|
67
|
-
/** The invalid value or error description */
|
|
68
|
-
readonly value: string;
|
|
69
|
-
};
|
|
70
|
-
/**
|
|
71
|
-
* User data returned by successful magic link authentication.
|
|
72
|
-
*
|
|
73
|
-
* @template Claims - Type of claims collected during authentication
|
|
74
|
-
*/
|
|
75
|
-
interface MagicLinkUserData<Claims extends Record<string, string> = Record<string, string>> {
|
|
76
|
-
/** The verified claims collected during authentication */
|
|
77
|
-
readonly claims: Claims;
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Creates a Magic Link authentication provider.
|
|
81
|
-
* Implements a flexible claim-based authentication flow with magic link verification.
|
|
82
|
-
*
|
|
83
|
-
* @template Claims - Type of claims to collect (email, phone, username, etc.)
|
|
84
|
-
* @param config - Magic Link provider configuration
|
|
85
|
-
* @returns Provider instance implementing magic link authentication
|
|
86
|
-
*/
|
|
87
|
-
declare const MagicLinkProvider: <Claims extends Record<string, string> = Record<string, string>>(config: MagicLinkConfig<Claims>) => Provider<MagicLinkUserData<Claims>>;
|
|
88
|
-
//#endregion
|
|
89
|
-
export { MagicLinkConfig, MagicLinkError, MagicLinkProvider, MagicLinkState, MagicLinkUserData };
|