@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 +72 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth.d.ts +30 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +154 -0
- package/dist/oauth.js.map +1 -0
- package/dist/types.d.ts +31 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +42 -0
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
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/oauth.d.ts
ADDED
|
@@ -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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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
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
|
+
}
|