@constructive-io/oauth 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +187 -0
  3. package/esm/index.d.ts +4 -0
  4. package/esm/index.js +4 -0
  5. package/esm/middleware/express.d.ts +51 -0
  6. package/esm/middleware/express.js +172 -0
  7. package/esm/oauth-client.d.ts +16 -0
  8. package/esm/oauth-client.js +146 -0
  9. package/esm/providers/facebook.d.ts +2 -0
  10. package/esm/providers/facebook.js +21 -0
  11. package/esm/providers/github.d.ts +10 -0
  12. package/esm/providers/github.js +30 -0
  13. package/esm/providers/google.d.ts +2 -0
  14. package/esm/providers/google.js +20 -0
  15. package/esm/providers/index.d.ts +9 -0
  16. package/esm/providers/index.js +17 -0
  17. package/esm/providers/linkedin.d.ts +2 -0
  18. package/esm/providers/linkedin.js +20 -0
  19. package/esm/types.d.ts +55 -0
  20. package/esm/types.js +7 -0
  21. package/esm/utils/state.d.ts +1 -0
  22. package/esm/utils/state.js +1 -0
  23. package/index.d.ts +4 -0
  24. package/index.js +20 -0
  25. package/middleware/express.d.ts +51 -0
  26. package/middleware/express.js +177 -0
  27. package/oauth-client.d.ts +16 -0
  28. package/oauth-client.js +151 -0
  29. package/package.json +51 -0
  30. package/providers/facebook.d.ts +2 -0
  31. package/providers/facebook.js +24 -0
  32. package/providers/github.d.ts +10 -0
  33. package/providers/github.js +34 -0
  34. package/providers/google.d.ts +2 -0
  35. package/providers/google.js +23 -0
  36. package/providers/index.d.ts +9 -0
  37. package/providers/index.js +27 -0
  38. package/providers/linkedin.d.ts +2 -0
  39. package/providers/linkedin.js +23 -0
  40. package/types.d.ts +55 -0
  41. package/types.js +10 -0
  42. package/utils/state.d.ts +1 -0
  43. package/utils/state.js +6 -0
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GITHUB_EMAILS_URL = exports.githubProvider = void 0;
4
+ exports.extractPrimaryEmail = extractPrimaryEmail;
5
+ exports.githubProvider = {
6
+ id: 'github',
7
+ name: 'GitHub',
8
+ authorizationUrl: 'https://github.com/login/oauth/authorize',
9
+ tokenUrl: 'https://github.com/login/oauth/access_token',
10
+ userInfoUrl: 'https://api.github.com/user',
11
+ scopes: ['user:email', 'read:user'],
12
+ tokenRequestContentType: 'json',
13
+ mapProfile: (data) => {
14
+ const profile = data;
15
+ return {
16
+ provider: 'github',
17
+ providerId: String(profile.id),
18
+ email: profile.email || null,
19
+ name: profile.name || profile.login || null,
20
+ picture: profile.avatar_url || null,
21
+ raw: data,
22
+ };
23
+ },
24
+ };
25
+ exports.GITHUB_EMAILS_URL = 'https://api.github.com/user/emails';
26
+ function extractPrimaryEmail(emails) {
27
+ const primary = emails.find((e) => e.primary && e.verified);
28
+ if (primary)
29
+ return primary.email;
30
+ const verified = emails.find((e) => e.verified);
31
+ if (verified)
32
+ return verified.email;
33
+ return emails[0]?.email || null;
34
+ }
@@ -0,0 +1,2 @@
1
+ import { OAuthProviderConfig } from '../types';
2
+ export declare const googleProvider: OAuthProviderConfig;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.googleProvider = void 0;
4
+ exports.googleProvider = {
5
+ id: 'google',
6
+ name: 'Google',
7
+ authorizationUrl: 'https://accounts.google.com/o/oauth2/v2/auth',
8
+ tokenUrl: 'https://oauth2.googleapis.com/token',
9
+ userInfoUrl: 'https://openidconnect.googleapis.com/v1/userinfo',
10
+ scopes: ['openid', 'email', 'profile'],
11
+ tokenRequestContentType: 'form',
12
+ mapProfile: (data) => {
13
+ const profile = data;
14
+ return {
15
+ provider: 'google',
16
+ providerId: profile.sub,
17
+ email: profile.email || null,
18
+ name: profile.name || null,
19
+ picture: profile.picture || null,
20
+ raw: data,
21
+ };
22
+ },
23
+ };
@@ -0,0 +1,9 @@
1
+ import { OAuthProviderConfig } from '../types';
2
+ import { googleProvider } from './google';
3
+ import { githubProvider, GITHUB_EMAILS_URL, extractPrimaryEmail } from './github';
4
+ import { facebookProvider } from './facebook';
5
+ import { linkedinProvider } from './linkedin';
6
+ export declare const providers: Record<string, OAuthProviderConfig>;
7
+ export declare function getProvider(id: string): OAuthProviderConfig | undefined;
8
+ export declare function getProviderIds(): string[];
9
+ export { googleProvider, githubProvider, facebookProvider, linkedinProvider, GITHUB_EMAILS_URL, extractPrimaryEmail, };
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractPrimaryEmail = exports.GITHUB_EMAILS_URL = exports.linkedinProvider = exports.facebookProvider = exports.githubProvider = exports.googleProvider = exports.providers = void 0;
4
+ exports.getProvider = getProvider;
5
+ exports.getProviderIds = getProviderIds;
6
+ const google_1 = require("./google");
7
+ Object.defineProperty(exports, "googleProvider", { enumerable: true, get: function () { return google_1.googleProvider; } });
8
+ const github_1 = require("./github");
9
+ Object.defineProperty(exports, "githubProvider", { enumerable: true, get: function () { return github_1.githubProvider; } });
10
+ Object.defineProperty(exports, "GITHUB_EMAILS_URL", { enumerable: true, get: function () { return github_1.GITHUB_EMAILS_URL; } });
11
+ Object.defineProperty(exports, "extractPrimaryEmail", { enumerable: true, get: function () { return github_1.extractPrimaryEmail; } });
12
+ const facebook_1 = require("./facebook");
13
+ Object.defineProperty(exports, "facebookProvider", { enumerable: true, get: function () { return facebook_1.facebookProvider; } });
14
+ const linkedin_1 = require("./linkedin");
15
+ Object.defineProperty(exports, "linkedinProvider", { enumerable: true, get: function () { return linkedin_1.linkedinProvider; } });
16
+ exports.providers = {
17
+ google: google_1.googleProvider,
18
+ github: github_1.githubProvider,
19
+ facebook: facebook_1.facebookProvider,
20
+ linkedin: linkedin_1.linkedinProvider,
21
+ };
22
+ function getProvider(id) {
23
+ return exports.providers[id];
24
+ }
25
+ function getProviderIds() {
26
+ return Object.keys(exports.providers);
27
+ }
@@ -0,0 +1,2 @@
1
+ import { OAuthProviderConfig } from '../types';
2
+ export declare const linkedinProvider: OAuthProviderConfig;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.linkedinProvider = void 0;
4
+ exports.linkedinProvider = {
5
+ id: 'linkedin',
6
+ name: 'LinkedIn',
7
+ authorizationUrl: 'https://www.linkedin.com/oauth/v2/authorization',
8
+ tokenUrl: 'https://www.linkedin.com/oauth/v2/accessToken',
9
+ userInfoUrl: 'https://api.linkedin.com/v2/userinfo',
10
+ scopes: ['openid', 'profile', 'email'],
11
+ tokenRequestContentType: 'form',
12
+ mapProfile: (data) => {
13
+ const profile = data;
14
+ return {
15
+ provider: 'linkedin',
16
+ providerId: profile.sub,
17
+ email: profile.email || null,
18
+ name: profile.name || null,
19
+ picture: profile.picture || null,
20
+ raw: data,
21
+ };
22
+ },
23
+ };
package/types.d.ts ADDED
@@ -0,0 +1,55 @@
1
+ export interface OAuthProviderConfig {
2
+ id: string;
3
+ name: string;
4
+ authorizationUrl: string;
5
+ tokenUrl: string;
6
+ userInfoUrl: string;
7
+ scopes: string[];
8
+ tokenRequestContentType?: 'json' | 'form';
9
+ userInfoMethod?: 'GET' | 'POST';
10
+ mapProfile: (data: unknown) => OAuthProfile;
11
+ }
12
+ export interface OAuthProfile {
13
+ provider: string;
14
+ providerId: string;
15
+ email: string | null;
16
+ name: string | null;
17
+ picture: string | null;
18
+ raw: unknown;
19
+ }
20
+ export interface OAuthCredentials {
21
+ clientId: string;
22
+ clientSecret: string;
23
+ redirectUri?: string;
24
+ }
25
+ export interface OAuthClientConfig {
26
+ providers: Record<string, OAuthCredentials>;
27
+ baseUrl: string;
28
+ callbackPath?: string;
29
+ stateCookieName?: string;
30
+ stateCookieMaxAge?: number;
31
+ }
32
+ export interface TokenResponse {
33
+ access_token: string;
34
+ token_type: string;
35
+ expires_in?: number;
36
+ refresh_token?: string;
37
+ scope?: string;
38
+ }
39
+ export interface AuthorizationUrlParams {
40
+ provider: string;
41
+ state?: string;
42
+ redirectUri?: string;
43
+ scopes?: string[];
44
+ }
45
+ export interface CallbackParams {
46
+ provider: string;
47
+ code: string;
48
+ redirectUri?: string;
49
+ }
50
+ export interface OAuthError extends Error {
51
+ code: string;
52
+ provider?: string;
53
+ statusCode?: number;
54
+ }
55
+ export declare function createOAuthError(message: string, code: string, provider?: string, statusCode?: number): OAuthError;
package/types.js ADDED
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createOAuthError = createOAuthError;
4
+ function createOAuthError(message, code, provider, statusCode) {
5
+ const error = new Error(message);
6
+ error.code = code;
7
+ error.provider = provider;
8
+ error.statusCode = statusCode;
9
+ return error;
10
+ }
@@ -0,0 +1 @@
1
+ export { generateToken as generateState, verifyToken as verifyState } from '@constructive-io/csrf';
package/utils/state.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.verifyState = exports.generateState = void 0;
4
+ var csrf_1 = require("@constructive-io/csrf");
5
+ Object.defineProperty(exports, "generateState", { enumerable: true, get: function () { return csrf_1.generateToken; } });
6
+ Object.defineProperty(exports, "verifyState", { enumerable: true, get: function () { return csrf_1.verifyToken; } });