@skia-id/sdk 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.
package/README.md ADDED
@@ -0,0 +1,72 @@
1
+ # @skia-id/sdk
2
+
3
+ OAuth 2.1 / OIDC client SDK for [Skia ID](https://skiaid.org) — anonymous identity verification for websites.
4
+
5
+ Users verify their age once, then sign into your site with a privacy-preserving proxy identity. No passwords, no personal data exposed.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install @skia-id/sdk
11
+ ```
12
+
13
+ ## Quick Start
14
+
15
+ ```ts
16
+ import { SkiaOAuthClient } from "@skia-id/sdk";
17
+
18
+ const skia = new SkiaOAuthClient({
19
+ clientId: "your-client-id", // from dev.skiaid.org
20
+ redirectUri: "https://yourapp.com/callback",
21
+ scopes: ["openid", "email", "age"],
22
+ });
23
+
24
+ // 1. Redirect user to Skia login
25
+ await skia.login();
26
+
27
+ // 2. On your callback page — exchange the code for tokens
28
+ const tokens = await skia.handleCallback();
29
+
30
+ // 3. Get user info
31
+ const user = await skia.getUserInfo(tokens.access_token);
32
+ // { sub: "unique-per-site", email: "ab12cd@pyle.skiaid.org",
33
+ // name: "CosmicBadger", age_over_18: true }
34
+ ```
35
+
36
+ ## Configuration
37
+
38
+ ```ts
39
+ new SkiaOAuthClient({
40
+ clientId: string; // Required — OAuth client ID
41
+ redirectUri: string; // Required — must match registered URI
42
+ scopes?: string[]; // Default: ["openid", "email"]
43
+ apiUrl?: string; // Default: "https://oauth.skiaid.org"
44
+ usePKCE?: boolean; // Default: true (recommended for SPAs)
45
+ });
46
+ ```
47
+
48
+ ## Available Scopes
49
+
50
+ | Scope | Claims |
51
+ |-------|--------|
52
+ | `openid` | `sub` (unique pairwise identifier) |
53
+ | `email` | `email`, `email_verified` |
54
+ | `profile` | `name` (pseudonym) |
55
+ | `age` | `age_over_18` |
56
+
57
+ ## API
58
+
59
+ | Method | Description |
60
+ |--------|-------------|
61
+ | `login()` | Redirect to Skia authorization |
62
+ | `handleCallback(clientSecret?)` | Exchange auth code for tokens |
63
+ | `getUserInfo(accessToken)` | Fetch user claims |
64
+ | `decodeIdToken(idToken)` | Decode JWT payload (client-side, no verification) |
65
+
66
+ ## Register Your App
67
+
68
+ Create OAuth credentials at [dev.skiaid.org](https://dev.skiaid.org).
69
+
70
+ ## License
71
+
72
+ MIT
@@ -0,0 +1,3 @@
1
+ export { SkiaOAuthClient } from "./oauth.js";
2
+ export type { SkiaOAuthConfig, OAuthTokenResponse, UserInfo, } from "./types.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,YAAY,EACV,eAAe,EACf,kBAAkB,EAClB,QAAQ,GACT,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ // Skia ID — OAuth 2.1 / OIDC SDK for third-party integrations
2
+ export { SkiaOAuthClient } from "./oauth.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { SkiaOAuthConfig, OAuthTokenResponse, UserInfo } from "./types.js";
2
+ export declare class SkiaOAuthClient {
3
+ private readonly config;
4
+ constructor(config: SkiaOAuthConfig);
5
+ /**
6
+ * Initiate OAuth login — redirect the user to the Skia
7
+ * authorization endpoint.
8
+ */
9
+ login(): Promise<void>;
10
+ /**
11
+ * Handle the OAuth callback. Call this on your redirect_uri page.
12
+ * Exchanges the authorization code for tokens.
13
+ *
14
+ * @param clientSecret - Required for confidential clients (server-side).
15
+ * Omit for public clients using PKCE.
16
+ */
17
+ handleCallback(clientSecret?: string): Promise<OAuthTokenResponse>;
18
+ /**
19
+ * Fetch user info from the Skia's userinfo endpoint.
20
+ */
21
+ getUserInfo(accessToken: string): Promise<UserInfo>;
22
+ /**
23
+ * Decode an ID token's payload without verification.
24
+ * For display purposes only — always verify tokens server-side.
25
+ */
26
+ decodeIdToken(idToken: string): Record<string, unknown>;
27
+ /** Get the configured client ID */
28
+ getClientId(): string;
29
+ }
30
+ //# sourceMappingURL=oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAClB,QAAQ,EACT,MAAM,YAAY,CAAC;AAkDpB,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAMrB;gBAEU,MAAM,EAAE,eAAe;IAUnC;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB5B;;;;;;OAMG;IACG,cAAc,CAClB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,kBAAkB,CAAC;IAwD9B;;OAEG;IACG,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAYzD;;;OAGG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAUvD,mCAAmC;IACnC,WAAW,IAAI,MAAM;CAGtB"}
package/dist/oauth.js ADDED
@@ -0,0 +1,154 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Default OAuth URL — production Skia identity provider
3
+ // ---------------------------------------------------------------------------
4
+ const DEFAULT_OAUTH_URL = "https://oauth.skiaid.org";
5
+ // ---------------------------------------------------------------------------
6
+ // PKCE helpers — browser-safe (SubtleCrypto)
7
+ // ---------------------------------------------------------------------------
8
+ function generateRandomString(length) {
9
+ const array = new Uint8Array(length);
10
+ crypto.getRandomValues(array);
11
+ return Array.from(array, (b) => b.toString(16).padStart(2, "0")).join("");
12
+ }
13
+ async function sha256(plain) {
14
+ const encoder = new TextEncoder();
15
+ return crypto.subtle.digest("SHA-256", encoder.encode(plain));
16
+ }
17
+ function base64urlEncode(buffer) {
18
+ const bytes = new Uint8Array(buffer);
19
+ let str = "";
20
+ for (const b of bytes) {
21
+ str += String.fromCharCode(b);
22
+ }
23
+ return btoa(str).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
24
+ }
25
+ async function generateCodeChallenge(verifier) {
26
+ const hash = await sha256(verifier);
27
+ return base64urlEncode(hash);
28
+ }
29
+ // ---------------------------------------------------------------------------
30
+ // Storage keys
31
+ // ---------------------------------------------------------------------------
32
+ const PKCE_VERIFIER_KEY = "skia_pkce_verifier";
33
+ const OAUTH_STATE_KEY = "skia_oauth_state";
34
+ // ---------------------------------------------------------------------------
35
+ // SkiaOAuthClient — OAuth 2.1 client for sites
36
+ // ---------------------------------------------------------------------------
37
+ export class SkiaOAuthClient {
38
+ config;
39
+ constructor(config) {
40
+ this.config = {
41
+ clientId: config.clientId,
42
+ redirectUri: config.redirectUri,
43
+ scopes: config.scopes ?? ["openid", "email"],
44
+ apiUrl: config.apiUrl ?? DEFAULT_OAUTH_URL,
45
+ usePKCE: config.usePKCE ?? true,
46
+ };
47
+ }
48
+ /**
49
+ * Initiate OAuth login — redirect the user to the Skia
50
+ * authorization endpoint.
51
+ */
52
+ async login() {
53
+ const state = generateRandomString(16);
54
+ sessionStorage.setItem(OAUTH_STATE_KEY, state);
55
+ const params = new URLSearchParams({
56
+ client_id: this.config.clientId,
57
+ redirect_uri: this.config.redirectUri,
58
+ response_type: "code",
59
+ scope: this.config.scopes.join(" "),
60
+ state,
61
+ });
62
+ if (this.config.usePKCE) {
63
+ const codeVerifier = generateRandomString(32);
64
+ sessionStorage.setItem(PKCE_VERIFIER_KEY, codeVerifier);
65
+ const codeChallenge = await generateCodeChallenge(codeVerifier);
66
+ params.set("code_challenge", codeChallenge);
67
+ params.set("code_challenge_method", "S256");
68
+ }
69
+ window.location.href = `${this.config.apiUrl}/oauth/authorize?${params.toString()}`;
70
+ }
71
+ /**
72
+ * Handle the OAuth callback. Call this on your redirect_uri page.
73
+ * Exchanges the authorization code for tokens.
74
+ *
75
+ * @param clientSecret - Required for confidential clients (server-side).
76
+ * Omit for public clients using PKCE.
77
+ */
78
+ async handleCallback(clientSecret) {
79
+ const url = new URL(window.location.href);
80
+ const code = url.searchParams.get("code");
81
+ const state = url.searchParams.get("state");
82
+ const error = url.searchParams.get("error");
83
+ if (error) {
84
+ throw new Error(`OAuth error: ${error}`);
85
+ }
86
+ if (!code) {
87
+ throw new Error("No authorization code in callback URL");
88
+ }
89
+ // Validate state
90
+ const savedState = sessionStorage.getItem(OAUTH_STATE_KEY);
91
+ if (state !== savedState) {
92
+ throw new Error("OAuth state mismatch — possible CSRF attack");
93
+ }
94
+ sessionStorage.removeItem(OAUTH_STATE_KEY);
95
+ // Build token request
96
+ const body = {
97
+ grant_type: "authorization_code",
98
+ code,
99
+ redirect_uri: this.config.redirectUri,
100
+ client_id: this.config.clientId,
101
+ };
102
+ if (this.config.usePKCE) {
103
+ const verifier = sessionStorage.getItem(PKCE_VERIFIER_KEY);
104
+ if (!verifier) {
105
+ throw new Error("PKCE verifier not found — was login() called first?");
106
+ }
107
+ body.code_verifier = verifier;
108
+ sessionStorage.removeItem(PKCE_VERIFIER_KEY);
109
+ }
110
+ if (clientSecret) {
111
+ body.client_secret = clientSecret;
112
+ }
113
+ const res = await fetch(`${this.config.apiUrl}/oauth/token`, {
114
+ method: "POST",
115
+ headers: { "Content-Type": "application/json" },
116
+ body: JSON.stringify(body),
117
+ });
118
+ if (!res.ok) {
119
+ const err = await res.json().catch(() => ({ error: "Token exchange failed" }));
120
+ throw new Error(err.error ?? "Token exchange failed");
121
+ }
122
+ return res.json();
123
+ }
124
+ /**
125
+ * Fetch user info from the Skia's userinfo endpoint.
126
+ */
127
+ async getUserInfo(accessToken) {
128
+ const res = await fetch(`${this.config.apiUrl}/oauth/userinfo`, {
129
+ headers: { Authorization: `Bearer ${accessToken}` },
130
+ });
131
+ if (!res.ok) {
132
+ throw new Error("Failed to fetch user info");
133
+ }
134
+ return res.json();
135
+ }
136
+ /**
137
+ * Decode an ID token's payload without verification.
138
+ * For display purposes only — always verify tokens server-side.
139
+ */
140
+ decodeIdToken(idToken) {
141
+ const parts = idToken.split(".");
142
+ if (parts.length !== 3) {
143
+ throw new Error("Invalid JWT format");
144
+ }
145
+ const payload = parts[1];
146
+ const decoded = atob(payload.replace(/-/g, "+").replace(/_/g, "/"));
147
+ return JSON.parse(decoded);
148
+ }
149
+ /** Get the configured client ID */
150
+ getClientId() {
151
+ return this.config.clientId;
152
+ }
153
+ }
154
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export interface SkiaOAuthConfig {
2
+ /** OAuth client_id from registration */
3
+ clientId: string;
4
+ /** OAuth redirect_uri (must match registered URI) */
5
+ redirectUri: string;
6
+ /** Scopes to request (defaults to ["openid", "email"]) */
7
+ scopes?: string[];
8
+ /** Skia API base URL */
9
+ apiUrl?: string;
10
+ /** Use PKCE for public clients (defaults to true) */
11
+ usePKCE?: boolean;
12
+ }
13
+ export interface OAuthTokenResponse {
14
+ access_token: string;
15
+ token_type: string;
16
+ expires_in: number;
17
+ id_token: string;
18
+ scope: string;
19
+ }
20
+ export interface UserInfo {
21
+ /** Unique proxy identifier (different per site) */
22
+ sub: string;
23
+ /** Proxy email address */
24
+ email?: string;
25
+ email_verified?: boolean;
26
+ /** Pseudonym / display name */
27
+ name?: string;
28
+ /** Age verification claim */
29
+ age_over_18?: boolean;
30
+ }
31
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,wBAAwB;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAC;IACZ,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,+BAA+B;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB"}
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ // ---------------------------------------------------------------------------
2
+ // OAuth / OIDC types
3
+ // ---------------------------------------------------------------------------
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@skia-id/sdk",
3
+ "version": "0.1.0",
4
+ "description": "Skia ID OAuth 2.1 / OIDC client SDK — anonymous identity verification for websites",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "sideEffects": false,
15
+ "scripts": {
16
+ "build": "tsc --project tsconfig.json",
17
+ "typecheck": "tsc --noEmit",
18
+ "clean": "rm -rf dist"
19
+ },
20
+ "devDependencies": {
21
+ "@skia-id/shared": "workspace:*",
22
+ "@skia-id/typescript-config": "workspace:*",
23
+ "typescript": "^5.7.0"
24
+ },
25
+ "keywords": [
26
+ "oauth",
27
+ "oidc",
28
+ "identity",
29
+ "age-verification",
30
+ "privacy",
31
+ "pkce",
32
+ "skia"
33
+ ],
34
+ "license": "MIT",
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "https://github.com/nickalready/agentic-auth",
38
+ "directory": "packages/sdk"
39
+ },
40
+ "homepage": "https://dev.skiaid.org",
41
+ "files": ["dist", "README.md"]
42
+ }