@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.
- package/README.md +486 -198
- package/SECURITY.md +10 -2
- package/dist/adapters/hono/index.d.ts +29 -4
- package/dist/adapters/hono/index.d.ts.map +1 -1
- package/dist/adapters/hono/index.js +42 -8
- package/dist/adapters/hono/index.js.map +1 -1
- package/dist/adapters/hono/social.d.ts +34 -0
- package/dist/adapters/hono/social.d.ts.map +1 -0
- package/dist/adapters/hono/social.js +202 -0
- package/dist/adapters/hono/social.js.map +1 -0
- package/dist/adapters/prisma/config.d.ts.map +1 -1
- package/dist/adapters/prisma/config.js +85 -71
- package/dist/adapters/prisma/config.js.map +1 -1
- package/dist/adapters/prisma/index.d.ts +1 -1
- package/dist/adapters/prisma/index.d.ts.map +1 -1
- package/dist/adapters/prisma/index.js +90 -13
- package/dist/adapters/prisma/index.js.map +1 -1
- package/dist/adapters/prisma/model.d.ts +40 -7
- package/dist/adapters/prisma/model.d.ts.map +1 -1
- package/dist/adapters/prisma/model.js +38 -24
- package/dist/adapters/prisma/model.js.map +1 -1
- package/dist/adapters/prisma/types.d.ts +60 -72
- package/dist/adapters/prisma/types.d.ts.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/providers/common.d.ts +31 -0
- package/dist/providers/common.d.ts.map +1 -0
- package/dist/providers/common.js +89 -0
- package/dist/providers/common.js.map +1 -0
- package/dist/providers/github.d.ts +5 -0
- package/dist/providers/github.d.ts.map +1 -0
- package/dist/providers/github.js +93 -0
- package/dist/providers/github.js.map +1 -0
- package/dist/providers/google.d.ts +5 -0
- package/dist/providers/google.d.ts.map +1 -0
- package/dist/providers/google.js +58 -0
- package/dist/providers/google.js.map +1 -0
- package/dist/providers/index.d.ts +7 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +4 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/x.d.ts +5 -0
- package/dist/providers/x.d.ts.map +1 -0
- package/dist/providers/x.js +63 -0
- package/dist/providers/x.js.map +1 -0
- package/dist/session/cookie.d.ts +4 -0
- package/dist/session/cookie.d.ts.map +1 -1
- package/dist/session/cookie.js +9 -3
- package/dist/session/cookie.js.map +1 -1
- package/dist/session/guards.d.ts.map +1 -1
- package/dist/session/guards.js +7 -1
- package/dist/session/guards.js.map +1 -1
- package/dist/session/service.d.ts.map +1 -1
- package/dist/session/service.js +6 -0
- package/dist/session/service.js.map +1 -1
- package/dist/session/types.d.ts +10 -1
- package/dist/session/types.d.ts.map +1 -1
- package/dist/social/config.d.ts +3 -0
- package/dist/social/config.d.ts.map +1 -0
- package/dist/social/config.js +115 -0
- package/dist/social/config.js.map +1 -0
- package/dist/social/service.d.ts +18 -0
- package/dist/social/service.d.ts.map +1 -0
- package/dist/social/service.js +78 -0
- package/dist/social/service.js.map +1 -0
- package/dist/social/state.d.ts +46 -0
- package/dist/social/state.d.ts.map +1 -0
- package/dist/social/state.js +139 -0
- package/dist/social/state.js.map +1 -0
- package/dist/social/types.d.ts +75 -0
- package/dist/social/types.d.ts.map +1 -0
- package/dist/social/types.js +2 -0
- package/dist/social/types.js.map +1 -0
- 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 @@
|
|
|
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.
|
|
4
|
-
"description": "
|
|
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": {
|