exisjs 0.5.10 → 0.5.11
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/auth/index.d.ts +3 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +4 -1
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/oauth/core.d.ts +96 -0
- package/dist/auth/oauth/core.d.ts.map +1 -0
- package/dist/auth/oauth/core.js +203 -0
- package/dist/auth/oauth/core.js.map +1 -0
- package/dist/auth/oauth/index.d.ts +45 -0
- package/dist/auth/oauth/index.d.ts.map +1 -0
- package/dist/auth/oauth/index.js +64 -0
- package/dist/auth/oauth/index.js.map +1 -0
- package/dist/auth/oauth/middleware.d.ts +63 -0
- package/dist/auth/oauth/middleware.d.ts.map +1 -0
- package/dist/auth/oauth/middleware.js +164 -0
- package/dist/auth/oauth/middleware.js.map +1 -0
- package/dist/auth/oauth/providers/custom.d.ts +41 -0
- package/dist/auth/oauth/providers/custom.d.ts.map +1 -0
- package/dist/auth/oauth/providers/custom.js +204 -0
- package/dist/auth/oauth/providers/custom.js.map +1 -0
- package/dist/auth/oauth/providers/discord.d.ts +23 -0
- package/dist/auth/oauth/providers/discord.d.ts.map +1 -0
- package/dist/auth/oauth/providers/discord.js +130 -0
- package/dist/auth/oauth/providers/discord.js.map +1 -0
- package/dist/auth/oauth/providers/facebook.d.ts +28 -0
- package/dist/auth/oauth/providers/facebook.d.ts.map +1 -0
- package/dist/auth/oauth/providers/facebook.js +124 -0
- package/dist/auth/oauth/providers/facebook.js.map +1 -0
- package/dist/auth/oauth/providers/github.d.ts +25 -0
- package/dist/auth/oauth/providers/github.d.ts.map +1 -0
- package/dist/auth/oauth/providers/github.js +132 -0
- package/dist/auth/oauth/providers/github.js.map +1 -0
- package/dist/auth/oauth/providers/google.d.ts +23 -0
- package/dist/auth/oauth/providers/google.d.ts.map +1 -0
- package/dist/auth/oauth/providers/google.js +134 -0
- package/dist/auth/oauth/providers/google.js.map +1 -0
- package/dist/auth/oauth/providers/microsoft.d.ts +28 -0
- package/dist/auth/oauth/providers/microsoft.d.ts.map +1 -0
- package/dist/auth/oauth/providers/microsoft.js +136 -0
- package/dist/auth/oauth/providers/microsoft.js.map +1 -0
- package/dist/auth/oauth/types.d.ts +158 -0
- package/dist/auth/oauth/types.d.ts.map +1 -0
- package/dist/auth/oauth/types.js +4 -0
- package/dist/auth/oauth/types.js.map +1 -0
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +0 -1
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/database/adapters/mongodb.d.ts +58 -0
- package/dist/database/adapters/mongodb.d.ts.map +1 -0
- package/dist/database/adapters/mongodb.js +264 -0
- package/dist/database/adapters/mongodb.js.map +1 -0
- package/dist/database/adapters/mysql.d.ts +27 -0
- package/dist/database/adapters/mysql.d.ts.map +1 -0
- package/dist/database/adapters/mysql.js +188 -0
- package/dist/database/adapters/mysql.js.map +1 -0
- package/dist/database/adapters/postgres.d.ts +28 -0
- package/dist/database/adapters/postgres.d.ts.map +1 -0
- package/dist/database/adapters/postgres.js +174 -0
- package/dist/database/adapters/postgres.js.map +1 -0
- package/dist/database/adapters/sqlite.d.ts +27 -0
- package/dist/database/adapters/sqlite.d.ts.map +1 -0
- package/dist/database/adapters/sqlite.js +149 -0
- package/dist/database/adapters/sqlite.js.map +1 -0
- package/dist/database/index.d.ts +42 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +58 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/manager.d.ts +114 -0
- package/dist/database/manager.d.ts.map +1 -0
- package/dist/database/manager.js +269 -0
- package/dist/database/manager.js.map +1 -0
- package/dist/database/migration.d.ts +57 -0
- package/dist/database/migration.d.ts.map +1 -0
- package/dist/database/migration.js +329 -0
- package/dist/database/migration.js.map +1 -0
- package/dist/database/query-builder.d.ts +89 -0
- package/dist/database/query-builder.d.ts.map +1 -0
- package/dist/database/query-builder.js +353 -0
- package/dist/database/query-builder.js.map +1 -0
- package/dist/database/types.d.ts +184 -0
- package/dist/database/types.d.ts.map +1 -0
- package/dist/database/types.js +4 -0
- package/dist/database/types.js.map +1 -0
- package/dist/docs/ARCHITECTURE.md +349 -0
- package/dist/docs/BENCHMARKS.md +36 -0
- package/dist/docs/README.md +34 -0
- package/dist/docs/content/README.md +44 -0
- package/dist/docs/content/adapters.mdx +199 -0
- package/dist/docs/content/cache.mdx +239 -0
- package/dist/docs/content/circuit-breaker.mdx +130 -0
- package/dist/docs/content/cli/commands.mdx +214 -0
- package/dist/docs/content/cli/overview.mdx +92 -0
- package/dist/docs/content/cli/usage.mdx +61 -0
- package/dist/docs/content/config.mdx +214 -0
- package/dist/docs/content/controllers.mdx +241 -0
- package/dist/docs/content/cron.mdx +109 -0
- package/dist/docs/content/database.mdx +209 -0
- package/dist/docs/content/dataloader.mdx +170 -0
- package/dist/docs/content/decorators.mdx +204 -0
- package/dist/docs/content/errors.mdx +344 -0
- package/dist/docs/content/gateways.mdx +376 -0
- package/dist/docs/content/installation.mdx +210 -0
- package/dist/docs/content/introduction.mdx +96 -0
- package/dist/docs/content/middleware.mdx +441 -0
- package/dist/docs/content/modules.mdx +144 -0
- package/dist/docs/content/oauth.mdx +179 -0
- package/dist/docs/content/providers.mdx +147 -0
- package/dist/docs/content/queues.mdx +177 -0
- package/dist/docs/content/requests.mdx +293 -0
- package/dist/docs/content/responses.mdx +271 -0
- package/dist/docs/content/routing.mdx +541 -0
- package/dist/docs/content/rpc.mdx +146 -0
- package/dist/docs/content/security.mdx +294 -0
- package/dist/docs/content/sse.mdx +159 -0
- package/dist/docs/content/structure.mdx +116 -0
- package/dist/docs/content/testing.mdx +139 -0
- package/dist/docs/content/validation.mdx +249 -0
- package/dist/docs/content/websockets.mdx +289 -0
- package/dist/docs/integrations/README.md +23 -0
- package/dist/docs/integrations/jwt.mdx +151 -0
- package/dist/docs/integrations/mongo.mdx +183 -0
- package/dist/docs/integrations/observability.mdx +125 -0
- package/dist/docs/integrations/openai.mdx +108 -0
- package/dist/docs/integrations/postgres.mdx +190 -0
- package/dist/docs/integrations/posthog.mdx +122 -0
- package/dist/docs/integrations/redis.mdx +141 -0
- package/dist/docs/integrations/resend.mdx +117 -0
- package/dist/docs/integrations/s3.mdx +122 -0
- package/dist/docs/integrations/swagger.mdx +113 -0
- package/dist/docs/reference/README.md +3 -0
- package/dist/docs/reference/adapters.mdx +130 -0
- package/dist/docs/reference/auth.mdx +183 -0
- package/dist/docs/reference/cache.mdx +132 -0
- package/dist/docs/reference/circuit-breaker.mdx +71 -0
- package/dist/docs/reference/config.mdx +118 -0
- package/dist/docs/reference/context.mdx +168 -0
- package/dist/docs/reference/dataloader.mdx +91 -0
- package/dist/docs/reference/decorators.mdx +293 -0
- package/dist/docs/reference/di.mdx +123 -0
- package/dist/docs/reference/error.mdx +170 -0
- package/dist/docs/reference/exis.mdx +124 -0
- package/dist/docs/reference/middleware.mdx +304 -0
- package/dist/docs/reference/plugin.mdx +113 -0
- package/dist/docs/reference/queue.mdx +155 -0
- package/dist/docs/reference/router.mdx +248 -0
- package/dist/docs/reference/sanitize.mdx +130 -0
- package/dist/docs/reference/storage.mdx +116 -0
- package/dist/docs/reference/swagger.mdx +132 -0
- package/dist/docs/reference/testing.mdx +145 -0
- package/dist/docs/reference/validator.mdx +186 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/server/bootstrapper.js +1 -1
- package/dist/server/bootstrapper.js.map +1 -1
- package/package.json +8 -1
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Facebook OAuth Provider.
|
|
4
|
+
*
|
|
5
|
+
* Endpoints:
|
|
6
|
+
* Auth: https://www.facebook.com/v19.0/dialog/oauth
|
|
7
|
+
* Token: https://graph.facebook.com/v19.0/oauth/access_token
|
|
8
|
+
* UserInfo: https://graph.facebook.com/v19.0/me
|
|
9
|
+
*
|
|
10
|
+
* Default scopes: email, public_profile
|
|
11
|
+
*
|
|
12
|
+
* Note: Facebook uses Graph API versioning. This implementation uses v19.0.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.FacebookProvider = void 0;
|
|
16
|
+
const GRAPH_VERSION = 'v19.0';
|
|
17
|
+
const AUTH_URL = `https://www.facebook.com/${GRAPH_VERSION}/dialog/oauth`;
|
|
18
|
+
const TOKEN_URL = `https://graph.facebook.com/${GRAPH_VERSION}/oauth/access_token`;
|
|
19
|
+
const USERINFO_URL = `https://graph.facebook.com/${GRAPH_VERSION}/me`;
|
|
20
|
+
const DEFAULT_SCOPES = ['email', 'public_profile'];
|
|
21
|
+
class FacebookProvider {
|
|
22
|
+
constructor(config) {
|
|
23
|
+
this.name = 'facebook';
|
|
24
|
+
this.config = config;
|
|
25
|
+
}
|
|
26
|
+
getAuthorizationUrl(state, _codeVerifier) {
|
|
27
|
+
const scopes = this.config.scopes || DEFAULT_SCOPES;
|
|
28
|
+
const params = new URLSearchParams({
|
|
29
|
+
client_id: this.config.clientId,
|
|
30
|
+
redirect_uri: this.config.redirectUri,
|
|
31
|
+
response_type: 'code',
|
|
32
|
+
scope: scopes.join(','),
|
|
33
|
+
state,
|
|
34
|
+
});
|
|
35
|
+
return `${AUTH_URL}?${params.toString()}`;
|
|
36
|
+
}
|
|
37
|
+
async exchangeCode(code, _codeVerifier) {
|
|
38
|
+
const params = new URLSearchParams({
|
|
39
|
+
client_id: this.config.clientId,
|
|
40
|
+
client_secret: this.config.clientSecret,
|
|
41
|
+
code,
|
|
42
|
+
redirect_uri: this.config.redirectUri,
|
|
43
|
+
});
|
|
44
|
+
const response = await fetch(`${TOKEN_URL}?${params.toString()}`, {
|
|
45
|
+
method: 'GET',
|
|
46
|
+
});
|
|
47
|
+
if (!response.ok) {
|
|
48
|
+
const error = await response.text();
|
|
49
|
+
throw new Error(`Facebook token exchange failed: ${error}`);
|
|
50
|
+
}
|
|
51
|
+
const data = (await response.json());
|
|
52
|
+
if (data.error) {
|
|
53
|
+
throw new Error(`Facebook token exchange failed: ${data.error.message || data.error}`);
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
accessToken: data.access_token,
|
|
57
|
+
expiresIn: data.expires_in,
|
|
58
|
+
tokenType: data.token_type || 'Bearer',
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
async getUserProfile(tokens) {
|
|
62
|
+
const fields = 'id,name,email,first_name,last_name,picture.type(large)';
|
|
63
|
+
const response = await fetch(`${USERINFO_URL}?fields=${encodeURIComponent(fields)}&access_token=${encodeURIComponent(tokens.accessToken)}`);
|
|
64
|
+
if (!response.ok) {
|
|
65
|
+
throw new Error(`Facebook user info request failed: ${response.statusText}`);
|
|
66
|
+
}
|
|
67
|
+
const data = (await response.json());
|
|
68
|
+
if (data.error) {
|
|
69
|
+
throw new Error(`Facebook user info request failed: ${data.error.message || data.error}`);
|
|
70
|
+
}
|
|
71
|
+
// Extract profile picture URL
|
|
72
|
+
const avatar = data.picture?.data?.url || undefined;
|
|
73
|
+
return {
|
|
74
|
+
id: data.id,
|
|
75
|
+
email: data.email || '',
|
|
76
|
+
emailVerified: !!data.email, // Facebook only returns email if verified
|
|
77
|
+
name: data.name || '',
|
|
78
|
+
firstName: data.first_name,
|
|
79
|
+
lastName: data.last_name,
|
|
80
|
+
avatar,
|
|
81
|
+
provider: 'facebook',
|
|
82
|
+
raw: data,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
async refreshToken(_refreshToken) {
|
|
86
|
+
// Facebook uses long-lived tokens instead of refresh tokens
|
|
87
|
+
// To extend a token, exchange a short-lived token for a long-lived one
|
|
88
|
+
throw new Error('Facebook does not support standard refresh tokens. ' +
|
|
89
|
+
'Use the long-lived token exchange endpoint instead: ' +
|
|
90
|
+
`${TOKEN_URL}?grant_type=fb_exchange_token&client_id=...&client_secret=...&fb_exchange_token=...`);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Exchange a short-lived token for a long-lived token (~60 days).
|
|
94
|
+
*/
|
|
95
|
+
async exchangeForLongLived(shortLivedToken) {
|
|
96
|
+
const params = new URLSearchParams({
|
|
97
|
+
grant_type: 'fb_exchange_token',
|
|
98
|
+
client_id: this.config.clientId,
|
|
99
|
+
client_secret: this.config.clientSecret,
|
|
100
|
+
fb_exchange_token: shortLivedToken,
|
|
101
|
+
});
|
|
102
|
+
const response = await fetch(`${TOKEN_URL}?${params.toString()}`);
|
|
103
|
+
if (!response.ok) {
|
|
104
|
+
const error = await response.text();
|
|
105
|
+
throw new Error(`Facebook long-lived token exchange failed: ${error}`);
|
|
106
|
+
}
|
|
107
|
+
const data = (await response.json());
|
|
108
|
+
return {
|
|
109
|
+
accessToken: data.access_token,
|
|
110
|
+
expiresIn: data.expires_in,
|
|
111
|
+
tokenType: data.token_type || 'Bearer',
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
async revokeToken(token) {
|
|
115
|
+
// Facebook uses a DELETE request to revoke permissions
|
|
116
|
+
const response = await fetch(`https://graph.facebook.com/${GRAPH_VERSION}/me/permissions?access_token=${encodeURIComponent(token)}`, { method: 'DELETE' });
|
|
117
|
+
if (!response.ok) {
|
|
118
|
+
const error = await response.text();
|
|
119
|
+
throw new Error(`Facebook token revocation failed: ${error}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
exports.FacebookProvider = FacebookProvider;
|
|
124
|
+
//# sourceMappingURL=facebook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facebook.js","sourceRoot":"","sources":["../../../../src/auth/oauth/providers/facebook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub OAuth Provider.
|
|
3
|
+
*
|
|
4
|
+
* Endpoints:
|
|
5
|
+
* Auth: https://github.com/login/oauth/authorize
|
|
6
|
+
* Token: https://github.com/login/oauth/access_token
|
|
7
|
+
* UserInfo: https://api.github.com/user
|
|
8
|
+
* Emails: https://api.github.com/user/emails
|
|
9
|
+
*
|
|
10
|
+
* Default scopes: user:email, read:user
|
|
11
|
+
*
|
|
12
|
+
* Note: GitHub does not support PKCE or refresh tokens in the standard OAuth flow.
|
|
13
|
+
*/
|
|
14
|
+
import type { OAuthProviderAdapter, OAuthProviderConfig, OAuthTokens, OAuthUserProfile } from '../types';
|
|
15
|
+
export declare class GithubProvider implements OAuthProviderAdapter {
|
|
16
|
+
readonly name: "github";
|
|
17
|
+
private config;
|
|
18
|
+
constructor(config: OAuthProviderConfig);
|
|
19
|
+
getAuthorizationUrl(state: string, _codeVerifier?: string): string;
|
|
20
|
+
exchangeCode(code: string, _codeVerifier?: string): Promise<OAuthTokens>;
|
|
21
|
+
getUserProfile(tokens: OAuthTokens): Promise<OAuthUserProfile>;
|
|
22
|
+
refreshToken(_refreshToken: string): Promise<OAuthTokens>;
|
|
23
|
+
revokeToken(token: string): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=github.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../../../src/auth/oauth/providers/github.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EACjB,MAAM,UAAU,CAAA;AASjB,qBAAa,cAAe,YAAW,oBAAoB;IACzD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAS;IAEjC,OAAO,CAAC,MAAM,CAAqB;gBAEvB,MAAM,EAAE,mBAAmB;IAIvC,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM;IAY5D,YAAY,CAChB,IAAI,EAAE,MAAM,EACZ,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,WAAW,CAAC;IAmCjB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAoD9D,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAOzD,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAuBhD"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* GitHub OAuth Provider.
|
|
4
|
+
*
|
|
5
|
+
* Endpoints:
|
|
6
|
+
* Auth: https://github.com/login/oauth/authorize
|
|
7
|
+
* Token: https://github.com/login/oauth/access_token
|
|
8
|
+
* UserInfo: https://api.github.com/user
|
|
9
|
+
* Emails: https://api.github.com/user/emails
|
|
10
|
+
*
|
|
11
|
+
* Default scopes: user:email, read:user
|
|
12
|
+
*
|
|
13
|
+
* Note: GitHub does not support PKCE or refresh tokens in the standard OAuth flow.
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.GithubProvider = void 0;
|
|
17
|
+
const AUTH_URL = 'https://github.com/login/oauth/authorize';
|
|
18
|
+
const TOKEN_URL = 'https://github.com/login/oauth/access_token';
|
|
19
|
+
const USERINFO_URL = 'https://api.github.com/user';
|
|
20
|
+
const EMAILS_URL = 'https://api.github.com/user/emails';
|
|
21
|
+
const DEFAULT_SCOPES = ['user:email', 'read:user'];
|
|
22
|
+
class GithubProvider {
|
|
23
|
+
constructor(config) {
|
|
24
|
+
this.name = 'github';
|
|
25
|
+
this.config = config;
|
|
26
|
+
}
|
|
27
|
+
getAuthorizationUrl(state, _codeVerifier) {
|
|
28
|
+
const scopes = this.config.scopes || DEFAULT_SCOPES;
|
|
29
|
+
const params = new URLSearchParams({
|
|
30
|
+
client_id: this.config.clientId,
|
|
31
|
+
redirect_uri: this.config.redirectUri,
|
|
32
|
+
scope: scopes.join(' '),
|
|
33
|
+
state,
|
|
34
|
+
});
|
|
35
|
+
return `${AUTH_URL}?${params.toString()}`;
|
|
36
|
+
}
|
|
37
|
+
async exchangeCode(code, _codeVerifier) {
|
|
38
|
+
const response = await fetch(TOKEN_URL, {
|
|
39
|
+
method: 'POST',
|
|
40
|
+
headers: {
|
|
41
|
+
'Content-Type': 'application/json',
|
|
42
|
+
Accept: 'application/json',
|
|
43
|
+
},
|
|
44
|
+
body: JSON.stringify({
|
|
45
|
+
client_id: this.config.clientId,
|
|
46
|
+
client_secret: this.config.clientSecret,
|
|
47
|
+
code,
|
|
48
|
+
redirect_uri: this.config.redirectUri,
|
|
49
|
+
}),
|
|
50
|
+
});
|
|
51
|
+
if (!response.ok) {
|
|
52
|
+
const error = await response.text();
|
|
53
|
+
throw new Error(`GitHub token exchange failed: ${error}`);
|
|
54
|
+
}
|
|
55
|
+
const data = (await response.json());
|
|
56
|
+
if (data.error) {
|
|
57
|
+
throw new Error(`GitHub token exchange failed: ${data.error_description || data.error}`);
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
accessToken: data.access_token,
|
|
61
|
+
tokenType: data.token_type || 'Bearer',
|
|
62
|
+
scope: data.scope,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
async getUserProfile(tokens) {
|
|
66
|
+
const headers = {
|
|
67
|
+
Authorization: `Bearer ${tokens.accessToken}`,
|
|
68
|
+
Accept: 'application/json',
|
|
69
|
+
};
|
|
70
|
+
// Fetch user info
|
|
71
|
+
const userResponse = await fetch(USERINFO_URL, { headers });
|
|
72
|
+
if (!userResponse.ok) {
|
|
73
|
+
throw new Error(`GitHub user info request failed: ${userResponse.statusText}`);
|
|
74
|
+
}
|
|
75
|
+
const userData = (await userResponse.json());
|
|
76
|
+
// Fetch emails (since the user endpoint might not include email)
|
|
77
|
+
let email = userData.email || '';
|
|
78
|
+
let emailVerified = false;
|
|
79
|
+
if (!email || tokens.scope?.includes('user:email')) {
|
|
80
|
+
try {
|
|
81
|
+
const emailsResponse = await fetch(EMAILS_URL, { headers });
|
|
82
|
+
if (emailsResponse.ok) {
|
|
83
|
+
const emails = (await emailsResponse.json());
|
|
84
|
+
const primaryEmail = emails.find((e) => e.primary) || emails[0];
|
|
85
|
+
if (primaryEmail) {
|
|
86
|
+
email = primaryEmail.email;
|
|
87
|
+
emailVerified = primaryEmail.verified ?? false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// Non-critical: proceed with whatever email we have
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Parse name
|
|
96
|
+
const fullName = userData.name || userData.login || '';
|
|
97
|
+
const nameParts = fullName.split(' ');
|
|
98
|
+
return {
|
|
99
|
+
id: String(userData.id),
|
|
100
|
+
email,
|
|
101
|
+
emailVerified,
|
|
102
|
+
name: fullName,
|
|
103
|
+
firstName: nameParts[0] || undefined,
|
|
104
|
+
lastName: nameParts.length > 1 ? nameParts.slice(1).join(' ') : undefined,
|
|
105
|
+
avatar: userData.avatar_url,
|
|
106
|
+
provider: 'github',
|
|
107
|
+
raw: userData,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
async refreshToken(_refreshToken) {
|
|
111
|
+
throw new Error('GitHub OAuth does not support refresh tokens in the standard flow. ' +
|
|
112
|
+
'The user must re-authenticate.');
|
|
113
|
+
}
|
|
114
|
+
async revokeToken(token) {
|
|
115
|
+
// GitHub uses the application API to revoke tokens
|
|
116
|
+
const response = await fetch(`https://api.github.com/applications/${this.config.clientId}/token`, {
|
|
117
|
+
method: 'DELETE',
|
|
118
|
+
headers: {
|
|
119
|
+
Authorization: 'Basic ' +
|
|
120
|
+
Buffer.from(`${this.config.clientId}:${this.config.clientSecret}`).toString('base64'),
|
|
121
|
+
Accept: 'application/vnd.github+json',
|
|
122
|
+
},
|
|
123
|
+
body: JSON.stringify({ access_token: token }),
|
|
124
|
+
});
|
|
125
|
+
if (!response.ok && response.status !== 404) {
|
|
126
|
+
const error = await response.text();
|
|
127
|
+
throw new Error(`GitHub token revocation failed: ${error}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
exports.GithubProvider = GithubProvider;
|
|
132
|
+
//# sourceMappingURL=github.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../../../src/auth/oauth/providers/github.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;AASH,MAAM,QAAQ,GAAG,0CAA0C,CAAA;AAC3D,MAAM,SAAS,GAAG,6CAA6C,CAAA;AAC/D,MAAM,YAAY,GAAG,6BAA6B,CAAA;AAClD,MAAM,UAAU,GAAG,oCAAoC,CAAA;AAEvD,MAAM,cAAc,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;AAElD,MAAa,cAAc;IAKzB,YAAY,MAA2B;QAJ9B,SAAI,GAAG,QAAiB,CAAA;QAK/B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAED,mBAAmB,CAAC,KAAa,EAAE,aAAsB;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,cAAc,CAAA;QACnD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC/B,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACrC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YACvB,KAAK;SACN,CAAC,CAAA;QAEF,OAAO,GAAG,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAA;IAC3C,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,IAAY,EACZ,aAAsB;QAEtB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;YACtC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,kBAAkB;aAC3B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC/B,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;gBACvC,IAAI;gBACJ,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;aACtC,CAAC;SACH,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YACnC,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,EAAE,CAAC,CAAA;QAC3D,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAQ,CAAA;QAE3C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,iCAAiC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,KAAK,EAAE,CACxE,CAAA;QACH,CAAC;QAED,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,SAAS,EAAE,IAAI,CAAC,UAAU,IAAI,QAAQ;YACtC,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAA;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAmB;QACtC,MAAM,OAAO,GAAG;YACd,aAAa,EAAE,UAAU,MAAM,CAAC,WAAW,EAAE;YAC7C,MAAM,EAAE,kBAAkB;SAC3B,CAAA;QAED,kBAAkB;QAClB,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;QAC3D,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CACb,oCAAoC,YAAY,CAAC,UAAU,EAAE,CAC9D,CAAA;QACH,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,MAAM,YAAY,CAAC,IAAI,EAAE,CAAQ,CAAA;QAEnD,iEAAiE;QACjE,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAA;QAChC,IAAI,aAAa,GAAG,KAAK,CAAA;QAEzB,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;gBAC3D,IAAI,cAAc,CAAC,EAAE,EAAE,CAAC;oBACtB,MAAM,MAAM,GAAG,CAAC,MAAM,cAAc,CAAC,IAAI,EAAE,CAAU,CAAA;oBACrD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAA;oBACpE,IAAI,YAAY,EAAE,CAAC;wBACjB,KAAK,GAAG,YAAY,CAAC,KAAK,CAAA;wBAC1B,aAAa,GAAG,YAAY,CAAC,QAAQ,IAAI,KAAK,CAAA;oBAChD,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,oDAAoD;YACtD,CAAC;QACH,CAAC;QAED,aAAa;QACb,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAA;QACtD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAErC,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvB,KAAK;YACL,aAAa;YACb,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS;YACpC,QAAQ,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;YACzE,MAAM,EAAE,QAAQ,CAAC,UAAU;YAC3B,QAAQ,EAAE,QAAQ;YAClB,GAAG,EAAE,QAAQ;SACd,CAAA;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,aAAqB;QACtC,MAAM,IAAI,KAAK,CACb,qEAAqE;YACnE,gCAAgC,CACnC,CAAA;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,mDAAmD;QACnD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,uCAAuC,IAAI,CAAC,MAAM,CAAC,QAAQ,QAAQ,EACnE;YACE,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE;gBACP,aAAa,EACX,QAAQ;oBACR,MAAM,CAAC,IAAI,CACT,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CACtD,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACtB,MAAM,EAAE,6BAA6B;aACtC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;SAC9C,CACF,CAAA;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,EAAE,CAAC,CAAA;QAC7D,CAAC;IACH,CAAC;CACF;AA7ID,wCA6IC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google OAuth 2.0 + OpenID Connect Provider.
|
|
3
|
+
*
|
|
4
|
+
* Endpoints:
|
|
5
|
+
* Auth: https://accounts.google.com/o/oauth2/v2/auth
|
|
6
|
+
* Token: https://oauth2.googleapis.com/token
|
|
7
|
+
* UserInfo: https://www.googleapis.com/oauth2/v3/userinfo
|
|
8
|
+
* Revoke: https://oauth2.googleapis.com/revoke
|
|
9
|
+
*
|
|
10
|
+
* Default scopes: openid, email, profile
|
|
11
|
+
*/
|
|
12
|
+
import type { OAuthProviderAdapter, OAuthProviderConfig, OAuthTokens, OAuthUserProfile } from '../types';
|
|
13
|
+
export declare class GoogleProvider implements OAuthProviderAdapter {
|
|
14
|
+
readonly name: "google";
|
|
15
|
+
private config;
|
|
16
|
+
constructor(config: OAuthProviderConfig);
|
|
17
|
+
getAuthorizationUrl(state: string, codeVerifier?: string): string;
|
|
18
|
+
exchangeCode(code: string, codeVerifier?: string): Promise<OAuthTokens>;
|
|
19
|
+
getUserProfile(tokens: OAuthTokens): Promise<OAuthUserProfile>;
|
|
20
|
+
refreshToken(refreshToken: string): Promise<OAuthTokens>;
|
|
21
|
+
revokeToken(token: string): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=google.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../../../src/auth/oauth/providers/google.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EACjB,MAAM,UAAU,CAAA;AASjB,qBAAa,cAAe,YAAW,oBAAoB;IACzD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAS;IAEjC,OAAO,CAAC,MAAM,CAAqB;gBAEvB,MAAM,EAAE,mBAAmB;IAIvC,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM;IAuB3D,YAAY,CAChB,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,WAAW,CAAC;IAoCjB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA0B9D,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA6BxD,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAchD"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Google OAuth 2.0 + OpenID Connect Provider.
|
|
4
|
+
*
|
|
5
|
+
* Endpoints:
|
|
6
|
+
* Auth: https://accounts.google.com/o/oauth2/v2/auth
|
|
7
|
+
* Token: https://oauth2.googleapis.com/token
|
|
8
|
+
* UserInfo: https://www.googleapis.com/oauth2/v3/userinfo
|
|
9
|
+
* Revoke: https://oauth2.googleapis.com/revoke
|
|
10
|
+
*
|
|
11
|
+
* Default scopes: openid, email, profile
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.GoogleProvider = void 0;
|
|
15
|
+
const node_crypto_1 = require("node:crypto");
|
|
16
|
+
const AUTH_URL = 'https://accounts.google.com/o/oauth2/v2/auth';
|
|
17
|
+
const TOKEN_URL = 'https://oauth2.googleapis.com/token';
|
|
18
|
+
const USERINFO_URL = 'https://www.googleapis.com/oauth2/v3/userinfo';
|
|
19
|
+
const REVOKE_URL = 'https://oauth2.googleapis.com/revoke';
|
|
20
|
+
const DEFAULT_SCOPES = ['openid', 'email', 'profile'];
|
|
21
|
+
class GoogleProvider {
|
|
22
|
+
constructor(config) {
|
|
23
|
+
this.name = 'google';
|
|
24
|
+
this.config = config;
|
|
25
|
+
}
|
|
26
|
+
getAuthorizationUrl(state, codeVerifier) {
|
|
27
|
+
const scopes = this.config.scopes || DEFAULT_SCOPES;
|
|
28
|
+
const params = new URLSearchParams({
|
|
29
|
+
client_id: this.config.clientId,
|
|
30
|
+
redirect_uri: this.config.redirectUri,
|
|
31
|
+
response_type: 'code',
|
|
32
|
+
scope: scopes.join(' '),
|
|
33
|
+
state,
|
|
34
|
+
access_type: 'offline', // Request refresh token
|
|
35
|
+
prompt: 'consent',
|
|
36
|
+
});
|
|
37
|
+
if (codeVerifier) {
|
|
38
|
+
const challenge = (0, node_crypto_1.createHash)('sha256')
|
|
39
|
+
.update(codeVerifier)
|
|
40
|
+
.digest('base64url');
|
|
41
|
+
params.set('code_challenge', challenge);
|
|
42
|
+
params.set('code_challenge_method', 'S256');
|
|
43
|
+
}
|
|
44
|
+
return `${AUTH_URL}?${params.toString()}`;
|
|
45
|
+
}
|
|
46
|
+
async exchangeCode(code, codeVerifier) {
|
|
47
|
+
const body = {
|
|
48
|
+
client_id: this.config.clientId,
|
|
49
|
+
client_secret: this.config.clientSecret,
|
|
50
|
+
code,
|
|
51
|
+
grant_type: 'authorization_code',
|
|
52
|
+
redirect_uri: this.config.redirectUri,
|
|
53
|
+
};
|
|
54
|
+
if (codeVerifier) {
|
|
55
|
+
body.code_verifier = codeVerifier;
|
|
56
|
+
}
|
|
57
|
+
const response = await fetch(TOKEN_URL, {
|
|
58
|
+
method: 'POST',
|
|
59
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
60
|
+
body: new URLSearchParams(body),
|
|
61
|
+
});
|
|
62
|
+
if (!response.ok) {
|
|
63
|
+
const error = await response.text();
|
|
64
|
+
throw new Error(`Google token exchange failed: ${error}`);
|
|
65
|
+
}
|
|
66
|
+
const data = (await response.json());
|
|
67
|
+
return {
|
|
68
|
+
accessToken: data.access_token,
|
|
69
|
+
refreshToken: data.refresh_token,
|
|
70
|
+
expiresIn: data.expires_in,
|
|
71
|
+
tokenType: data.token_type || 'Bearer',
|
|
72
|
+
idToken: data.id_token,
|
|
73
|
+
scope: data.scope,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
async getUserProfile(tokens) {
|
|
77
|
+
const response = await fetch(USERINFO_URL, {
|
|
78
|
+
headers: { Authorization: `Bearer ${tokens.accessToken}` },
|
|
79
|
+
});
|
|
80
|
+
if (!response.ok) {
|
|
81
|
+
throw new Error(`Google user info request failed: ${response.statusText}`);
|
|
82
|
+
}
|
|
83
|
+
const data = (await response.json());
|
|
84
|
+
return {
|
|
85
|
+
id: data.sub,
|
|
86
|
+
email: data.email,
|
|
87
|
+
emailVerified: data.email_verified ?? false,
|
|
88
|
+
name: data.name ||
|
|
89
|
+
`${data.given_name || ''} ${data.family_name || ''}`.trim(),
|
|
90
|
+
firstName: data.given_name,
|
|
91
|
+
lastName: data.family_name,
|
|
92
|
+
avatar: data.picture,
|
|
93
|
+
provider: 'google',
|
|
94
|
+
raw: data,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
async refreshToken(refreshToken) {
|
|
98
|
+
const response = await fetch(TOKEN_URL, {
|
|
99
|
+
method: 'POST',
|
|
100
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
101
|
+
body: new URLSearchParams({
|
|
102
|
+
client_id: this.config.clientId,
|
|
103
|
+
client_secret: this.config.clientSecret,
|
|
104
|
+
refresh_token: refreshToken,
|
|
105
|
+
grant_type: 'refresh_token',
|
|
106
|
+
}),
|
|
107
|
+
});
|
|
108
|
+
if (!response.ok) {
|
|
109
|
+
const error = await response.text();
|
|
110
|
+
throw new Error(`Google token refresh failed: ${error}`);
|
|
111
|
+
}
|
|
112
|
+
const data = (await response.json());
|
|
113
|
+
return {
|
|
114
|
+
accessToken: data.access_token,
|
|
115
|
+
refreshToken: data.refresh_token || refreshToken,
|
|
116
|
+
expiresIn: data.expires_in,
|
|
117
|
+
tokenType: data.token_type || 'Bearer',
|
|
118
|
+
idToken: data.id_token,
|
|
119
|
+
scope: data.scope,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
async revokeToken(token) {
|
|
123
|
+
const response = await fetch(`${REVOKE_URL}?token=${encodeURIComponent(token)}`, {
|
|
124
|
+
method: 'POST',
|
|
125
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
126
|
+
});
|
|
127
|
+
if (!response.ok) {
|
|
128
|
+
const error = await response.text();
|
|
129
|
+
throw new Error(`Google token revocation failed: ${error}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
exports.GoogleProvider = GoogleProvider;
|
|
134
|
+
//# sourceMappingURL=google.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google.js","sourceRoot":"","sources":["../../../../src/auth/oauth/providers/google.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Microsoft Entra ID (Azure AD) OAuth Provider.
|
|
3
|
+
*
|
|
4
|
+
* Endpoints:
|
|
5
|
+
* Auth: https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize
|
|
6
|
+
* Token: https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token
|
|
7
|
+
* UserInfo: https://graph.microsoft.com/v1.0/me
|
|
8
|
+
*
|
|
9
|
+
* Supports multi-tenant ('common'), organizations-only ('organizations'),
|
|
10
|
+
* or a specific tenant ID.
|
|
11
|
+
*
|
|
12
|
+
* Default scopes: openid, email, profile, User.Read
|
|
13
|
+
*/
|
|
14
|
+
import type { OAuthProviderAdapter, OAuthProviderConfig, OAuthTokens, OAuthUserProfile } from '../types';
|
|
15
|
+
export declare class MicrosoftProvider implements OAuthProviderAdapter {
|
|
16
|
+
readonly name: "microsoft";
|
|
17
|
+
private config;
|
|
18
|
+
private tenant;
|
|
19
|
+
constructor(config: OAuthProviderConfig);
|
|
20
|
+
private get authUrl();
|
|
21
|
+
private get tokenUrl();
|
|
22
|
+
getAuthorizationUrl(state: string, codeVerifier?: string): string;
|
|
23
|
+
exchangeCode(code: string, codeVerifier?: string): Promise<OAuthTokens>;
|
|
24
|
+
getUserProfile(tokens: OAuthTokens): Promise<OAuthUserProfile>;
|
|
25
|
+
refreshToken(refreshToken: string): Promise<OAuthTokens>;
|
|
26
|
+
revokeToken(_token: string): Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=microsoft.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"microsoft.d.ts","sourceRoot":"","sources":["../../../../src/auth/oauth/providers/microsoft.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EACjB,MAAM,UAAU,CAAA;AAKjB,qBAAa,iBAAkB,YAAW,oBAAoB;IAC5D,QAAQ,CAAC,IAAI,EAAG,WAAW,CAAS;IAEpC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,MAAM,CAAQ;gBAEV,MAAM,EAAE,mBAAmB;IAKvC,OAAO,KAAK,OAAO,GAElB;IAED,OAAO,KAAK,QAAQ,GAEnB;IAED,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM;IAsB3D,YAAY,CAChB,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,WAAW,CAAC;IAoCjB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA0B9D,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA6BxD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAUjD"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Microsoft Entra ID (Azure AD) OAuth Provider.
|
|
4
|
+
*
|
|
5
|
+
* Endpoints:
|
|
6
|
+
* Auth: https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize
|
|
7
|
+
* Token: https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token
|
|
8
|
+
* UserInfo: https://graph.microsoft.com/v1.0/me
|
|
9
|
+
*
|
|
10
|
+
* Supports multi-tenant ('common'), organizations-only ('organizations'),
|
|
11
|
+
* or a specific tenant ID.
|
|
12
|
+
*
|
|
13
|
+
* Default scopes: openid, email, profile, User.Read
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.MicrosoftProvider = void 0;
|
|
17
|
+
const node_crypto_1 = require("node:crypto");
|
|
18
|
+
const USERINFO_URL = 'https://graph.microsoft.com/v1.0/me';
|
|
19
|
+
const DEFAULT_SCOPES = ['openid', 'email', 'profile', 'User.Read'];
|
|
20
|
+
class MicrosoftProvider {
|
|
21
|
+
constructor(config) {
|
|
22
|
+
this.name = 'microsoft';
|
|
23
|
+
this.config = config;
|
|
24
|
+
this.tenant = config.tenant || 'common';
|
|
25
|
+
}
|
|
26
|
+
get authUrl() {
|
|
27
|
+
return `https://login.microsoftonline.com/${this.tenant}/oauth2/v2.0/authorize`;
|
|
28
|
+
}
|
|
29
|
+
get tokenUrl() {
|
|
30
|
+
return `https://login.microsoftonline.com/${this.tenant}/oauth2/v2.0/token`;
|
|
31
|
+
}
|
|
32
|
+
getAuthorizationUrl(state, codeVerifier) {
|
|
33
|
+
const scopes = this.config.scopes || DEFAULT_SCOPES;
|
|
34
|
+
const params = new URLSearchParams({
|
|
35
|
+
client_id: this.config.clientId,
|
|
36
|
+
redirect_uri: this.config.redirectUri,
|
|
37
|
+
response_type: 'code',
|
|
38
|
+
scope: scopes.join(' '),
|
|
39
|
+
state,
|
|
40
|
+
response_mode: 'query',
|
|
41
|
+
});
|
|
42
|
+
if (codeVerifier) {
|
|
43
|
+
const challenge = (0, node_crypto_1.createHash)('sha256')
|
|
44
|
+
.update(codeVerifier)
|
|
45
|
+
.digest('base64url');
|
|
46
|
+
params.set('code_challenge', challenge);
|
|
47
|
+
params.set('code_challenge_method', 'S256');
|
|
48
|
+
}
|
|
49
|
+
return `${this.authUrl}?${params.toString()}`;
|
|
50
|
+
}
|
|
51
|
+
async exchangeCode(code, codeVerifier) {
|
|
52
|
+
const body = {
|
|
53
|
+
client_id: this.config.clientId,
|
|
54
|
+
client_secret: this.config.clientSecret,
|
|
55
|
+
code,
|
|
56
|
+
grant_type: 'authorization_code',
|
|
57
|
+
redirect_uri: this.config.redirectUri,
|
|
58
|
+
};
|
|
59
|
+
if (codeVerifier) {
|
|
60
|
+
body.code_verifier = codeVerifier;
|
|
61
|
+
}
|
|
62
|
+
const response = await fetch(this.tokenUrl, {
|
|
63
|
+
method: 'POST',
|
|
64
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
65
|
+
body: new URLSearchParams(body),
|
|
66
|
+
});
|
|
67
|
+
if (!response.ok) {
|
|
68
|
+
const error = await response.text();
|
|
69
|
+
throw new Error(`Microsoft token exchange failed: ${error}`);
|
|
70
|
+
}
|
|
71
|
+
const data = (await response.json());
|
|
72
|
+
return {
|
|
73
|
+
accessToken: data.access_token,
|
|
74
|
+
refreshToken: data.refresh_token,
|
|
75
|
+
expiresIn: data.expires_in,
|
|
76
|
+
tokenType: data.token_type || 'Bearer',
|
|
77
|
+
idToken: data.id_token,
|
|
78
|
+
scope: data.scope,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
async getUserProfile(tokens) {
|
|
82
|
+
const response = await fetch(USERINFO_URL, {
|
|
83
|
+
headers: { Authorization: `Bearer ${tokens.accessToken}` },
|
|
84
|
+
});
|
|
85
|
+
if (!response.ok) {
|
|
86
|
+
throw new Error(`Microsoft user info request failed: ${response.statusText}`);
|
|
87
|
+
}
|
|
88
|
+
const data = (await response.json());
|
|
89
|
+
return {
|
|
90
|
+
id: data.id,
|
|
91
|
+
email: data.mail || data.userPrincipalName || '',
|
|
92
|
+
emailVerified: true, // Microsoft verifies emails by default
|
|
93
|
+
name: data.displayName || '',
|
|
94
|
+
firstName: data.givenName,
|
|
95
|
+
lastName: data.surname,
|
|
96
|
+
avatar: undefined, // Graph API requires a separate photo request
|
|
97
|
+
provider: 'microsoft',
|
|
98
|
+
raw: data,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
async refreshToken(refreshToken) {
|
|
102
|
+
const response = await fetch(this.tokenUrl, {
|
|
103
|
+
method: 'POST',
|
|
104
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
105
|
+
body: new URLSearchParams({
|
|
106
|
+
client_id: this.config.clientId,
|
|
107
|
+
client_secret: this.config.clientSecret,
|
|
108
|
+
refresh_token: refreshToken,
|
|
109
|
+
grant_type: 'refresh_token',
|
|
110
|
+
}),
|
|
111
|
+
});
|
|
112
|
+
if (!response.ok) {
|
|
113
|
+
const error = await response.text();
|
|
114
|
+
throw new Error(`Microsoft token refresh failed: ${error}`);
|
|
115
|
+
}
|
|
116
|
+
const data = (await response.json());
|
|
117
|
+
return {
|
|
118
|
+
accessToken: data.access_token,
|
|
119
|
+
refreshToken: data.refresh_token || refreshToken,
|
|
120
|
+
expiresIn: data.expires_in,
|
|
121
|
+
tokenType: data.token_type || 'Bearer',
|
|
122
|
+
idToken: data.id_token,
|
|
123
|
+
scope: data.scope,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
async revokeToken(_token) {
|
|
127
|
+
// Microsoft's v2.0 endpoint does not have a standard revocation endpoint.
|
|
128
|
+
// Token revocation is handled via the admin portal or by signing the user out.
|
|
129
|
+
// The logout URL can be used instead:
|
|
130
|
+
// https://login.microsoftonline.com/{tenant}/oauth2/v2.0/logout
|
|
131
|
+
throw new Error('Microsoft does not provide a standard token revocation endpoint. ' +
|
|
132
|
+
'Use the logout endpoint or revoke via the Azure admin portal.');
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
exports.MicrosoftProvider = MicrosoftProvider;
|
|
136
|
+
//# sourceMappingURL=microsoft.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"microsoft.js","sourceRoot":"","sources":["../../../../src/auth/oauth/providers/microsoft.ts"],"names":[],"mappings":"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"}
|