@gauts/auth 0.6.3 → 0.7.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 (77) hide show
  1. package/README.md +486 -198
  2. package/SECURITY.md +10 -2
  3. package/dist/adapters/hono/index.d.ts +29 -4
  4. package/dist/adapters/hono/index.d.ts.map +1 -1
  5. package/dist/adapters/hono/index.js +42 -8
  6. package/dist/adapters/hono/index.js.map +1 -1
  7. package/dist/adapters/hono/social.d.ts +34 -0
  8. package/dist/adapters/hono/social.d.ts.map +1 -0
  9. package/dist/adapters/hono/social.js +202 -0
  10. package/dist/adapters/hono/social.js.map +1 -0
  11. package/dist/adapters/prisma/config.d.ts.map +1 -1
  12. package/dist/adapters/prisma/config.js +85 -71
  13. package/dist/adapters/prisma/config.js.map +1 -1
  14. package/dist/adapters/prisma/index.d.ts +1 -1
  15. package/dist/adapters/prisma/index.d.ts.map +1 -1
  16. package/dist/adapters/prisma/index.js +90 -13
  17. package/dist/adapters/prisma/index.js.map +1 -1
  18. package/dist/adapters/prisma/model.d.ts +40 -7
  19. package/dist/adapters/prisma/model.d.ts.map +1 -1
  20. package/dist/adapters/prisma/model.js +38 -24
  21. package/dist/adapters/prisma/model.js.map +1 -1
  22. package/dist/adapters/prisma/types.d.ts +60 -72
  23. package/dist/adapters/prisma/types.d.ts.map +1 -1
  24. package/dist/errors.d.ts +1 -1
  25. package/dist/errors.d.ts.map +1 -1
  26. package/dist/errors.js.map +1 -1
  27. package/dist/index.d.ts +2 -1
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/providers/common.d.ts +31 -0
  30. package/dist/providers/common.d.ts.map +1 -0
  31. package/dist/providers/common.js +89 -0
  32. package/dist/providers/common.js.map +1 -0
  33. package/dist/providers/github.d.ts +5 -0
  34. package/dist/providers/github.d.ts.map +1 -0
  35. package/dist/providers/github.js +93 -0
  36. package/dist/providers/github.js.map +1 -0
  37. package/dist/providers/google.d.ts +5 -0
  38. package/dist/providers/google.d.ts.map +1 -0
  39. package/dist/providers/google.js +58 -0
  40. package/dist/providers/google.js.map +1 -0
  41. package/dist/providers/index.d.ts +7 -0
  42. package/dist/providers/index.d.ts.map +1 -0
  43. package/dist/providers/index.js +4 -0
  44. package/dist/providers/index.js.map +1 -0
  45. package/dist/providers/x.d.ts +5 -0
  46. package/dist/providers/x.d.ts.map +1 -0
  47. package/dist/providers/x.js +63 -0
  48. package/dist/providers/x.js.map +1 -0
  49. package/dist/session/cookie.d.ts +4 -0
  50. package/dist/session/cookie.d.ts.map +1 -1
  51. package/dist/session/cookie.js +9 -3
  52. package/dist/session/cookie.js.map +1 -1
  53. package/dist/session/guards.d.ts.map +1 -1
  54. package/dist/session/guards.js +7 -1
  55. package/dist/session/guards.js.map +1 -1
  56. package/dist/session/service.d.ts.map +1 -1
  57. package/dist/session/service.js +6 -0
  58. package/dist/session/service.js.map +1 -1
  59. package/dist/session/types.d.ts +10 -1
  60. package/dist/session/types.d.ts.map +1 -1
  61. package/dist/social/config.d.ts +3 -0
  62. package/dist/social/config.d.ts.map +1 -0
  63. package/dist/social/config.js +115 -0
  64. package/dist/social/config.js.map +1 -0
  65. package/dist/social/service.d.ts +18 -0
  66. package/dist/social/service.d.ts.map +1 -0
  67. package/dist/social/service.js +78 -0
  68. package/dist/social/service.js.map +1 -0
  69. package/dist/social/state.d.ts +46 -0
  70. package/dist/social/state.d.ts.map +1 -0
  71. package/dist/social/state.js +139 -0
  72. package/dist/social/state.js.map +1 -0
  73. package/dist/social/types.d.ts +75 -0
  74. package/dist/social/types.d.ts.map +1 -0
  75. package/dist/social/types.js +2 -0
  76. package/dist/social/types.js.map +1 -0
  77. package/package.json +7 -2
@@ -0,0 +1,46 @@
1
+ import type { SocialIdentity, SocialIntent, SocialProviderId } from "./types.js";
2
+ type OAuthPayload = {
3
+ exp: number;
4
+ intent: SocialIntent;
5
+ kind: "oauth";
6
+ provider: SocialProviderId;
7
+ state: string;
8
+ verifier: string;
9
+ };
10
+ type CreateOAuthStateInput = {
11
+ intent: SocialIntent;
12
+ now?: () => Date;
13
+ provider: SocialProviderId;
14
+ secret: string;
15
+ };
16
+ type ResolveOAuthStateInput = {
17
+ now?: () => Date;
18
+ provider: SocialProviderId;
19
+ secret: string;
20
+ state: string | null | undefined;
21
+ value: string | null | undefined;
22
+ };
23
+ type CreateRegistrationStateInput = {
24
+ identity: SocialIdentity;
25
+ now?: () => Date;
26
+ secret: string;
27
+ };
28
+ type ResolveRegistrationStateInput = {
29
+ now?: () => Date;
30
+ secret: string;
31
+ value: string | null | undefined;
32
+ };
33
+ type StoredState<T> = {
34
+ expires_at: Date;
35
+ value: string;
36
+ } & T;
37
+ export declare const validateSocialSecret: (secret: string) => void;
38
+ export declare const createOAuthState: ({ intent, now, provider, secret, }: CreateOAuthStateInput) => StoredState<{
39
+ codeChallenge: string;
40
+ state: string;
41
+ }>;
42
+ export declare const resolveOAuthState: ({ now, provider, secret, state, value, }: ResolveOAuthStateInput) => Pick<OAuthPayload, "intent" | "verifier"> | null;
43
+ export declare const createRegistrationState: ({ identity, now, secret, }: CreateRegistrationStateInput) => StoredState<object>;
44
+ export declare const resolveRegistrationState: ({ now, secret, value, }: ResolveRegistrationStateInput) => SocialIdentity | null;
45
+ export {};
46
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/social/state.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEjF,KAAK,YAAY,GAAG;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CACpB,CAAC;AAQF,KAAK,qBAAqB,GAAG;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,KAAK,sBAAsB,GAAG;IAC1B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACjC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACpC,CAAC;AAEF,KAAK,4BAA4B,GAAG;IAChC,QAAQ,EAAE,cAAc,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,KAAK,6BAA6B,GAAG;IACjC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACpC,CAAC;AAEF,KAAK,WAAW,CAAC,CAAC,IAAI;IAClB,UAAU,EAAE,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACjB,GAAG,CAAC,CAAC;AAaN,eAAO,MAAM,oBAAoB,GAAI,QAAQ,MAAM,KAAG,IAOrD,CAAC;AAuFF,eAAO,MAAM,gBAAgB,GAAI,oCAK9B,qBAAqB,KAAG,WAAW,CAAC;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACjB,CAsBA,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,0CAM/B,sBAAsB,KAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,UAAU,CAAC,GAAG,IAmBvE,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,4BAIrC,4BAA4B,KAAG,WAAW,CAAC,MAAM,CAcnD,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,yBAItC,6BAA6B,KAAG,cAAc,GAAG,IAOnD,CAAC"}
@@ -0,0 +1,139 @@
1
+ import { createHash, createHmac, randomBytes, timingSafeEqual } from "node:crypto";
2
+ import { createError } from "../errors.js";
3
+ import { isRecord } from "../session/guards.js";
4
+ const SOCIAL_CONTEXT = "auth/social";
5
+ const SOCIAL_TTL = 10 * 60;
6
+ const MIN_SECRET_BYTES = 32;
7
+ const signaturePattern = /^[A-Za-z0-9_-]{43}$/;
8
+ const tokenPattern = /^[A-Za-z0-9_-]{43}$/;
9
+ export const validateSocialSecret = (secret) => {
10
+ if (typeof secret !== "string" || Buffer.byteLength(secret, "utf8") < MIN_SECRET_BYTES) {
11
+ throw createError({
12
+ code: "AUTH_CONFIG_INVALID",
13
+ message: "Authentication secret must contain at least 32 bytes.",
14
+ });
15
+ }
16
+ };
17
+ const getSignature = ({ body, secret }) => {
18
+ return createHmac("sha256", secret)
19
+ .update(SOCIAL_CONTEXT)
20
+ .update("\0")
21
+ .update(body)
22
+ .digest("base64url");
23
+ };
24
+ const signPayload = ({ payload, secret }) => {
25
+ const body = Buffer.from(JSON.stringify(payload)).toString("base64url");
26
+ return `${body}.${getSignature({ body, secret })}`;
27
+ };
28
+ const parsePayload = ({ secret, value }) => {
29
+ const [body, signature, extra] = value?.trim().split(".") ?? [];
30
+ if (!body || !signature || extra !== undefined || !signaturePattern.test(signature)) {
31
+ return null;
32
+ }
33
+ const expected = Buffer.from(getSignature({ body, secret }), "ascii");
34
+ const received = Buffer.from(signature, "ascii");
35
+ if (expected.byteLength !== received.byteLength || !timingSafeEqual(expected, received)) {
36
+ return null;
37
+ }
38
+ try {
39
+ return JSON.parse(Buffer.from(body, "base64url").toString("utf8"));
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ };
45
+ const isProvider = (value) => {
46
+ return value === "github" || value === "google" || value === "x";
47
+ };
48
+ const isIntent = (value) => {
49
+ return value === "login" || value === "register";
50
+ };
51
+ const isIdentity = (value) => {
52
+ return (isRecord(value) &&
53
+ (typeof value.avatarUrl === "string" || value.avatarUrl === null) &&
54
+ typeof value.email === "string" &&
55
+ typeof value.name === "string" &&
56
+ isProvider(value.provider) &&
57
+ typeof value.providerId === "string" &&
58
+ (typeof value.username === "string" || value.username === null));
59
+ };
60
+ const isOAuthPayload = (value) => {
61
+ return (isRecord(value) &&
62
+ typeof value.exp === "number" &&
63
+ Number.isSafeInteger(value.exp) &&
64
+ isIntent(value.intent) &&
65
+ value.kind === "oauth" &&
66
+ isProvider(value.provider) &&
67
+ typeof value.state === "string" &&
68
+ tokenPattern.test(value.state) &&
69
+ typeof value.verifier === "string" &&
70
+ tokenPattern.test(value.verifier));
71
+ };
72
+ const isRegistrationPayload = (value) => {
73
+ return (isRecord(value) &&
74
+ typeof value.exp === "number" &&
75
+ Number.isSafeInteger(value.exp) &&
76
+ value.kind === "registration" &&
77
+ isIdentity(value.identity));
78
+ };
79
+ const matchesState = ({ expected, received }) => {
80
+ const left = Buffer.from(expected, "ascii");
81
+ const right = Buffer.from(received, "ascii");
82
+ return left.byteLength === right.byteLength && timingSafeEqual(left, right);
83
+ };
84
+ export const createOAuthState = ({ intent, now = () => new Date(), provider, secret, }) => {
85
+ validateSocialSecret(secret);
86
+ const current = now();
87
+ const expires_at = new Date(current.getTime() + SOCIAL_TTL * 1000);
88
+ const state = randomBytes(32).toString("base64url");
89
+ const verifier = randomBytes(32).toString("base64url");
90
+ const payload = {
91
+ exp: expires_at.getTime(),
92
+ intent,
93
+ kind: "oauth",
94
+ provider,
95
+ state,
96
+ verifier,
97
+ };
98
+ return {
99
+ codeChallenge: createHash("sha256").update(verifier, "ascii").digest("base64url"),
100
+ expires_at,
101
+ state,
102
+ value: signPayload({ payload, secret }),
103
+ };
104
+ };
105
+ export const resolveOAuthState = ({ now = () => new Date(), provider, secret, state, value, }) => {
106
+ validateSocialSecret(secret);
107
+ if (!state || !tokenPattern.test(state)) {
108
+ return null;
109
+ }
110
+ const payload = parsePayload({ secret, value });
111
+ if (!isOAuthPayload(payload) ||
112
+ payload.exp <= now().getTime() ||
113
+ payload.provider !== provider ||
114
+ !matchesState({ expected: payload.state, received: state })) {
115
+ return null;
116
+ }
117
+ return { intent: payload.intent, verifier: payload.verifier };
118
+ };
119
+ export const createRegistrationState = ({ identity, now = () => new Date(), secret, }) => {
120
+ validateSocialSecret(secret);
121
+ const expires_at = new Date(now().getTime() + SOCIAL_TTL * 1000);
122
+ const payload = {
123
+ exp: expires_at.getTime(),
124
+ identity,
125
+ kind: "registration",
126
+ };
127
+ return {
128
+ expires_at,
129
+ value: signPayload({ payload, secret }),
130
+ };
131
+ };
132
+ export const resolveRegistrationState = ({ now = () => new Date(), secret, value, }) => {
133
+ validateSocialSecret(secret);
134
+ const payload = parsePayload({ secret, value });
135
+ return isRegistrationPayload(payload) && payload.exp > now().getTime()
136
+ ? payload.identity
137
+ : null;
138
+ };
139
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/social/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import type { AuthAccount } from "../session/types.js";
2
+ export type SocialProviderId = "github" | "google" | "x";
3
+ export type SocialIntent = "login" | "register";
4
+ export type SocialIdentity = {
5
+ avatarUrl: string | null;
6
+ email: string;
7
+ name: string;
8
+ provider: SocialProviderId;
9
+ providerId: string;
10
+ username: string | null;
11
+ };
12
+ export type SocialAuthorizationInput = {
13
+ codeChallenge: string;
14
+ state: string;
15
+ };
16
+ export type SocialCallbackInput = {
17
+ code: string;
18
+ codeVerifier: string;
19
+ };
20
+ export type SocialProvider = {
21
+ callbackUrl: string;
22
+ getAuthorizationUrl(input: SocialAuthorizationInput): string;
23
+ getIdentity(input: SocialCallbackInput): Promise<SocialIdentity>;
24
+ id: SocialProviderId;
25
+ };
26
+ export type SocialAccountRecord<TAccount extends AuthAccount = AuthAccount> = {
27
+ account: TAccount;
28
+ allowed: boolean;
29
+ };
30
+ export type CreateSocialRecord = {
31
+ account_id: string;
32
+ created_at: Date;
33
+ id: string;
34
+ provider: SocialProviderId;
35
+ provider_id: string;
36
+ };
37
+ export type SocialDbAdapter<TAccount extends AuthAccount = AuthAccount> = {
38
+ createAccount(input: {
39
+ email: string;
40
+ name: string;
41
+ }): Promise<string>;
42
+ createSocial(record: CreateSocialRecord): Promise<void>;
43
+ findAccount(account_id: string): Promise<SocialAccountRecord<TAccount> | null>;
44
+ findEmail(email: string): Promise<SocialAccountRecord<TAccount> | null>;
45
+ findSocial(input: {
46
+ provider: SocialProviderId;
47
+ provider_id: string;
48
+ }): Promise<SocialAccountRecord<TAccount> | null>;
49
+ };
50
+ export type SocialRegistrationInput<TData> = {
51
+ data: TData;
52
+ identity: SocialIdentity;
53
+ };
54
+ export type SocialRegistrationResult = {
55
+ accountId: string;
56
+ };
57
+ export type SocialRegistrationConfig<TData = undefined> = {
58
+ createAccount?: (input: SocialRegistrationInput<TData>) => Promise<SocialRegistrationResult>;
59
+ registerUrl?: string;
60
+ };
61
+ export type SocialConfig<TData = undefined> = {
62
+ cookieName?: string;
63
+ errorUrl: string;
64
+ providers: readonly SocialProvider[];
65
+ registration?: SocialRegistrationConfig<TData>;
66
+ successUrl: string;
67
+ };
68
+ export type ResolvedSocialConfig<TData = undefined> = {
69
+ cookieName: string;
70
+ errorUrl: string;
71
+ providers: ReadonlyMap<SocialProviderId, SocialProvider>;
72
+ registration: SocialRegistrationConfig<TData> | null;
73
+ successUrl: string;
74
+ };
75
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/social/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/social/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@gauts/auth",
3
- "version": "0.6.3",
4
- "description": "Framework-agnostic password and server-side session authentication for Node.js.",
3
+ "version": "0.7.0",
4
+ "description": "Database-backed password, session, and social authentication for Node.js.",
5
5
  "license": "MIT",
6
6
  "author": "GVALFER",
7
7
  "repository": {
@@ -18,6 +18,7 @@
18
18
  "bcrypt",
19
19
  "hono",
20
20
  "nextjs",
21
+ "oauth",
21
22
  "session"
22
23
  ],
23
24
  "type": "module",
@@ -47,6 +48,10 @@
47
48
  "./next": {
48
49
  "types": "./dist/adapters/next/index.d.ts",
49
50
  "import": "./dist/adapters/next/index.js"
51
+ },
52
+ "./providers": {
53
+ "types": "./dist/providers/index.d.ts",
54
+ "import": "./dist/providers/index.js"
50
55
  }
51
56
  },
52
57
  "scripts": {