unotoken 0.1.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 (122) hide show
  1. package/README.md +360 -0
  2. package/dist/cli.d.ts +17 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +1207 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/client.d.ts +15 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +15 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/db.d.ts +52 -0
  11. package/dist/db.d.ts.map +1 -0
  12. package/dist/db.js +97 -0
  13. package/dist/db.js.map +1 -0
  14. package/dist/dotenv.d.ts +69 -0
  15. package/dist/dotenv.d.ts.map +1 -0
  16. package/dist/dotenv.js +115 -0
  17. package/dist/dotenv.js.map +1 -0
  18. package/dist/env-mapper.d.ts +55 -0
  19. package/dist/env-mapper.d.ts.map +1 -0
  20. package/dist/env-mapper.js +97 -0
  21. package/dist/env-mapper.js.map +1 -0
  22. package/dist/exec.d.ts +80 -0
  23. package/dist/exec.d.ts.map +1 -0
  24. package/dist/exec.js +214 -0
  25. package/dist/exec.js.map +1 -0
  26. package/dist/index.d.ts +12 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +43 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/oauth/commands.d.ts +151 -0
  31. package/dist/oauth/commands.d.ts.map +1 -0
  32. package/dist/oauth/commands.js +322 -0
  33. package/dist/oauth/commands.js.map +1 -0
  34. package/dist/oauth/config.d.ts +84 -0
  35. package/dist/oauth/config.d.ts.map +1 -0
  36. package/dist/oauth/config.js +156 -0
  37. package/dist/oauth/config.js.map +1 -0
  38. package/dist/oauth/crypto-helpers.d.ts +44 -0
  39. package/dist/oauth/crypto-helpers.d.ts.map +1 -0
  40. package/dist/oauth/crypto-helpers.js +94 -0
  41. package/dist/oauth/crypto-helpers.js.map +1 -0
  42. package/dist/oauth/device-secret.d.ts +57 -0
  43. package/dist/oauth/device-secret.d.ts.map +1 -0
  44. package/dist/oauth/device-secret.js +106 -0
  45. package/dist/oauth/device-secret.js.map +1 -0
  46. package/dist/oauth/flow.d.ts +112 -0
  47. package/dist/oauth/flow.d.ts.map +1 -0
  48. package/dist/oauth/flow.js +255 -0
  49. package/dist/oauth/flow.js.map +1 -0
  50. package/dist/oauth/index.d.ts +18 -0
  51. package/dist/oauth/index.d.ts.map +1 -0
  52. package/dist/oauth/index.js +24 -0
  53. package/dist/oauth/index.js.map +1 -0
  54. package/dist/oauth/key-wrap.d.ts +146 -0
  55. package/dist/oauth/key-wrap.d.ts.map +1 -0
  56. package/dist/oauth/key-wrap.js +275 -0
  57. package/dist/oauth/key-wrap.js.map +1 -0
  58. package/dist/oauth/pkce.d.ts +29 -0
  59. package/dist/oauth/pkce.d.ts.map +1 -0
  60. package/dist/oauth/pkce.js +34 -0
  61. package/dist/oauth/pkce.js.map +1 -0
  62. package/dist/oauth/provider.d.ts +79 -0
  63. package/dist/oauth/provider.d.ts.map +1 -0
  64. package/dist/oauth/provider.js +10 -0
  65. package/dist/oauth/provider.js.map +1 -0
  66. package/dist/oauth/providers/github.d.ts +75 -0
  67. package/dist/oauth/providers/github.d.ts.map +1 -0
  68. package/dist/oauth/providers/github.js +119 -0
  69. package/dist/oauth/providers/github.js.map +1 -0
  70. package/dist/oauth/providers/google.d.ts +115 -0
  71. package/dist/oauth/providers/google.d.ts.map +1 -0
  72. package/dist/oauth/providers/google.js +285 -0
  73. package/dist/oauth/providers/google.js.map +1 -0
  74. package/dist/sdk.d.ts +8 -0
  75. package/dist/sdk.d.ts.map +1 -0
  76. package/dist/sdk.js +8 -0
  77. package/dist/sdk.js.map +1 -0
  78. package/dist/server.d.ts +33 -0
  79. package/dist/server.d.ts.map +1 -0
  80. package/dist/server.js +287 -0
  81. package/dist/server.js.map +1 -0
  82. package/dist/signatures/approval-codes.d.ts +192 -0
  83. package/dist/signatures/approval-codes.d.ts.map +1 -0
  84. package/dist/signatures/approval-codes.js +407 -0
  85. package/dist/signatures/approval-codes.js.map +1 -0
  86. package/dist/signatures/commands.d.ts +108 -0
  87. package/dist/signatures/commands.d.ts.map +1 -0
  88. package/dist/signatures/commands.js +270 -0
  89. package/dist/signatures/commands.js.map +1 -0
  90. package/dist/signatures/devices.d.ts +165 -0
  91. package/dist/signatures/devices.d.ts.map +1 -0
  92. package/dist/signatures/devices.js +344 -0
  93. package/dist/signatures/devices.js.map +1 -0
  94. package/dist/signatures/email-config.d.ts +102 -0
  95. package/dist/signatures/email-config.d.ts.map +1 -0
  96. package/dist/signatures/email-config.js +188 -0
  97. package/dist/signatures/email-config.js.map +1 -0
  98. package/dist/signatures/email.d.ts +106 -0
  99. package/dist/signatures/email.d.ts.map +1 -0
  100. package/dist/signatures/email.js +180 -0
  101. package/dist/signatures/email.js.map +1 -0
  102. package/dist/signatures/fingerprint.d.ts +70 -0
  103. package/dist/signatures/fingerprint.d.ts.map +1 -0
  104. package/dist/signatures/fingerprint.js +123 -0
  105. package/dist/signatures/fingerprint.js.map +1 -0
  106. package/dist/signatures/guard.d.ts +118 -0
  107. package/dist/signatures/guard.d.ts.map +1 -0
  108. package/dist/signatures/guard.js +310 -0
  109. package/dist/signatures/guard.js.map +1 -0
  110. package/dist/signatures/resend.d.ts +84 -0
  111. package/dist/signatures/resend.d.ts.map +1 -0
  112. package/dist/signatures/resend.js +248 -0
  113. package/dist/signatures/resend.js.map +1 -0
  114. package/dist/token-requests.d.ts +80 -0
  115. package/dist/token-requests.d.ts.map +1 -0
  116. package/dist/token-requests.js +201 -0
  117. package/dist/token-requests.js.map +1 -0
  118. package/dist/tokens.d.ts +80 -0
  119. package/dist/tokens.d.ts.map +1 -0
  120. package/dist/tokens.js +150 -0
  121. package/dist/tokens.js.map +1 -0
  122. package/package.json +62 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/oauth/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * GitHub OAuth provider for unotoken.
3
+ *
4
+ * Implements the OAuthProvider interface using GitHub's OAuth 2.0 protocol.
5
+ * Unlike Google, GitHub does NOT support OIDC — there is no id_token.
6
+ * Instead, after token exchange, we call the GitHub user API to get identity.
7
+ *
8
+ * GitHub OAuth also requires a client_secret for token exchange, even with PKCE.
9
+ * This is standard for GitHub OAuth apps (same pattern as VS Code, GitHub CLI).
10
+ *
11
+ * @see https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/authorizing-oauth-apps
12
+ * @see https://docs.github.com/en/rest/users/users#get-the-authenticated-user
13
+ */
14
+ import type { OAuthProvider } from '../provider.js';
15
+ /** GitHub OAuth authorize URL */
16
+ declare const AUTHORIZE_URL = "https://github.com/login/oauth/authorize";
17
+ /** GitHub OAuth token endpoint */
18
+ declare const TOKEN_ENDPOINT = "https://github.com/login/oauth/access_token";
19
+ /** GitHub API base URL for user info */
20
+ declare const USER_API_URL = "https://api.github.com/user";
21
+ /**
22
+ * Built-in Indigo-hosted GitHub OAuth app client ID.
23
+ *
24
+ * Registered at github.com/settings/developers under the Indigo organization.
25
+ * App type: OAuth App (not GitHub App).
26
+ * Authorization callback URL: http://localhost/callback
27
+ *
28
+ * GitHub OAuth requires a client_secret for token exchange, even for
29
+ * native/CLI apps using PKCE. This is the same pattern used by VS Code,
30
+ * GitHub CLI, and other desktop OAuth apps — the secret is shipped in
31
+ * the package and is NOT a security boundary (it's a public client).
32
+ */
33
+ declare const DEFAULT_CLIENT_ID = "unotoken-github-client-id";
34
+ /**
35
+ * Built-in client secret for the Indigo-hosted GitHub OAuth app.
36
+ *
37
+ * This ships in the package intentionally — GitHub requires a client_secret
38
+ * for ALL OAuth token exchanges, even public/native clients. This is
39
+ * industry-standard (GitHub CLI, VS Code, etc. all ship their secrets).
40
+ * The actual security boundary is the PKCE verifier + redirect to localhost.
41
+ */
42
+ declare const DEFAULT_CLIENT_SECRET = "unotoken-github-client-secret";
43
+ /** Default scopes — minimal read:user for identity */
44
+ declare const DEFAULT_SCOPES: string[];
45
+ /** GitHub user API response (subset of fields we need) */
46
+ export interface GitHubUser {
47
+ /** Unique numeric user ID */
48
+ id: number;
49
+ /** GitHub username (login handle) */
50
+ login: string;
51
+ /** Display name (may be null) */
52
+ name: string | null;
53
+ /** Email address (may be null if private) */
54
+ email: string | null;
55
+ /** Avatar URL */
56
+ avatar_url: string;
57
+ }
58
+ export interface GitHubProviderOptions {
59
+ /** Override the default GitHub OAuth client ID */
60
+ clientId?: string;
61
+ /** Override the default GitHub OAuth client secret */
62
+ clientSecret?: string;
63
+ /** Custom fetch function (for testing) */
64
+ fetch?: typeof globalThis.fetch;
65
+ }
66
+ /**
67
+ * Create a GitHub OAuth provider instance.
68
+ *
69
+ * After token exchange, calls the GitHub user API (GET /user) to
70
+ * retrieve the authenticated user's identity. This is necessary
71
+ * because GitHub does not issue OIDC id_tokens.
72
+ */
73
+ export declare function createGitHubProvider(options?: GitHubProviderOptions): OAuthProvider;
74
+ export { AUTHORIZE_URL, TOKEN_ENDPOINT, USER_API_URL, DEFAULT_CLIENT_ID, DEFAULT_CLIENT_SECRET, DEFAULT_SCOPES, };
75
+ //# sourceMappingURL=github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../../src/oauth/providers/github.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAgC,MAAM,gBAAgB,CAAC;AAKlF,iCAAiC;AACjC,QAAA,MAAM,aAAa,6CAA6C,CAAC;AAEjE,kCAAkC;AAClC,QAAA,MAAM,cAAc,gDAAgD,CAAC;AAErE,wCAAwC;AACxC,QAAA,MAAM,YAAY,gCAAgC,CAAC;AAEnD;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,iBAAiB,8BAA8B,CAAC;AAEtD;;;;;;;GAOG;AACH,QAAA,MAAM,qBAAqB,kCAAkC,CAAC;AAE9D,sDAAsD;AACtD,QAAA,MAAM,cAAc,UAAgB,CAAC;AAIrC,0DAA0D;AAC1D,MAAM,WAAW,UAAU;IACzB,6BAA6B;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,6CAA6C;IAC7C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,iBAAiB;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,MAAM,WAAW,qBAAqB;IACpC,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,aAAa,CA8EnF;AAID,OAAO,EACL,aAAa,EACb,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,GACf,CAAC"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * GitHub OAuth provider for unotoken.
3
+ *
4
+ * Implements the OAuthProvider interface using GitHub's OAuth 2.0 protocol.
5
+ * Unlike Google, GitHub does NOT support OIDC — there is no id_token.
6
+ * Instead, after token exchange, we call the GitHub user API to get identity.
7
+ *
8
+ * GitHub OAuth also requires a client_secret for token exchange, even with PKCE.
9
+ * This is standard for GitHub OAuth apps (same pattern as VS Code, GitHub CLI).
10
+ *
11
+ * @see https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/authorizing-oauth-apps
12
+ * @see https://docs.github.com/en/rest/users/users#get-the-authenticated-user
13
+ */
14
+ // ─── Constants ────────────────────────────────────────────────────────
15
+ /** GitHub OAuth authorize URL */
16
+ const AUTHORIZE_URL = 'https://github.com/login/oauth/authorize';
17
+ /** GitHub OAuth token endpoint */
18
+ const TOKEN_ENDPOINT = 'https://github.com/login/oauth/access_token';
19
+ /** GitHub API base URL for user info */
20
+ const USER_API_URL = 'https://api.github.com/user';
21
+ /**
22
+ * Built-in Indigo-hosted GitHub OAuth app client ID.
23
+ *
24
+ * Registered at github.com/settings/developers under the Indigo organization.
25
+ * App type: OAuth App (not GitHub App).
26
+ * Authorization callback URL: http://localhost/callback
27
+ *
28
+ * GitHub OAuth requires a client_secret for token exchange, even for
29
+ * native/CLI apps using PKCE. This is the same pattern used by VS Code,
30
+ * GitHub CLI, and other desktop OAuth apps — the secret is shipped in
31
+ * the package and is NOT a security boundary (it's a public client).
32
+ */
33
+ const DEFAULT_CLIENT_ID = 'unotoken-github-client-id';
34
+ /**
35
+ * Built-in client secret for the Indigo-hosted GitHub OAuth app.
36
+ *
37
+ * This ships in the package intentionally — GitHub requires a client_secret
38
+ * for ALL OAuth token exchanges, even public/native clients. This is
39
+ * industry-standard (GitHub CLI, VS Code, etc. all ship their secrets).
40
+ * The actual security boundary is the PKCE verifier + redirect to localhost.
41
+ */
42
+ const DEFAULT_CLIENT_SECRET = 'unotoken-github-client-secret';
43
+ /** Default scopes — minimal read:user for identity */
44
+ const DEFAULT_SCOPES = ['read:user'];
45
+ /**
46
+ * Create a GitHub OAuth provider instance.
47
+ *
48
+ * After token exchange, calls the GitHub user API (GET /user) to
49
+ * retrieve the authenticated user's identity. This is necessary
50
+ * because GitHub does not issue OIDC id_tokens.
51
+ */
52
+ export function createGitHubProvider(options) {
53
+ const clientId = options?.clientId ?? DEFAULT_CLIENT_ID;
54
+ const clientSecret = options?.clientSecret ?? DEFAULT_CLIENT_SECRET;
55
+ const fetchFn = options?.fetch ?? globalThis.fetch;
56
+ const provider = {
57
+ name: 'github',
58
+ clientId,
59
+ scopes: DEFAULT_SCOPES,
60
+ get tokenEndpoint() {
61
+ return TOKEN_ENDPOINT;
62
+ },
63
+ authorizeUrl(redirectUri, state, pkce) {
64
+ const params = new URLSearchParams({
65
+ client_id: clientId,
66
+ redirect_uri: redirectUri,
67
+ scope: DEFAULT_SCOPES.join(' '),
68
+ state,
69
+ // GitHub supports PKCE but still requires client_secret in token exchange
70
+ code_challenge: pkce.challenge,
71
+ code_challenge_method: pkce.method,
72
+ });
73
+ return `${AUTHORIZE_URL}?${params}`;
74
+ },
75
+ tokenRequestBody(code, redirectUri, pkce) {
76
+ return new URLSearchParams({
77
+ grant_type: 'authorization_code',
78
+ code,
79
+ redirect_uri: redirectUri,
80
+ client_id: clientId,
81
+ client_secret: clientSecret,
82
+ code_verifier: pkce.verifier,
83
+ });
84
+ },
85
+ async verifyIdentity(tokenResponse) {
86
+ const accessToken = tokenResponse.access_token;
87
+ if (!accessToken) {
88
+ throw new Error('GitHub token response missing access_token.');
89
+ }
90
+ // GitHub does NOT return an id_token — call the user API instead
91
+ const response = await fetchFn(USER_API_URL, {
92
+ headers: {
93
+ 'Authorization': `Bearer ${accessToken}`,
94
+ 'Accept': 'application/vnd.github+json',
95
+ 'X-GitHub-Api-Version': '2022-11-28',
96
+ 'User-Agent': 'unotoken-oauth',
97
+ },
98
+ });
99
+ if (!response.ok) {
100
+ const text = await response.text();
101
+ throw new Error(`GitHub user API request failed (${response.status}): ${text}`);
102
+ }
103
+ const user = await response.json();
104
+ if (!user.id) {
105
+ throw new Error('GitHub user API response missing user ID.');
106
+ }
107
+ return {
108
+ provider: 'github',
109
+ subjectId: String(user.id),
110
+ email: user.email ?? undefined,
111
+ name: user.login,
112
+ };
113
+ },
114
+ };
115
+ return provider;
116
+ }
117
+ // ─── Exports for testing ──────────────────────────────────────────────
118
+ export { AUTHORIZE_URL, TOKEN_ENDPOINT, USER_API_URL, DEFAULT_CLIENT_ID, DEFAULT_CLIENT_SECRET, DEFAULT_SCOPES, };
119
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../../src/oauth/providers/github.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Google OIDC provider for unotoken OAuth.
3
+ *
4
+ * Implements the OAuthProvider interface using Google's OpenID Connect protocol.
5
+ * Uses the OIDC discovery document to resolve endpoints dynamically, and
6
+ * verifies ID tokens using Google's JWKS (RS256 signatures).
7
+ *
8
+ * @see https://accounts.google.com/.well-known/openid-configuration
9
+ * @see https://developers.google.com/identity/protocols/oauth2/native-app
10
+ */
11
+ import type { OAuthProvider } from '../provider.js';
12
+ /** Google OIDC discovery endpoint */
13
+ declare const DISCOVERY_URL = "https://accounts.google.com/.well-known/openid-configuration";
14
+ /** Expected issuers for Google ID tokens */
15
+ declare const VALID_ISSUERS: string[];
16
+ /**
17
+ * Built-in Indigo-hosted Google OAuth client ID.
18
+ *
19
+ * Registered at console.cloud.google.com under the Indigo GCP project.
20
+ * App type: Web application.
21
+ * Authorized redirect URIs: http://localhost (Google allows any port on localhost for native apps).
22
+ *
23
+ * Public clients (native/CLI apps) do NOT need a client secret for PKCE flows.
24
+ */
25
+ declare const DEFAULT_CLIENT_ID = "unotoken-google-client.apps.googleusercontent.com";
26
+ /** Default scopes for Google OIDC */
27
+ declare const DEFAULT_SCOPES: string[];
28
+ /** Google OIDC discovery document (subset of fields we need) */
29
+ export interface GoogleDiscoveryDocument {
30
+ authorization_endpoint: string;
31
+ token_endpoint: string;
32
+ jwks_uri: string;
33
+ issuer: string;
34
+ }
35
+ /** JSON Web Key from Google's JWKS endpoint */
36
+ export interface JWK {
37
+ kty: string;
38
+ alg: string;
39
+ use: string;
40
+ kid: string;
41
+ n: string;
42
+ e: string;
43
+ }
44
+ /** JWKS response from Google */
45
+ export interface JWKSResponse {
46
+ keys: JWK[];
47
+ }
48
+ /** Decoded JWT header */
49
+ interface JWTHeader {
50
+ alg: string;
51
+ kid: string;
52
+ typ?: string;
53
+ }
54
+ /** Google ID token claims */
55
+ export interface GoogleIdTokenClaims {
56
+ iss: string;
57
+ sub: string;
58
+ aud: string;
59
+ exp: number;
60
+ iat: number;
61
+ email?: string;
62
+ email_verified?: boolean;
63
+ name?: string;
64
+ picture?: string;
65
+ at_hash?: string;
66
+ nonce?: string;
67
+ }
68
+ /**
69
+ * Base64url decode (RFC 4648 section 5).
70
+ * Handles both with and without padding.
71
+ */
72
+ declare function base64urlDecode(input: string): Buffer;
73
+ /**
74
+ * Decode a JWT without verifying its signature.
75
+ * Used to extract the header (for kid lookup) and payload (for claims).
76
+ */
77
+ declare function decodeJwt(token: string): {
78
+ header: JWTHeader;
79
+ payload: GoogleIdTokenClaims;
80
+ signature: string;
81
+ };
82
+ /**
83
+ * Convert a JWK RSA public key to PEM format for Node's crypto module.
84
+ *
85
+ * Builds a DER-encoded PKCS#1 RSAPublicKey structure, then wraps it in PEM.
86
+ */
87
+ declare function jwkToPem(jwk: JWK): string;
88
+ /**
89
+ * Verify an RS256 JWT signature against a JWK.
90
+ *
91
+ * @param token - The raw JWT string
92
+ * @param jwk - The matching JWK from Google's JWKS
93
+ * @returns true if the signature is valid
94
+ */
95
+ declare function verifyRS256Signature(token: string, jwk: JWK): boolean;
96
+ /**
97
+ * Clear cached discovery and JWKS data.
98
+ * Primarily used in tests to ensure clean state.
99
+ */
100
+ export declare function clearGoogleCaches(): void;
101
+ export interface GoogleProviderOptions {
102
+ /** Override the default Google OAuth client ID */
103
+ clientId?: string;
104
+ /** Custom fetch function (for testing) */
105
+ fetch?: typeof globalThis.fetch;
106
+ }
107
+ /**
108
+ * Create a Google OIDC provider instance.
109
+ *
110
+ * Lazily fetches the OIDC discovery document and JWKS on first use,
111
+ * with in-memory caching for subsequent calls.
112
+ */
113
+ export declare function createGoogleProvider(options?: GoogleProviderOptions): OAuthProvider;
114
+ export { decodeJwt, jwkToPem, verifyRS256Signature, base64urlDecode, DISCOVERY_URL, VALID_ISSUERS, DEFAULT_CLIENT_ID, DEFAULT_SCOPES, };
115
+ //# sourceMappingURL=google.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../../src/oauth/providers/google.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAgC,MAAM,gBAAgB,CAAC;AAKlF,qCAAqC;AACrC,QAAA,MAAM,aAAa,iEAAiE,CAAC;AAErF,4CAA4C;AAC5C,QAAA,MAAM,aAAa,UAAyD,CAAC;AAE7E;;;;;;;;GAQG;AACH,QAAA,MAAM,iBAAiB,sDAAsD,CAAC;AAE9E,qCAAqC;AACrC,QAAA,MAAM,cAAc,UAAiC,CAAC;AAItD,gEAAgE;AAChE,MAAM,WAAW,uBAAuB;IACtC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,+CAA+C;AAC/C,MAAM,WAAW,GAAG;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,gCAAgC;AAChC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,GAAG,EAAE,CAAC;CACb;AAED,yBAAyB;AACzB,UAAU,SAAS;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,6BAA6B;AAC7B,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID;;;GAGG;AACH,iBAAS,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ9C;AAED;;;GAGG;AACH,iBAAS,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,mBAAmB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAUxG;AAED;;;;GAIG;AACH,iBAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAkClC;AAkCD;;;;;;GAMG;AACH,iBAAS,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAS9D;AAcD;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC;AAID,MAAM,WAAW,qBAAqB;IACpC,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,aAAa,CAmJnF;AAID,OAAO,EACL,SAAS,EACT,QAAQ,EACR,oBAAoB,EACpB,eAAe,EACf,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,cAAc,GACf,CAAC"}
@@ -0,0 +1,285 @@
1
+ /**
2
+ * Google OIDC provider for unotoken OAuth.
3
+ *
4
+ * Implements the OAuthProvider interface using Google's OpenID Connect protocol.
5
+ * Uses the OIDC discovery document to resolve endpoints dynamically, and
6
+ * verifies ID tokens using Google's JWKS (RS256 signatures).
7
+ *
8
+ * @see https://accounts.google.com/.well-known/openid-configuration
9
+ * @see https://developers.google.com/identity/protocols/oauth2/native-app
10
+ */
11
+ import { createVerify } from 'node:crypto';
12
+ // ─── Constants ────────────────────────────────────────────────────────
13
+ /** Google OIDC discovery endpoint */
14
+ const DISCOVERY_URL = 'https://accounts.google.com/.well-known/openid-configuration';
15
+ /** Expected issuers for Google ID tokens */
16
+ const VALID_ISSUERS = ['https://accounts.google.com', 'accounts.google.com'];
17
+ /**
18
+ * Built-in Indigo-hosted Google OAuth client ID.
19
+ *
20
+ * Registered at console.cloud.google.com under the Indigo GCP project.
21
+ * App type: Web application.
22
+ * Authorized redirect URIs: http://localhost (Google allows any port on localhost for native apps).
23
+ *
24
+ * Public clients (native/CLI apps) do NOT need a client secret for PKCE flows.
25
+ */
26
+ const DEFAULT_CLIENT_ID = 'unotoken-google-client.apps.googleusercontent.com';
27
+ /** Default scopes for Google OIDC */
28
+ const DEFAULT_SCOPES = ['openid', 'email', 'profile'];
29
+ // ─── JWT Verification Helpers ─────────────────────────────────────────
30
+ /**
31
+ * Base64url decode (RFC 4648 section 5).
32
+ * Handles both with and without padding.
33
+ */
34
+ function base64urlDecode(input) {
35
+ // Replace base64url chars with standard base64
36
+ let base64 = input.replace(/-/g, '+').replace(/_/g, '/');
37
+ // Add padding if needed
38
+ const padding = base64.length % 4;
39
+ if (padding === 2)
40
+ base64 += '==';
41
+ else if (padding === 3)
42
+ base64 += '=';
43
+ return Buffer.from(base64, 'base64');
44
+ }
45
+ /**
46
+ * Decode a JWT without verifying its signature.
47
+ * Used to extract the header (for kid lookup) and payload (for claims).
48
+ */
49
+ function decodeJwt(token) {
50
+ const parts = token.split('.');
51
+ if (parts.length !== 3) {
52
+ throw new Error('Invalid JWT: expected 3 parts separated by dots');
53
+ }
54
+ const header = JSON.parse(base64urlDecode(parts[0]).toString('utf8'));
55
+ const payload = JSON.parse(base64urlDecode(parts[1]).toString('utf8'));
56
+ return { header, payload, signature: parts[2] };
57
+ }
58
+ /**
59
+ * Convert a JWK RSA public key to PEM format for Node's crypto module.
60
+ *
61
+ * Builds a DER-encoded PKCS#1 RSAPublicKey structure, then wraps it in PEM.
62
+ */
63
+ function jwkToPem(jwk) {
64
+ const n = base64urlDecode(jwk.n);
65
+ const e = base64urlDecode(jwk.e);
66
+ // Build PKCS#1 RSAPublicKey ASN.1 structure
67
+ const nEncoded = encodeASN1Integer(n);
68
+ const eEncoded = encodeASN1Integer(e);
69
+ const rsaPublicKey = encodeASN1Sequence(Buffer.concat([nEncoded, eEncoded]));
70
+ // Wrap in PKCS#8 SubjectPublicKeyInfo
71
+ // AlgorithmIdentifier for RSA: OID 1.2.840.113549.1.1.1 + NULL
72
+ const rsaOid = Buffer.from([
73
+ 0x30, 0x0d, // SEQUENCE
74
+ 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, // OID
75
+ 0x05, 0x00, // NULL
76
+ ]);
77
+ // BIT STRING wrapping the RSAPublicKey
78
+ const bitString = Buffer.concat([
79
+ Buffer.from([0x03]),
80
+ encodeASN1Length(rsaPublicKey.length + 1),
81
+ Buffer.from([0x00]), // padding bits = 0
82
+ rsaPublicKey,
83
+ ]);
84
+ const spki = encodeASN1Sequence(Buffer.concat([rsaOid, bitString]));
85
+ const b64 = spki.toString('base64');
86
+ const lines = [];
87
+ for (let i = 0; i < b64.length; i += 64) {
88
+ lines.push(b64.substring(i, i + 64));
89
+ }
90
+ return `-----BEGIN PUBLIC KEY-----\n${lines.join('\n')}\n-----END PUBLIC KEY-----`;
91
+ }
92
+ /** Encode a buffer as an ASN.1 INTEGER */
93
+ function encodeASN1Integer(buf) {
94
+ // If high bit is set, prepend a 0x00 byte
95
+ const needsPadding = buf[0] & 0x80;
96
+ const content = needsPadding ? Buffer.concat([Buffer.from([0x00]), buf]) : buf;
97
+ return Buffer.concat([
98
+ Buffer.from([0x02]), // INTEGER tag
99
+ encodeASN1Length(content.length),
100
+ content,
101
+ ]);
102
+ }
103
+ /** Encode a buffer as an ASN.1 SEQUENCE */
104
+ function encodeASN1Sequence(content) {
105
+ return Buffer.concat([
106
+ Buffer.from([0x30]), // SEQUENCE tag
107
+ encodeASN1Length(content.length),
108
+ content,
109
+ ]);
110
+ }
111
+ /** Encode an ASN.1 length (DER encoding) */
112
+ function encodeASN1Length(length) {
113
+ if (length < 0x80) {
114
+ return Buffer.from([length]);
115
+ }
116
+ if (length < 0x100) {
117
+ return Buffer.from([0x81, length]);
118
+ }
119
+ return Buffer.from([0x82, (length >> 8) & 0xff, length & 0xff]);
120
+ }
121
+ /**
122
+ * Verify an RS256 JWT signature against a JWK.
123
+ *
124
+ * @param token - The raw JWT string
125
+ * @param jwk - The matching JWK from Google's JWKS
126
+ * @returns true if the signature is valid
127
+ */
128
+ function verifyRS256Signature(token, jwk) {
129
+ const parts = token.split('.');
130
+ const signedContent = `${parts[0]}.${parts[1]}`;
131
+ const signature = base64urlDecode(parts[2]);
132
+ const pem = jwkToPem(jwk);
133
+ const verifier = createVerify('RSA-SHA256');
134
+ verifier.update(signedContent);
135
+ return verifier.verify(pem, signature);
136
+ }
137
+ // ─── Discovery Cache ──────────────────────────────────────────────────
138
+ /** Cached discovery document (refreshed per-session, not persisted) */
139
+ let cachedDiscovery = null;
140
+ let discoveryFetchTime = 0;
141
+ const DISCOVERY_CACHE_MS = 5 * 60 * 1000; // 5 minutes
142
+ /** Cached JWKS (refreshed per-session) */
143
+ let cachedJWKS = null;
144
+ let jwksFetchTime = 0;
145
+ const JWKS_CACHE_MS = 5 * 60 * 1000; // 5 minutes
146
+ /**
147
+ * Clear cached discovery and JWKS data.
148
+ * Primarily used in tests to ensure clean state.
149
+ */
150
+ export function clearGoogleCaches() {
151
+ cachedDiscovery = null;
152
+ discoveryFetchTime = 0;
153
+ cachedJWKS = null;
154
+ jwksFetchTime = 0;
155
+ }
156
+ /**
157
+ * Create a Google OIDC provider instance.
158
+ *
159
+ * Lazily fetches the OIDC discovery document and JWKS on first use,
160
+ * with in-memory caching for subsequent calls.
161
+ */
162
+ export function createGoogleProvider(options) {
163
+ const clientId = options?.clientId ?? DEFAULT_CLIENT_ID;
164
+ const fetchFn = options?.fetch ?? globalThis.fetch;
165
+ // Token endpoint resolved lazily from discovery document
166
+ let resolvedTokenEndpoint = null;
167
+ /**
168
+ * Fetch (or return cached) Google OIDC discovery document.
169
+ */
170
+ async function getDiscovery() {
171
+ const now = Date.now();
172
+ if (cachedDiscovery && (now - discoveryFetchTime) < DISCOVERY_CACHE_MS) {
173
+ return cachedDiscovery;
174
+ }
175
+ const response = await fetchFn(DISCOVERY_URL);
176
+ if (!response.ok) {
177
+ throw new Error(`Failed to fetch Google OIDC discovery: ${response.status} ${response.statusText}`);
178
+ }
179
+ cachedDiscovery = await response.json();
180
+ discoveryFetchTime = now;
181
+ return cachedDiscovery;
182
+ }
183
+ /**
184
+ * Fetch (or return cached) Google JWKS.
185
+ */
186
+ async function getJWKS(jwksUri) {
187
+ const now = Date.now();
188
+ if (cachedJWKS && (now - jwksFetchTime) < JWKS_CACHE_MS) {
189
+ return cachedJWKS;
190
+ }
191
+ const response = await fetchFn(jwksUri);
192
+ if (!response.ok) {
193
+ throw new Error(`Failed to fetch Google JWKS: ${response.status} ${response.statusText}`);
194
+ }
195
+ cachedJWKS = await response.json();
196
+ jwksFetchTime = now;
197
+ return cachedJWKS;
198
+ }
199
+ const provider = {
200
+ name: 'google',
201
+ clientId,
202
+ scopes: DEFAULT_SCOPES,
203
+ // Token endpoint getter — resolves lazily from discovery
204
+ // We use a getter so it can be resolved after discovery fetch
205
+ get tokenEndpoint() {
206
+ // Return cached endpoint, or the standard fallback
207
+ return resolvedTokenEndpoint ?? 'https://oauth2.googleapis.com/token';
208
+ },
209
+ authorizeUrl(redirectUri, state, pkce) {
210
+ // Use a synchronous fallback for the authorize endpoint
211
+ // The discovery doc normally returns https://accounts.google.com/o/oauth2/v2/auth
212
+ const params = new URLSearchParams({
213
+ client_id: clientId,
214
+ redirect_uri: redirectUri,
215
+ response_type: 'code',
216
+ scope: DEFAULT_SCOPES.join(' '),
217
+ state,
218
+ code_challenge: pkce.challenge,
219
+ code_challenge_method: pkce.method,
220
+ access_type: 'offline',
221
+ prompt: 'consent',
222
+ });
223
+ return `https://accounts.google.com/o/oauth2/v2/auth?${params}`;
224
+ },
225
+ tokenRequestBody(code, redirectUri, pkce) {
226
+ return new URLSearchParams({
227
+ grant_type: 'authorization_code',
228
+ code,
229
+ redirect_uri: redirectUri,
230
+ client_id: clientId,
231
+ code_verifier: pkce.verifier,
232
+ });
233
+ },
234
+ async verifyIdentity(tokenResponse) {
235
+ const idToken = tokenResponse.id_token;
236
+ if (!idToken) {
237
+ throw new Error('Google token response missing id_token. Ensure "openid" scope is requested.');
238
+ }
239
+ // Decode JWT to get header (kid) and claims
240
+ const { header, payload } = decodeJwt(idToken);
241
+ if (header.alg !== 'RS256') {
242
+ throw new Error(`Unsupported JWT algorithm: ${header.alg}. Expected RS256.`);
243
+ }
244
+ // Fetch discovery document to get JWKS URI
245
+ const discovery = await getDiscovery();
246
+ resolvedTokenEndpoint = discovery.token_endpoint;
247
+ // Fetch JWKS and find the matching key
248
+ const jwks = await getJWKS(discovery.jwks_uri);
249
+ const key = jwks.keys.find(k => k.kid === header.kid);
250
+ if (!key) {
251
+ throw new Error(`No matching JWK found for kid "${header.kid}". ` +
252
+ `Available kids: ${jwks.keys.map(k => k.kid).join(', ')}`);
253
+ }
254
+ // Verify RS256 signature
255
+ const signatureValid = verifyRS256Signature(idToken, key);
256
+ if (!signatureValid) {
257
+ throw new Error('Google ID token signature verification failed');
258
+ }
259
+ // Verify issuer
260
+ if (!VALID_ISSUERS.includes(payload.iss)) {
261
+ throw new Error(`Invalid issuer: "${payload.iss}". Expected one of: ${VALID_ISSUERS.join(', ')}`);
262
+ }
263
+ // Verify audience (must match our client ID)
264
+ if (payload.aud !== clientId) {
265
+ throw new Error(`Invalid audience: "${payload.aud}". Expected: "${clientId}"`);
266
+ }
267
+ // Verify expiry
268
+ const now = Math.floor(Date.now() / 1000);
269
+ if (payload.exp < now) {
270
+ throw new Error(`ID token expired at ${new Date(payload.exp * 1000).toISOString()}. ` +
271
+ `Current time: ${new Date(now * 1000).toISOString()}.`);
272
+ }
273
+ return {
274
+ provider: 'google',
275
+ subjectId: payload.sub,
276
+ email: payload.email,
277
+ name: payload.name,
278
+ };
279
+ },
280
+ };
281
+ return provider;
282
+ }
283
+ // ─── Exports for testing ──────────────────────────────────────────────
284
+ export { decodeJwt, jwkToPem, verifyRS256Signature, base64urlDecode, DISCOVERY_URL, VALID_ISSUERS, DEFAULT_CLIENT_ID, DEFAULT_SCOPES, };
285
+ //# sourceMappingURL=google.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.js","sourceRoot":"","sources":["../../../src/oauth/providers/google.ts"],"names":[],"mappings":"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"}
package/dist/sdk.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * unotoken/sdk — re-exports yokotoken/sdk.
3
+ *
4
+ * Drop-in replacement: `import { getSecret } from 'unotoken/sdk'`
5
+ * works identically to `import { getSecret } from 'yokotoken/sdk'`.
6
+ */
7
+ export { getSecret, storeSecret, listSecrets, VaultSdkError, type SecretEntry, type SecretMetadata, type VaultSdkConfig, } from 'yokotoken/sdk';
8
+ //# sourceMappingURL=sdk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,SAAS,EACT,WAAW,EACX,WAAW,EACX,aAAa,EACb,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,eAAe,CAAC"}
package/dist/sdk.js ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * unotoken/sdk — re-exports yokotoken/sdk.
3
+ *
4
+ * Drop-in replacement: `import { getSecret } from 'unotoken/sdk'`
5
+ * works identically to `import { getSecret } from 'yokotoken/sdk'`.
6
+ */
7
+ export { getSecret, storeSecret, listSecrets, VaultSdkError, } from 'yokotoken/sdk';
8
+ //# sourceMappingURL=sdk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.js","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,SAAS,EACT,WAAW,EACX,WAAW,EACX,aAAa,GAId,MAAM,eAAe,CAAC"}