@hawcx/oauth-client 0.2.0 → 5.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 +587 -204
- package/dist/client-assertion.d.ts +45 -0
- package/dist/client-assertion.d.ts.map +1 -0
- package/dist/client-assertion.js +141 -0
- package/dist/client-assertion.js.map +1 -0
- package/dist/delegation/credentials.d.ts +92 -0
- package/dist/delegation/credentials.d.ts.map +1 -0
- package/dist/delegation/credentials.js +215 -0
- package/dist/delegation/credentials.js.map +1 -0
- package/dist/delegation/crypto.d.ts +2 -2
- package/dist/delegation/crypto.d.ts.map +1 -1
- package/dist/delegation/crypto.js +41 -32
- package/dist/delegation/crypto.js.map +1 -1
- package/dist/delegation/exceptions.d.ts +12 -5
- package/dist/delegation/exceptions.d.ts.map +1 -1
- package/dist/delegation/exceptions.js +12 -14
- package/dist/delegation/exceptions.js.map +1 -1
- package/dist/delegation/factory.d.ts +20 -0
- package/dist/delegation/factory.d.ts.map +1 -0
- package/dist/delegation/factory.js +49 -0
- package/dist/delegation/factory.js.map +1 -0
- package/dist/delegation/hawcx.d.ts +59 -224
- package/dist/delegation/hawcx.d.ts.map +1 -1
- package/dist/delegation/hawcx.js +99 -299
- package/dist/delegation/hawcx.js.map +1 -1
- package/dist/delegation/index.d.ts +4 -9
- package/dist/delegation/index.d.ts.map +1 -1
- package/dist/delegation/index.js +5 -17
- package/dist/delegation/index.js.map +1 -1
- package/dist/delegation/transport.d.ts +40 -0
- package/dist/delegation/transport.d.ts.map +1 -0
- package/dist/delegation/transport.js +120 -0
- package/dist/delegation/transport.js.map +1 -0
- package/dist/errors.d.ts +62 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +73 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +12 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -27
- package/dist/index.js.map +1 -1
- package/dist/oauth.d.ts +265 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +497 -0
- package/dist/oauth.js.map +1 -0
- package/dist/stepup/client.d.ts +26 -0
- package/dist/stepup/client.d.ts.map +1 -0
- package/dist/stepup/client.js +78 -0
- package/dist/stepup/client.js.map +1 -0
- package/dist/stepup/index.d.ts +3 -0
- package/dist/stepup/index.d.ts.map +1 -0
- package/dist/stepup/index.js +19 -0
- package/dist/stepup/index.js.map +1 -0
- package/dist/stepup/types.d.ts +35 -0
- package/dist/stepup/types.d.ts.map +1 -0
- package/dist/stepup/types.js +3 -0
- package/dist/stepup/types.js.map +1 -0
- package/package.json +13 -16
- package/dist/client.d.ts +0 -134
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -300
- package/dist/client.js.map +0 -1
- package/dist/delegation/client.d.ts +0 -116
- package/dist/delegation/client.d.ts.map +0 -1
- package/dist/delegation/client.js +0 -227
- package/dist/delegation/client.js.map +0 -1
- package/dist/exceptions.d.ts +0 -52
- package/dist/exceptions.d.ts.map +0 -1
- package/dist/exceptions.js +0 -81
- package/dist/exceptions.js.map +0 -1
- package/dist/utils.d.ts +0 -61
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js +0 -263
- package/dist/utils.js.map +0 -1
|
@@ -1,254 +1,89 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Hawcx
|
|
3
|
-
*
|
|
4
|
-
* This module provides a streamlined API for common Hawcx operations like
|
|
5
|
-
* MFA configuration, user management, and device operations. All cryptographic
|
|
6
|
-
* operations (encryption, signing, verification) are handled automatically.
|
|
7
|
-
*/
|
|
8
|
-
import { Signer } from './client';
|
|
9
|
-
import { Verifier, EciesX25519Encryptor, EciesX25519Decryptor } from './crypto';
|
|
10
|
-
/**
|
|
11
|
-
* Supported MFA methods for Hawcx authentication.
|
|
12
|
-
*
|
|
13
|
-
* This enum ensures type safety and prevents typos when specifying MFA methods.
|
|
14
|
-
*
|
|
15
|
-
* @example
|
|
16
|
-
* ```typescript
|
|
17
|
-
* import { MfaMethod } from '@hawcx/oauth-client';
|
|
18
|
-
*
|
|
19
|
-
* // Use enum for type safety
|
|
20
|
-
* await client.initiateMfaChange({
|
|
21
|
-
* userid: "user@example.com",
|
|
22
|
-
* mfaMethod: MfaMethod.SMS, // Type-safe!
|
|
23
|
-
* phoneNumber: "+15551234567"
|
|
24
|
-
* });
|
|
25
|
-
*
|
|
26
|
-
* // String values still work for backwards compatibility
|
|
27
|
-
* await client.initiateMfaChange({
|
|
28
|
-
* userid: "user@example.com",
|
|
29
|
-
* mfaMethod: "sms", // Also works
|
|
30
|
-
* phoneNumber: "+15551234567"
|
|
31
|
-
* });
|
|
32
|
-
* ```
|
|
2
|
+
* Hawcx delegation client with ergonomic, high-level operations.
|
|
33
3
|
*/
|
|
4
|
+
import { DelegationTransport } from './transport';
|
|
5
|
+
import { DelegationKeyMaterial } from './factory';
|
|
34
6
|
export declare enum MfaMethod {
|
|
35
7
|
EMAIL = "email",
|
|
36
8
|
SMS = "sms",
|
|
37
9
|
TOTP = "totp"
|
|
38
10
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
*/
|
|
42
|
-
export interface HawcxClientFromKeysOptions {
|
|
43
|
-
/** Service Provider's Ed25519 private key (PEM format) */
|
|
44
|
-
spSigningKey: string;
|
|
45
|
-
/** Service Provider's X25519 private key (PEM format) */
|
|
46
|
-
spEncryptionKey: string;
|
|
47
|
-
/** IDP's Ed25519 public key (PEM format) */
|
|
48
|
-
idpVerifyKey: string;
|
|
49
|
-
/** IDP's X25519 public key (PEM format) */
|
|
50
|
-
idpEncryptionKey: string;
|
|
51
|
-
/** Hawcx API base URL (e.g., "https://example.hawcx.com") */
|
|
11
|
+
type JsonObject = Record<string, unknown>;
|
|
12
|
+
export interface DelegationClientBaseOptions {
|
|
13
|
+
/** Hawcx API base URL (e.g., "https://api.hawcx.com") */
|
|
52
14
|
baseUrl: string;
|
|
53
|
-
/**
|
|
54
|
-
spId: string;
|
|
55
|
-
/** Optional Hawcx API key */
|
|
15
|
+
/** Optional Hawcx API key (for additional authentication) */
|
|
56
16
|
apiKey?: string;
|
|
57
17
|
/** Request timeout in seconds (default: 15) */
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
|
|
61
|
-
/** Internal - Key ID for IDP verification (default: "hawcx", do not change) */
|
|
62
|
-
idpKid?: string;
|
|
18
|
+
timeoutSeconds?: number;
|
|
19
|
+
/** Allowed response timestamp skew in seconds (default: 300) */
|
|
20
|
+
clockSkewSeconds?: number;
|
|
63
21
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
22
|
+
export interface DelegationClientSecretKeyOptions extends DelegationClientBaseOptions {
|
|
23
|
+
/** Hawcx secret key (credential blob). */
|
|
24
|
+
secretKey: string;
|
|
25
|
+
}
|
|
26
|
+
export type DelegationClientKeyOptions = DelegationClientBaseOptions & DelegationKeyMaterial;
|
|
27
|
+
export interface MfaInitiateOptions {
|
|
68
28
|
/** User identifier (typically email address) */
|
|
69
|
-
|
|
29
|
+
userId: string;
|
|
70
30
|
/** MFA method to configure (MfaMethod enum or 'email', 'sms', 'totp' string) */
|
|
71
31
|
mfaMethod: MfaMethod | string;
|
|
72
|
-
/** Phone number with country code (required for SMS
|
|
32
|
+
/** Phone number with country code (required for SMS) */
|
|
73
33
|
phoneNumber?: string;
|
|
74
34
|
/** Target MFA method after verification (optional) */
|
|
75
35
|
mfaChangeTo?: MfaMethod | string;
|
|
76
36
|
}
|
|
77
|
-
|
|
78
|
-
* Options for verifying MFA change
|
|
79
|
-
*/
|
|
80
|
-
export interface VerifyMfaChangeOptions {
|
|
37
|
+
export interface MfaVerifyOptions {
|
|
81
38
|
/** User identifier (must match initiate request) */
|
|
82
|
-
|
|
83
|
-
/** Session ID from
|
|
39
|
+
userId: string;
|
|
40
|
+
/** Session ID from initiate response */
|
|
84
41
|
sessionId: string;
|
|
85
42
|
/** One-time password entered by user (6 digits) */
|
|
86
43
|
otp: string;
|
|
87
44
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
* idpEncryptionKey: process.env.IDP_ENCRYPTION_KEY!,
|
|
107
|
-
* baseUrl: 'https://example.hawcx.com',
|
|
108
|
-
* spId: 'my-client-id'
|
|
109
|
-
* });
|
|
110
|
-
*
|
|
111
|
-
* // Initiate SMS MFA setup
|
|
112
|
-
* const result = await client.initiateMfaChange({
|
|
113
|
-
* userid: "user@example.com",
|
|
114
|
-
* mfaMethod: "sms",
|
|
115
|
-
* phoneNumber: "+15551234567"
|
|
116
|
-
* });
|
|
117
|
-
* console.log(result.session_id);
|
|
118
|
-
*
|
|
119
|
-
* // Verify OTP
|
|
120
|
-
* await client.verifyMfaChange({
|
|
121
|
-
* userid: "user@example.com",
|
|
122
|
-
* sessionId: result.session_id,
|
|
123
|
-
* otp: "123456"
|
|
124
|
-
* });
|
|
125
|
-
* ```
|
|
126
|
-
*/
|
|
127
|
-
export declare class HawcxDelegationClient {
|
|
128
|
-
private client;
|
|
45
|
+
export interface DeviceOperationOptions {
|
|
46
|
+
/** User identifier (typically email address) */
|
|
47
|
+
userId: string;
|
|
48
|
+
/** Device identifier (h2index) */
|
|
49
|
+
deviceId: string;
|
|
50
|
+
}
|
|
51
|
+
export interface DelegationRequestOptions<TPayload extends JsonObject> {
|
|
52
|
+
/** API endpoint path (e.g., "/hc_auth/v5/update/initiate") */
|
|
53
|
+
endpoint: string;
|
|
54
|
+
/** Request payload dictionary to be encrypted and sent */
|
|
55
|
+
payload: TPayload;
|
|
56
|
+
/** If true, prepends base_url to endpoint (default: true) */
|
|
57
|
+
includeBaseUrl?: boolean;
|
|
58
|
+
/** Optional additional HTTP headers (e.g., API keys) */
|
|
59
|
+
headers?: Record<string, string>;
|
|
60
|
+
}
|
|
61
|
+
export declare class DelegationClient {
|
|
62
|
+
private transport;
|
|
129
63
|
private apiKey?;
|
|
130
|
-
baseUrl: string;
|
|
131
|
-
spId: string;
|
|
64
|
+
readonly baseUrl: string;
|
|
132
65
|
constructor(options: {
|
|
133
|
-
|
|
134
|
-
signer: Signer;
|
|
135
|
-
verifier: Verifier;
|
|
136
|
-
encryptor: EciesX25519Encryptor;
|
|
137
|
-
decryptor: EciesX25519Decryptor;
|
|
138
|
-
spId: string;
|
|
66
|
+
transport: DelegationTransport;
|
|
139
67
|
apiKey?: string;
|
|
140
|
-
|
|
68
|
+
baseUrl: string;
|
|
141
69
|
});
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
*
|
|
145
|
-
* This method allows the application to load keys from any source
|
|
146
|
-
* (env vars, config files, secrets manager, etc.) and pass them
|
|
147
|
-
* as values to the SDK.
|
|
148
|
-
*
|
|
149
|
-
* @param options - Configuration options
|
|
150
|
-
* @returns Configured HawcxDelegationClient instance
|
|
151
|
-
* @throws DelegationRequestError if key initialization fails
|
|
152
|
-
*
|
|
153
|
-
* @example
|
|
154
|
-
* ```typescript
|
|
155
|
-
* import * as process from 'process';
|
|
156
|
-
*
|
|
157
|
-
* // App controls how to load keys
|
|
158
|
-
* const client = HawcxDelegationClient.fromKeys({
|
|
159
|
-
* spSigningKey: process.env.MY_SIGNING_KEY!,
|
|
160
|
-
* spEncryptionKey: process.env.MY_ENCRYPTION_KEY!,
|
|
161
|
-
* idpVerifyKey: process.env.IDP_VERIFY_KEY!,
|
|
162
|
-
* idpEncryptionKey: process.env.IDP_ENCRYPT_KEY!,
|
|
163
|
-
* baseUrl: process.env.HAWCX_URL!,
|
|
164
|
-
* spId: process.env.MY_CLIENT_ID!
|
|
165
|
-
* });
|
|
166
|
-
* ```
|
|
167
|
-
*/
|
|
168
|
-
static fromKeys(options: HawcxClientFromKeysOptions): HawcxDelegationClient;
|
|
169
|
-
/**
|
|
170
|
-
* Build Hawcx API authentication headers
|
|
171
|
-
*/
|
|
70
|
+
static fromSecretKey(options: DelegationClientSecretKeyOptions): DelegationClient;
|
|
71
|
+
static fromKeys(options: DelegationClientKeyOptions): DelegationClient;
|
|
172
72
|
private buildAuthHeaders;
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
*
|
|
188
|
-
* // Email MFA (with enum - recommended!)
|
|
189
|
-
* const result = await client.initiateMfaChange({
|
|
190
|
-
* userid: "user@example.com",
|
|
191
|
-
* mfaMethod: MfaMethod.EMAIL
|
|
192
|
-
* });
|
|
193
|
-
*
|
|
194
|
-
* // SMS MFA (string also works)
|
|
195
|
-
* const result = await client.initiateMfaChange({
|
|
196
|
-
* userid: "user@example.com",
|
|
197
|
-
* mfaMethod: "sms",
|
|
198
|
-
* phoneNumber: "+15551234567"
|
|
199
|
-
* });
|
|
200
|
-
*
|
|
201
|
-
* // TOTP MFA
|
|
202
|
-
* const result = await client.initiateMfaChange({
|
|
203
|
-
* userid: "user@example.com",
|
|
204
|
-
* mfaMethod: MfaMethod.TOTP
|
|
205
|
-
* });
|
|
206
|
-
* console.log(`Scan QR code: ${result.otpauth_uri}`);
|
|
207
|
-
* ```
|
|
208
|
-
*/
|
|
209
|
-
initiateMfaChange(options: InitiateMfaChangeOptions): Promise<Record<string, any>>;
|
|
210
|
-
/**
|
|
211
|
-
* Verify OTP and complete MFA configuration change.
|
|
212
|
-
*
|
|
213
|
-
* This method verifies the OTP sent to the user and completes the MFA
|
|
214
|
-
* enrollment/update process.
|
|
215
|
-
*
|
|
216
|
-
* @param options - MFA verification configuration
|
|
217
|
-
* @returns Dictionary containing success message and optional mfa_changed_to
|
|
218
|
-
* @throws DelegationRequestError if verification fails
|
|
219
|
-
* @throws Error if OTP format is invalid
|
|
220
|
-
*
|
|
221
|
-
* @example
|
|
222
|
-
* ```typescript
|
|
223
|
-
* // Get OTP from user
|
|
224
|
-
* const otp = getUserInput();
|
|
225
|
-
*
|
|
226
|
-
* // Verify and complete MFA setup
|
|
227
|
-
* const result = await client.verifyMfaChange({
|
|
228
|
-
* userid: "user@example.com",
|
|
229
|
-
* sessionId: sessionId,
|
|
230
|
-
* otp: otp
|
|
231
|
-
* });
|
|
232
|
-
* console.log(`MFA updated: ${result.detail}`);
|
|
233
|
-
* ```
|
|
234
|
-
*/
|
|
235
|
-
verifyMfaChange(options: VerifyMfaChangeOptions): Promise<Record<string, any>>;
|
|
236
|
-
/**
|
|
237
|
-
* Get user's stored credentials and MFA status.
|
|
238
|
-
*
|
|
239
|
-
* This method retrieves the user's credentials from Hawcx, including
|
|
240
|
-
* their current MFA configuration.
|
|
241
|
-
*
|
|
242
|
-
* @param userid - User identifier
|
|
243
|
-
* @returns Dictionary containing user credentials and MFA status
|
|
244
|
-
*
|
|
245
|
-
* @example
|
|
246
|
-
* ```typescript
|
|
247
|
-
* const creds = await client.getUserCredentials("user@example.com");
|
|
248
|
-
* console.log(`MFA method: ${creds.mfa_method}`);
|
|
249
|
-
* console.log(`Phone: ${creds.contact}`);
|
|
250
|
-
* ```
|
|
251
|
-
*/
|
|
252
|
-
getUserCredentials(userid: string): Promise<Record<string, any>>;
|
|
73
|
+
request<TReq extends JsonObject, TRes extends JsonObject>(options: DelegationRequestOptions<TReq>): Promise<TRes>;
|
|
74
|
+
readonly mfa: {
|
|
75
|
+
initiate: (options: MfaInitiateOptions) => Promise<JsonObject>;
|
|
76
|
+
verify: (options: MfaVerifyOptions) => Promise<JsonObject>;
|
|
77
|
+
};
|
|
78
|
+
readonly users: {
|
|
79
|
+
getCredentials: (userId: string) => Promise<JsonObject>;
|
|
80
|
+
};
|
|
81
|
+
readonly devices: {
|
|
82
|
+
list: (userId: string) => Promise<JsonObject>;
|
|
83
|
+
revoke: (options: DeviceOperationOptions) => Promise<JsonObject>;
|
|
84
|
+
unrevoke: (options: DeviceOperationOptions) => Promise<JsonObject>;
|
|
85
|
+
delete: (options: DeviceOperationOptions) => Promise<JsonObject>;
|
|
86
|
+
};
|
|
253
87
|
}
|
|
88
|
+
export {};
|
|
254
89
|
//# sourceMappingURL=hawcx.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hawcx.d.ts","sourceRoot":"","sources":["../../src/delegation/hawcx.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"hawcx.d.ts","sourceRoot":"","sources":["../../src/delegation/hawcx.ts"],"names":[],"mappings":"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"}
|