@alliance-droid/svelte-auth-core 1.0.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/adapter-context.d.ts +19 -0
- package/dist/adapter-context.d.ts.map +1 -0
- package/dist/adapter-context.js +68 -0
- package/dist/adapter-context.js.map +1 -0
- package/dist/adapters/__tests__/adapter-tests.d.ts +7 -0
- package/dist/adapters/__tests__/adapter-tests.d.ts.map +1 -0
- package/dist/adapters/__tests__/adapter-tests.js +206 -0
- package/dist/adapters/__tests__/adapter-tests.js.map +1 -0
- package/dist/adapters/adapter.d.ts +60 -0
- package/dist/adapters/adapter.d.ts.map +1 -0
- package/dist/adapters/adapter.js +2 -0
- package/dist/adapters/adapter.js.map +1 -0
- package/dist/adapters/filesystem-adapter.d.ts +26 -0
- package/dist/adapters/filesystem-adapter.d.ts.map +1 -0
- package/dist/adapters/filesystem-adapter.js +148 -0
- package/dist/adapters/filesystem-adapter.js.map +1 -0
- package/dist/adapters/index.d.ts +6 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +5 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/mongodb-adapter.d.ts +27 -0
- package/dist/adapters/mongodb-adapter.d.ts.map +1 -0
- package/dist/adapters/mongodb-adapter.js +213 -0
- package/dist/adapters/mongodb-adapter.js.map +1 -0
- package/dist/adapters/postgres-adapter.d.ts +30 -0
- package/dist/adapters/postgres-adapter.d.ts.map +1 -0
- package/dist/adapters/postgres-adapter.js +237 -0
- package/dist/adapters/postgres-adapter.js.map +1 -0
- package/dist/adapters/sqlite-adapter.d.ts +26 -0
- package/dist/adapters/sqlite-adapter.d.ts.map +1 -0
- package/dist/adapters/sqlite-adapter.js +261 -0
- package/dist/adapters/sqlite-adapter.js.map +1 -0
- package/dist/auth.d.ts +48 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +205 -0
- package/dist/auth.js.map +1 -0
- package/dist/client-jwt.d.ts +30 -0
- package/dist/client-jwt.d.ts.map +1 -0
- package/dist/client-jwt.js +57 -0
- package/dist/client-jwt.js.map +1 -0
- package/dist/client-store.d.ts +31 -0
- package/dist/client-store.d.ts.map +1 -0
- package/dist/client-store.js +122 -0
- package/dist/client-store.js.map +1 -0
- package/dist/cors.d.ts +48 -0
- package/dist/cors.d.ts.map +1 -0
- package/dist/cors.js +88 -0
- package/dist/cors.js.map +1 -0
- package/dist/csrf.d.ts +57 -0
- package/dist/csrf.d.ts.map +1 -0
- package/dist/csrf.js +95 -0
- package/dist/csrf.js.map +1 -0
- package/dist/db.d.ts +22 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +43 -0
- package/dist/db.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/input-validation.d.ts +78 -0
- package/dist/input-validation.d.ts.map +1 -0
- package/dist/input-validation.js +238 -0
- package/dist/input-validation.js.map +1 -0
- package/dist/oauth-callback.d.ts +31 -0
- package/dist/oauth-callback.d.ts.map +1 -0
- package/dist/oauth-callback.js +254 -0
- package/dist/oauth-callback.js.map +1 -0
- package/dist/oauth-providers.d.ts +92 -0
- package/dist/oauth-providers.d.ts.map +1 -0
- package/dist/oauth-providers.js +213 -0
- package/dist/oauth-providers.js.map +1 -0
- package/dist/oauth-types.d.ts +77 -0
- package/dist/oauth-types.d.ts.map +1 -0
- package/dist/oauth-types.js +2 -0
- package/dist/oauth-types.js.map +1 -0
- package/dist/password.d.ts +31 -0
- package/dist/password.d.ts.map +1 -0
- package/dist/password.js +54 -0
- package/dist/password.js.map +1 -0
- package/dist/providers/github-oauth.d.ts +58 -0
- package/dist/providers/github-oauth.d.ts.map +1 -0
- package/dist/providers/github-oauth.js +230 -0
- package/dist/providers/github-oauth.js.map +1 -0
- package/dist/providers/google-oauth.d.ts +46 -0
- package/dist/providers/google-oauth.d.ts.map +1 -0
- package/dist/providers/google-oauth.js +177 -0
- package/dist/providers/google-oauth.js.map +1 -0
- package/dist/providers/oidc-oauth.d.ts +85 -0
- package/dist/providers/oidc-oauth.d.ts.map +1 -0
- package/dist/providers/oidc-oauth.js +301 -0
- package/dist/providers/oidc-oauth.js.map +1 -0
- package/dist/rate-limit.d.ts +36 -0
- package/dist/rate-limit.d.ts.map +1 -0
- package/dist/rate-limit.js +88 -0
- package/dist/rate-limit.js.map +1 -0
- package/dist/rate-limiting.d.ts +113 -0
- package/dist/rate-limiting.d.ts.map +1 -0
- package/dist/rate-limiting.js +221 -0
- package/dist/rate-limiting.js.map +1 -0
- package/dist/security-headers.d.ts +54 -0
- package/dist/security-headers.d.ts.map +1 -0
- package/dist/security-headers.js +123 -0
- package/dist/security-headers.js.map +1 -0
- package/dist/session.d.ts +13 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +33 -0
- package/dist/session.js.map +1 -0
- package/dist/sql-injection-prevention.d.ts +94 -0
- package/dist/sql-injection-prevention.d.ts.map +1 -0
- package/dist/sql-injection-prevention.js +222 -0
- package/dist/sql-injection-prevention.js.map +1 -0
- package/dist/token.d.ts +22 -0
- package/dist/token.d.ts.map +1 -0
- package/dist/token.js +31 -0
- package/dist/token.js.map +1 -0
- package/dist/types.d.ts +81 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/user.d.ts +33 -0
- package/dist/user.d.ts.map +1 -0
- package/dist/user.js +144 -0
- package/dist/user.js.map +1 -0
- package/package.json +48 -0
- package/src/adapter-context.ts +72 -0
- package/src/adapters/__tests__/adapter-tests.ts +254 -0
- package/src/adapters/__tests__/filesystem-adapter.test.ts +48 -0
- package/src/adapters/__tests__/mongodb-adapter.test.ts +64 -0
- package/src/adapters/__tests__/postgres-adapter.test.ts +62 -0
- package/src/adapters/__tests__/sqlite-adapter.test.ts +103 -0
- package/src/adapters/__tests__/test-fs-adapter.json +4 -0
- package/src/adapters/adapter.ts +72 -0
- package/src/adapters/filesystem-adapter.ts +153 -0
- package/src/adapters/index.ts +5 -0
- package/src/adapters/mongodb-adapter.ts +208 -0
- package/src/adapters/postgres-adapter.ts +261 -0
- package/src/adapters/sqlite-adapter.ts +284 -0
- package/src/auth.ts +239 -0
- package/src/client-jwt.test.ts +137 -0
- package/src/client-jwt.ts +67 -0
- package/src/client-store.test.ts +149 -0
- package/src/client-store.ts +144 -0
- package/src/cors.test.ts +175 -0
- package/src/cors.ts +115 -0
- package/src/csrf.test.ts +226 -0
- package/src/csrf.ts +126 -0
- package/src/db.ts +57 -0
- package/src/index.ts +143 -0
- package/src/input-validation.test.ts +347 -0
- package/src/input-validation.ts +307 -0
- package/src/integration.test.ts +322 -0
- package/src/oauth-callback.test.ts +282 -0
- package/src/oauth-callback.ts +323 -0
- package/src/oauth-providers.ts +232 -0
- package/src/oauth-types.ts +82 -0
- package/src/password.test.ts +89 -0
- package/src/password.ts +62 -0
- package/src/providers/github-oauth.test.ts +290 -0
- package/src/providers/github-oauth.ts +226 -0
- package/src/providers/google-oauth.test.ts +240 -0
- package/src/providers/google-oauth.ts +166 -0
- package/src/providers/oidc-oauth.test.ts +367 -0
- package/src/providers/oidc-oauth.ts +302 -0
- package/src/rate-limit.test.ts +308 -0
- package/src/rate-limit.ts +118 -0
- package/src/rate-limiting.test.ts +390 -0
- package/src/rate-limiting.ts +275 -0
- package/src/security-headers.test.ts +242 -0
- package/src/security-headers.ts +160 -0
- package/src/security-penetration.test.ts +705 -0
- package/src/session.ts +42 -0
- package/src/sql-injection-prevention.test.ts +337 -0
- package/src/sql-injection-prevention.ts +272 -0
- package/src/token.test.ts +67 -0
- package/src/token.ts +34 -0
- package/src/types.ts +87 -0
- package/src/user.ts +165 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub OAuth Provider
|
|
3
|
+
* Handles GitHub OAuth 2.0 flow
|
|
4
|
+
*/
|
|
5
|
+
export class GitHubOAuthProvider {
|
|
6
|
+
constructor(config) {
|
|
7
|
+
Object.defineProperty(this, "clientId", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
configurable: true,
|
|
10
|
+
writable: true,
|
|
11
|
+
value: void 0
|
|
12
|
+
});
|
|
13
|
+
Object.defineProperty(this, "clientSecret", {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
configurable: true,
|
|
16
|
+
writable: true,
|
|
17
|
+
value: void 0
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(this, "redirectUri", {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
configurable: true,
|
|
22
|
+
writable: true,
|
|
23
|
+
value: void 0
|
|
24
|
+
});
|
|
25
|
+
Object.defineProperty(this, "scope", {
|
|
26
|
+
enumerable: true,
|
|
27
|
+
configurable: true,
|
|
28
|
+
writable: true,
|
|
29
|
+
value: void 0
|
|
30
|
+
});
|
|
31
|
+
Object.defineProperty(this, "allowSignup", {
|
|
32
|
+
enumerable: true,
|
|
33
|
+
configurable: true,
|
|
34
|
+
writable: true,
|
|
35
|
+
value: void 0
|
|
36
|
+
});
|
|
37
|
+
Object.defineProperty(this, "authorizationEndpoint", {
|
|
38
|
+
enumerable: true,
|
|
39
|
+
configurable: true,
|
|
40
|
+
writable: true,
|
|
41
|
+
value: 'https://github.com/login/oauth/authorize'
|
|
42
|
+
});
|
|
43
|
+
Object.defineProperty(this, "tokenEndpoint", {
|
|
44
|
+
enumerable: true,
|
|
45
|
+
configurable: true,
|
|
46
|
+
writable: true,
|
|
47
|
+
value: 'https://github.com/login/oauth/access_token'
|
|
48
|
+
});
|
|
49
|
+
Object.defineProperty(this, "userinfoEndpoint", {
|
|
50
|
+
enumerable: true,
|
|
51
|
+
configurable: true,
|
|
52
|
+
writable: true,
|
|
53
|
+
value: 'https://api.github.com/user'
|
|
54
|
+
});
|
|
55
|
+
if (!config.clientId || !config.clientSecret || !config.redirectUri) {
|
|
56
|
+
throw new Error('GitHub OAuth configuration is missing required fields');
|
|
57
|
+
}
|
|
58
|
+
this.clientId = config.clientId;
|
|
59
|
+
this.clientSecret = config.clientSecret;
|
|
60
|
+
this.redirectUri = config.redirectUri;
|
|
61
|
+
this.scope = config.scope || ['read:user', 'user:email'];
|
|
62
|
+
this.allowSignup = config.allowSignup !== false;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Generate authorization URL
|
|
66
|
+
*/
|
|
67
|
+
generateAuthorizationUrl(state) {
|
|
68
|
+
const params = new URLSearchParams({
|
|
69
|
+
client_id: this.clientId,
|
|
70
|
+
redirect_uri: this.redirectUri,
|
|
71
|
+
scope: this.scope.join(' '),
|
|
72
|
+
state,
|
|
73
|
+
allow_signup: this.allowSignup.toString()
|
|
74
|
+
});
|
|
75
|
+
return `${this.authorizationEndpoint}?${params.toString()}`;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Exchange authorization code for tokens
|
|
79
|
+
*/
|
|
80
|
+
async exchangeCode(code) {
|
|
81
|
+
try {
|
|
82
|
+
const response = await fetch(this.tokenEndpoint, {
|
|
83
|
+
method: 'POST',
|
|
84
|
+
headers: {
|
|
85
|
+
'Content-Type': 'application/json',
|
|
86
|
+
Accept: 'application/json'
|
|
87
|
+
},
|
|
88
|
+
body: JSON.stringify({
|
|
89
|
+
code,
|
|
90
|
+
client_id: this.clientId,
|
|
91
|
+
client_secret: this.clientSecret,
|
|
92
|
+
redirect_uri: this.redirectUri
|
|
93
|
+
})
|
|
94
|
+
});
|
|
95
|
+
if (!response.ok) {
|
|
96
|
+
throw new Error(`GitHub token exchange failed: ${response.statusText}`);
|
|
97
|
+
}
|
|
98
|
+
const data = await response.json();
|
|
99
|
+
if (data.error) {
|
|
100
|
+
throw new Error(`GitHub OAuth error: ${data.error}`);
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
accessToken: data.access_token,
|
|
104
|
+
expiresIn: data.expires_in || 28800, // 8 hours default
|
|
105
|
+
tokenType: data.token_type || 'Bearer'
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
throw new Error(`Failed to exchange GitHub authorization code: ${error}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Fetch user profile from GitHub
|
|
114
|
+
* Also fetches email if not in primary profile
|
|
115
|
+
*/
|
|
116
|
+
async fetchUserProfile(accessToken) {
|
|
117
|
+
try {
|
|
118
|
+
// Fetch user profile
|
|
119
|
+
const profileResponse = await fetch(this.userinfoEndpoint, {
|
|
120
|
+
headers: {
|
|
121
|
+
Authorization: `Bearer ${accessToken}`,
|
|
122
|
+
'User-Agent': 'svelte-auth-system'
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
if (!profileResponse.ok) {
|
|
126
|
+
throw new Error(`Failed to fetch GitHub user info: ${profileResponse.statusText}`);
|
|
127
|
+
}
|
|
128
|
+
const profileData = await profileResponse.json();
|
|
129
|
+
// If email is not public, fetch from emails endpoint
|
|
130
|
+
let email = profileData.email;
|
|
131
|
+
if (!email) {
|
|
132
|
+
email = await this.fetchUserEmail(accessToken);
|
|
133
|
+
}
|
|
134
|
+
if (!email) {
|
|
135
|
+
throw new Error('Could not retrieve email from GitHub');
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
id: profileData.id.toString(),
|
|
139
|
+
email,
|
|
140
|
+
name: profileData.name,
|
|
141
|
+
avatar: profileData.avatar_url,
|
|
142
|
+
provider: 'github'
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
throw new Error(`Failed to fetch GitHub user profile: ${error}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Fetch user email from GitHub emails endpoint
|
|
151
|
+
*/
|
|
152
|
+
async fetchUserEmail(accessToken) {
|
|
153
|
+
try {
|
|
154
|
+
const response = await fetch('https://api.github.com/user/emails', {
|
|
155
|
+
headers: {
|
|
156
|
+
Authorization: `Bearer ${accessToken}`,
|
|
157
|
+
'User-Agent': 'svelte-auth-system'
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
if (!response.ok) {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
const emails = await response.json();
|
|
164
|
+
// Find primary email
|
|
165
|
+
const primaryEmail = emails.find((e) => e.primary);
|
|
166
|
+
if (primaryEmail) {
|
|
167
|
+
return primaryEmail.email;
|
|
168
|
+
}
|
|
169
|
+
// Find verified email
|
|
170
|
+
const verifiedEmail = emails.find((e) => e.verified);
|
|
171
|
+
if (verifiedEmail) {
|
|
172
|
+
return verifiedEmail.email;
|
|
173
|
+
}
|
|
174
|
+
// Return first email if available
|
|
175
|
+
return emails[0]?.email || null;
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
console.error('Failed to fetch GitHub user email:', error);
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* GitHub does not support refresh tokens (token doesn't expire)
|
|
184
|
+
* This method is a no-op but included for API consistency
|
|
185
|
+
*/
|
|
186
|
+
async refreshAccessToken(accessToken) {
|
|
187
|
+
// GitHub tokens don't expire, so we just return the same token
|
|
188
|
+
return {
|
|
189
|
+
accessToken,
|
|
190
|
+
expiresIn: 0,
|
|
191
|
+
tokenType: 'Bearer'
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Validate authorization code format
|
|
196
|
+
*/
|
|
197
|
+
validateAuthorizationCode(code) {
|
|
198
|
+
return !!(code && typeof code === 'string' && code.length > 0);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Validate access token format
|
|
202
|
+
*/
|
|
203
|
+
validateAccessToken(token) {
|
|
204
|
+
return !!(token && typeof token === 'string' && token.length > 0);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Revoke access token
|
|
208
|
+
*/
|
|
209
|
+
async revokeAccessToken(accessToken) {
|
|
210
|
+
try {
|
|
211
|
+
// GitHub requires basic auth with clientId:clientSecret
|
|
212
|
+
const auth = Buffer.from(`${this.clientId}:${this.clientSecret}`).toString('base64');
|
|
213
|
+
const response = await fetch(`https://api.github.com/applications/${this.clientId}/token`, {
|
|
214
|
+
method: 'DELETE',
|
|
215
|
+
headers: {
|
|
216
|
+
Authorization: `Basic ${auth}`,
|
|
217
|
+
'User-Agent': 'svelte-auth-system',
|
|
218
|
+
'Content-Type': 'application/json'
|
|
219
|
+
},
|
|
220
|
+
body: JSON.stringify({ access_token: accessToken })
|
|
221
|
+
});
|
|
222
|
+
return response.ok;
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
console.error('Failed to revoke GitHub access token:', error);
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=github-oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-oauth.js","sourceRoot":"","sources":["../../src/providers/github-oauth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { OAuthProviderConfig, OAuthUserProfile, OAuthTokenResponse } from '../oauth-types';
|
|
2
|
+
/**
|
|
3
|
+
* Google OAuth Configuration
|
|
4
|
+
*/
|
|
5
|
+
export interface GoogleOAuthConfig extends OAuthProviderConfig {
|
|
6
|
+
scope?: string[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Google OAuth Provider
|
|
10
|
+
* Handles Google OAuth 2.0 flow
|
|
11
|
+
*/
|
|
12
|
+
export declare class GoogleOAuthProvider {
|
|
13
|
+
private clientId;
|
|
14
|
+
private clientSecret;
|
|
15
|
+
private redirectUri;
|
|
16
|
+
private scope;
|
|
17
|
+
private readonly authorizationEndpoint;
|
|
18
|
+
private readonly tokenEndpoint;
|
|
19
|
+
private readonly userinfoEndpoint;
|
|
20
|
+
constructor(config: GoogleOAuthConfig);
|
|
21
|
+
/**
|
|
22
|
+
* Generate authorization URL
|
|
23
|
+
*/
|
|
24
|
+
generateAuthorizationUrl(state: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Exchange authorization code for tokens
|
|
27
|
+
*/
|
|
28
|
+
exchangeCode(code: string): Promise<OAuthTokenResponse>;
|
|
29
|
+
/**
|
|
30
|
+
* Fetch user profile from Google
|
|
31
|
+
*/
|
|
32
|
+
fetchUserProfile(accessToken: string): Promise<OAuthUserProfile>;
|
|
33
|
+
/**
|
|
34
|
+
* Refresh access token
|
|
35
|
+
*/
|
|
36
|
+
refreshAccessToken(refreshToken: string): Promise<OAuthTokenResponse>;
|
|
37
|
+
/**
|
|
38
|
+
* Validate authorization code format
|
|
39
|
+
*/
|
|
40
|
+
validateAuthorizationCode(code: string): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Validate access token format
|
|
43
|
+
*/
|
|
44
|
+
validateAccessToken(token: string): boolean;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=google-oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google-oauth.d.ts","sourceRoot":"","sources":["../../src/providers/google-oauth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEhG;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,mBAAmB;IAC7D,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;GAGG;AACH,qBAAa,mBAAmB;IAC/B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAW;IAExB,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAkD;IACxF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgD;IAC9E,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmD;gBAExE,MAAM,EAAE,iBAAiB;IAWrC;;OAEG;IACH,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAc/C;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAiC7D;;OAEG;IACG,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2BtE;;OAEG;IACG,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAgC3E;;OAEG;IACH,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIhD;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAG3C"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google OAuth Provider
|
|
3
|
+
* Handles Google OAuth 2.0 flow
|
|
4
|
+
*/
|
|
5
|
+
export class GoogleOAuthProvider {
|
|
6
|
+
constructor(config) {
|
|
7
|
+
Object.defineProperty(this, "clientId", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
configurable: true,
|
|
10
|
+
writable: true,
|
|
11
|
+
value: void 0
|
|
12
|
+
});
|
|
13
|
+
Object.defineProperty(this, "clientSecret", {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
configurable: true,
|
|
16
|
+
writable: true,
|
|
17
|
+
value: void 0
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(this, "redirectUri", {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
configurable: true,
|
|
22
|
+
writable: true,
|
|
23
|
+
value: void 0
|
|
24
|
+
});
|
|
25
|
+
Object.defineProperty(this, "scope", {
|
|
26
|
+
enumerable: true,
|
|
27
|
+
configurable: true,
|
|
28
|
+
writable: true,
|
|
29
|
+
value: void 0
|
|
30
|
+
});
|
|
31
|
+
Object.defineProperty(this, "authorizationEndpoint", {
|
|
32
|
+
enumerable: true,
|
|
33
|
+
configurable: true,
|
|
34
|
+
writable: true,
|
|
35
|
+
value: 'https://accounts.google.com/o/oauth2/v2/auth'
|
|
36
|
+
});
|
|
37
|
+
Object.defineProperty(this, "tokenEndpoint", {
|
|
38
|
+
enumerable: true,
|
|
39
|
+
configurable: true,
|
|
40
|
+
writable: true,
|
|
41
|
+
value: 'https://www.googleapis.com/oauth2/v4/token'
|
|
42
|
+
});
|
|
43
|
+
Object.defineProperty(this, "userinfoEndpoint", {
|
|
44
|
+
enumerable: true,
|
|
45
|
+
configurable: true,
|
|
46
|
+
writable: true,
|
|
47
|
+
value: 'https://www.googleapis.com/oauth2/v2/userinfo'
|
|
48
|
+
});
|
|
49
|
+
if (!config.clientId || !config.clientSecret || !config.redirectUri) {
|
|
50
|
+
throw new Error('Google OAuth configuration is missing required fields');
|
|
51
|
+
}
|
|
52
|
+
this.clientId = config.clientId;
|
|
53
|
+
this.clientSecret = config.clientSecret;
|
|
54
|
+
this.redirectUri = config.redirectUri;
|
|
55
|
+
this.scope = config.scope || ['openid', 'email', 'profile'];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Generate authorization URL
|
|
59
|
+
*/
|
|
60
|
+
generateAuthorizationUrl(state) {
|
|
61
|
+
const params = new URLSearchParams({
|
|
62
|
+
client_id: this.clientId,
|
|
63
|
+
redirect_uri: this.redirectUri,
|
|
64
|
+
response_type: 'code',
|
|
65
|
+
scope: this.scope.join(' '),
|
|
66
|
+
state,
|
|
67
|
+
access_type: 'offline',
|
|
68
|
+
prompt: 'consent'
|
|
69
|
+
});
|
|
70
|
+
return `${this.authorizationEndpoint}?${params.toString()}`;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Exchange authorization code for tokens
|
|
74
|
+
*/
|
|
75
|
+
async exchangeCode(code) {
|
|
76
|
+
try {
|
|
77
|
+
const response = await fetch(this.tokenEndpoint, {
|
|
78
|
+
method: 'POST',
|
|
79
|
+
headers: {
|
|
80
|
+
'Content-Type': 'application/x-www-form-urlencoded'
|
|
81
|
+
},
|
|
82
|
+
body: new URLSearchParams({
|
|
83
|
+
code,
|
|
84
|
+
client_id: this.clientId,
|
|
85
|
+
client_secret: this.clientSecret,
|
|
86
|
+
redirect_uri: this.redirectUri,
|
|
87
|
+
grant_type: 'authorization_code'
|
|
88
|
+
}).toString()
|
|
89
|
+
});
|
|
90
|
+
if (!response.ok) {
|
|
91
|
+
throw new Error(`Google token exchange failed: ${response.statusText}`);
|
|
92
|
+
}
|
|
93
|
+
const data = await response.json();
|
|
94
|
+
return {
|
|
95
|
+
accessToken: data.access_token,
|
|
96
|
+
refreshToken: data.refresh_token,
|
|
97
|
+
expiresIn: data.expires_in || 3600,
|
|
98
|
+
tokenType: data.token_type || 'Bearer'
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
throw new Error(`Failed to exchange Google authorization code: ${error}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Fetch user profile from Google
|
|
107
|
+
*/
|
|
108
|
+
async fetchUserProfile(accessToken) {
|
|
109
|
+
try {
|
|
110
|
+
const response = await fetch(this.userinfoEndpoint, {
|
|
111
|
+
headers: {
|
|
112
|
+
Authorization: `Bearer ${accessToken}`,
|
|
113
|
+
'User-Agent': 'svelte-auth-system'
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
if (!response.ok) {
|
|
117
|
+
throw new Error(`Failed to fetch Google user info: ${response.statusText}`);
|
|
118
|
+
}
|
|
119
|
+
const data = await response.json();
|
|
120
|
+
return {
|
|
121
|
+
id: data.id,
|
|
122
|
+
email: data.email,
|
|
123
|
+
name: data.name,
|
|
124
|
+
avatar: data.picture,
|
|
125
|
+
provider: 'google'
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
throw new Error(`Failed to fetch Google user profile: ${error}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Refresh access token
|
|
134
|
+
*/
|
|
135
|
+
async refreshAccessToken(refreshToken) {
|
|
136
|
+
try {
|
|
137
|
+
const response = await fetch(this.tokenEndpoint, {
|
|
138
|
+
method: 'POST',
|
|
139
|
+
headers: {
|
|
140
|
+
'Content-Type': 'application/x-www-form-urlencoded'
|
|
141
|
+
},
|
|
142
|
+
body: new URLSearchParams({
|
|
143
|
+
refresh_token: refreshToken,
|
|
144
|
+
client_id: this.clientId,
|
|
145
|
+
client_secret: this.clientSecret,
|
|
146
|
+
grant_type: 'refresh_token'
|
|
147
|
+
}).toString()
|
|
148
|
+
});
|
|
149
|
+
if (!response.ok) {
|
|
150
|
+
throw new Error(`Google token refresh failed: ${response.statusText}`);
|
|
151
|
+
}
|
|
152
|
+
const data = await response.json();
|
|
153
|
+
return {
|
|
154
|
+
accessToken: data.access_token,
|
|
155
|
+
refreshToken: data.refresh_token || refreshToken,
|
|
156
|
+
expiresIn: data.expires_in || 3600,
|
|
157
|
+
tokenType: data.token_type || 'Bearer'
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
throw new Error(`Failed to refresh Google access token: ${error}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Validate authorization code format
|
|
166
|
+
*/
|
|
167
|
+
validateAuthorizationCode(code) {
|
|
168
|
+
return !!(code && typeof code === 'string' && code.length > 0);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Validate access token format
|
|
172
|
+
*/
|
|
173
|
+
validateAccessToken(token) {
|
|
174
|
+
return !!(token && typeof token === 'string' && token.length > 0);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=google-oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google-oauth.js","sourceRoot":"","sources":["../../src/providers/google-oauth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { OAuthProviderConfig, OAuthUserProfile, OAuthTokenResponse } from '../oauth-types';
|
|
2
|
+
/**
|
|
3
|
+
* OIDC Provider Configuration
|
|
4
|
+
*/
|
|
5
|
+
export interface OIDCProviderConfig extends OAuthProviderConfig {
|
|
6
|
+
discoveryUrl?: string;
|
|
7
|
+
authorizationEndpoint: string;
|
|
8
|
+
tokenEndpoint: string;
|
|
9
|
+
userInfoEndpoint: string;
|
|
10
|
+
scope?: string[];
|
|
11
|
+
responseType?: string;
|
|
12
|
+
responseMode?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* OIDC (OpenID Connect) Provider
|
|
16
|
+
* Handles generic OIDC 1.0 flow
|
|
17
|
+
*/
|
|
18
|
+
export declare class OIDCOAuthProvider {
|
|
19
|
+
private clientId;
|
|
20
|
+
private clientSecret;
|
|
21
|
+
private redirectUri;
|
|
22
|
+
private authorizationEndpoint;
|
|
23
|
+
private tokenEndpoint;
|
|
24
|
+
private userInfoEndpoint;
|
|
25
|
+
private scope;
|
|
26
|
+
private responseType;
|
|
27
|
+
private responseMode;
|
|
28
|
+
constructor(config: OIDCProviderConfig);
|
|
29
|
+
/**
|
|
30
|
+
* Discover OIDC endpoints from .well-known/openid-configuration
|
|
31
|
+
*/
|
|
32
|
+
static discoverEndpoints(discoveryUrl: string): Promise<{
|
|
33
|
+
authorizationEndpoint: string;
|
|
34
|
+
tokenEndpoint: string;
|
|
35
|
+
userInfoEndpoint: string;
|
|
36
|
+
}>;
|
|
37
|
+
/**
|
|
38
|
+
* Create from discovery URL
|
|
39
|
+
*/
|
|
40
|
+
static createFromDiscovery(config: Omit<OIDCProviderConfig, 'authorizationEndpoint' | 'tokenEndpoint' | 'userInfoEndpoint'> & {
|
|
41
|
+
discoveryUrl: string;
|
|
42
|
+
}): Promise<OIDCOAuthProvider>;
|
|
43
|
+
/**
|
|
44
|
+
* Generate authorization URL
|
|
45
|
+
*/
|
|
46
|
+
generateAuthorizationUrl(state: string, nonce: string): string;
|
|
47
|
+
/**
|
|
48
|
+
* Exchange authorization code for tokens
|
|
49
|
+
*/
|
|
50
|
+
exchangeCode(code: string): Promise<OAuthTokenResponse>;
|
|
51
|
+
/**
|
|
52
|
+
* Fetch user profile from OIDC userinfo endpoint
|
|
53
|
+
*/
|
|
54
|
+
fetchUserProfile(accessToken: string): Promise<OAuthUserProfile>;
|
|
55
|
+
/**
|
|
56
|
+
* Refresh access token
|
|
57
|
+
*/
|
|
58
|
+
refreshAccessToken(refreshToken: string): Promise<OAuthTokenResponse>;
|
|
59
|
+
/**
|
|
60
|
+
* Validate ID token (basic validation)
|
|
61
|
+
* In production, should use a JWT library to verify signature
|
|
62
|
+
*/
|
|
63
|
+
validateIdToken(idToken: string): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Decode ID token (without validation - for debugging only)
|
|
66
|
+
*/
|
|
67
|
+
decodeIdToken(idToken: string): Record<string, any>;
|
|
68
|
+
/**
|
|
69
|
+
* Extract provider name from authorization endpoint
|
|
70
|
+
*/
|
|
71
|
+
private extractProviderName;
|
|
72
|
+
/**
|
|
73
|
+
* Validate authorization code format
|
|
74
|
+
*/
|
|
75
|
+
validateAuthorizationCode(code: string): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Validate access token format
|
|
78
|
+
*/
|
|
79
|
+
validateAccessToken(token: string): boolean;
|
|
80
|
+
/**
|
|
81
|
+
* Revoke access token
|
|
82
|
+
*/
|
|
83
|
+
revokeAccessToken(accessToken: string): Promise<boolean>;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=oidc-oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oidc-oauth.d.ts","sourceRoot":"","sources":["../../src/providers/oidc-oauth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEhG;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,mBAAmB;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,qBAAqB,CAAS;IACtC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAS;gBAEjB,MAAM,EAAE,kBAAkB;IAuBtC;;OAEG;WACU,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QAC7D,qBAAqB,EAAE,MAAM,CAAC;QAC9B,aAAa,EAAE,MAAM,CAAC;QACtB,gBAAgB,EAAE,MAAM,CAAC;KACzB,CAAC;IAoBF;;OAEG;WACU,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,kBAAkB,EAAE,uBAAuB,GAAG,eAAe,GAAG,kBAAkB,CAAC,GAAG;QACnI,YAAY,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAS9B;;OAEG;IACH,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAc9D;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAiC7D;;OAEG;IACG,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAkCtE;;OAEG;IACG,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAoC3E;;;OAGG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IASzC;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAWnD;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;OAEG;IACH,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIhD;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI3C;;OAEG;IACG,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAsB9D"}
|