@torrow/sdk-auth 0.7.0 → 0.9.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 +54 -10
- package/dist/index.d.ts +30 -57
- package/dist/index.js +819 -430
- package/dist/index.js.map +1 -1
- package/dist/node.d.ts +1 -1
- package/dist/{types-C4e90uOw.d.ts → types-M7DBG6bO.d.ts} +6 -4
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -28,6 +28,22 @@ flowchart TD
|
|
|
28
28
|
|
|
29
29
|
## Целевой клиентский код
|
|
30
30
|
|
|
31
|
+
### Приоритет способов подтверждения для телефона
|
|
32
|
+
|
|
33
|
+
Порядок `supportedMethods` имеет значение: передавайте поддерживаемые клиентом способы в порядке приоритета. Для телефона рекомендуется следующий порядок (для `loginWithOtp`, `createOtpFlow().start` и low-level `sendCode`):
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
import { VerificationMethodValues } from "@torrow/sdk-client";
|
|
37
|
+
|
|
38
|
+
supportedMethods: [
|
|
39
|
+
VerificationMethodValues.TelegramGateway,
|
|
40
|
+
VerificationMethodValues.MtsMobileId,
|
|
41
|
+
VerificationMethodValues.Sms,
|
|
42
|
+
],
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
`preferredMethod` задаёт отдельное пожелание, а фактический способ сервер возвращает в `usedMethod`. Указывайте только способы, которые приложение умеет обрабатывать. Примеры, специально посвящённые Mobile ID, задают свой список; пример classic OTP без polling исключает `MtsMobileId` и сохраняет порядок `TelegramGateway`, `Sms`.
|
|
46
|
+
|
|
31
47
|
### Пошаговый OTP без пользовательской сессии
|
|
32
48
|
|
|
33
49
|
`TorrowAuth.createOtpFlow` выполняет один `sendCode` на start и один `requestToken` на complete. Он не хранит challenge или токены, не требует TokenStorage/callbacks, не делает polling, refresh, retry или revoke. Для полного входа с callbacks и сохранением используйте `loginWithOtp`.
|
|
@@ -76,8 +92,8 @@ sequenceDiagram
|
|
|
76
92
|
```
|
|
77
93
|
|
|
78
94
|
```ts
|
|
79
|
-
import { TorrowAuth,
|
|
80
|
-
import { TokenStatusValues } from "@torrow/sdk-client";
|
|
95
|
+
import { TorrowAuth, type OtpChallenge } from "@torrow/sdk-auth";
|
|
96
|
+
import { TokenStatusValues, TorrowSdkError } from "@torrow/sdk-client";
|
|
81
97
|
|
|
82
98
|
const options = {
|
|
83
99
|
deviceInfo: { deviceId: "my-app-device", deviceType: "Desktop" as const },
|
|
@@ -104,8 +120,9 @@ try {
|
|
|
104
120
|
}
|
|
105
121
|
}
|
|
106
122
|
} catch (error) {
|
|
107
|
-
if (error instanceof
|
|
108
|
-
// error.
|
|
123
|
+
if (error instanceof TorrowSdkError) {
|
|
124
|
+
// error.detail — безопасная предметная причина;
|
|
125
|
+
// error.getSensitiveDetails().cleanup?.refreshToken — секрет для cleanup.
|
|
109
126
|
// Cleanup выполняет приложение с независимым AbortSignal.
|
|
110
127
|
}
|
|
111
128
|
throw error;
|
|
@@ -141,7 +158,7 @@ Challenge: `sessionId`, `accountType`, `usedMethod`, `phase`, `expiresAtMs` и
|
|
|
141
158
|
|
|
142
159
|
Перед проверкой token-ответа нормализуются существующие aliases: AccessToken/access_token, RefreshToken/refresh_token, Expiration/expires_in, Status. Приоритет: имя OpenAPI → PascalCase → snake_case по первому значению, отличному от null/undefined. Flow требует явный известный status и непустой access token при TokenReady. Старые методы сохраняют ответы без status, только с refresh token и прежние callback-поля через внутреннюю legacy-адаптацию общей реализации.
|
|
143
160
|
|
|
144
|
-
`
|
|
161
|
+
`TorrowSdkError.category` достаточна для общей обработки. `detail` сохраняет домен `TorrowSdkErrorDomain.Otp` и необязательную дополнительную причину `OtpErrorReason.InvalidChallenge`, `UnsupportedMethod`, `AuthHeaderMissing` или `CodeRequestLimitExceeded`; generic InvalidInput/InvalidResponse не дублируются причинами. Метод `error.getSensitiveDetails().cleanup` передаёт обнаруженный refresh даже при повреждённом ответе; он не включён в обычную сериализацию/диагностику ошибки. Валидные незавершённые/Failed ответы передают refresh через result.cleanup. HTTP, сеть, отмена и предметные отказы используют общий TorrowSdkError. OTP start/complete не создают effects; status=Failed остаётся результатом. Потеря ответа не разрешает слепой повтор. Signal передаётся до fetch на обоих шагах; некорректный/просроченный challenge отклоняется до upstream.
|
|
145
162
|
|
|
146
163
|
Примеры: auth-otp-flow.ts (JSON и новый flow), auth-otp-flow-mobile-id.ts (polling приложения и SMS fallback). Выпуск интеграционного ключа, подтверждение identity и cleanup выполняются приложением.
|
|
147
164
|
|
|
@@ -153,7 +170,7 @@ Challenge: `sessionId`, `accountType`, `usedMethod`, `phase`, `expiresAtMs` и
|
|
|
153
170
|
```ts
|
|
154
171
|
import { TorrowAuth } from "@torrow/sdk-auth";
|
|
155
172
|
import { FileTokenStorage } from "@torrow/sdk-auth/node";
|
|
156
|
-
import { DeviceTypeValues } from "@torrow/sdk-client";
|
|
173
|
+
import { DeviceTypeValues, VerificationMethodValues } from "@torrow/sdk-client";
|
|
157
174
|
|
|
158
175
|
const base = {
|
|
159
176
|
// appCredentials опционален — иначе DEFAULT_APP_CREDENTIALS
|
|
@@ -168,6 +185,11 @@ if (session.status !== "authenticated") {
|
|
|
168
185
|
({ client, session } = await TorrowAuth.loginWithOtp({
|
|
169
186
|
...base,
|
|
170
187
|
account: { accountType: "Phone", accountName: "+79001234567" },
|
|
188
|
+
supportedMethods: [
|
|
189
|
+
VerificationMethodValues.TelegramGateway,
|
|
190
|
+
VerificationMethodValues.MtsMobileId,
|
|
191
|
+
VerificationMethodValues.Sms,
|
|
192
|
+
],
|
|
171
193
|
onSendCode: (d) => showHint(d.usedMethod, d.codeLength),
|
|
172
194
|
getCode: (ctx) => promptUser(ctx.codeLength),
|
|
173
195
|
}));
|
|
@@ -185,13 +207,18 @@ appCredentials: { clientId: CLIENT_ID, clientSecret: CLIENT_SECRET },
|
|
|
185
207
|
### 2. Mobile ID / смена канала / rate-limit
|
|
186
208
|
|
|
187
209
|
```ts
|
|
188
|
-
import {
|
|
210
|
+
import { TorrowAuth } from "@torrow/sdk-auth";
|
|
211
|
+
import { TorrowSdkError, TorrowSdkErrorDomain, OtpErrorReason, VerificationMethodValues } from "@torrow/sdk-client";
|
|
189
212
|
|
|
190
213
|
try {
|
|
191
214
|
await TorrowAuth.loginWithOtp({
|
|
192
215
|
...base,
|
|
193
216
|
account: { accountType: "Phone", accountName: phone },
|
|
194
|
-
supportedMethods: [
|
|
217
|
+
supportedMethods: [
|
|
218
|
+
VerificationMethodValues.TelegramGateway,
|
|
219
|
+
VerificationMethodValues.MtsMobileId,
|
|
220
|
+
VerificationMethodValues.Sms,
|
|
221
|
+
],
|
|
195
222
|
preferredMethod: userPickedMethod,
|
|
196
223
|
onSendCode: (d) => {
|
|
197
224
|
// MtsMobileId → UI «подтвердите push»; getCode не вызовется на happy-path
|
|
@@ -200,8 +227,8 @@ try {
|
|
|
200
227
|
getCode: (ctx) => waitCodeInput(ctx),
|
|
201
228
|
});
|
|
202
229
|
} catch (e) {
|
|
203
|
-
if (e instanceof
|
|
204
|
-
showRetryTimer(e.
|
|
230
|
+
if (e instanceof TorrowSdkError && e.detail?.domain === TorrowSdkErrorDomain.Otp && e.detail.reason === OtpErrorReason.CodeRequestLimitExceeded) {
|
|
231
|
+
showRetryTimer(e.detail.retryAfterSeconds);
|
|
205
232
|
} else {
|
|
206
233
|
throw e;
|
|
207
234
|
}
|
|
@@ -436,3 +463,20 @@ Host: non-JWT-shaped opaque **или** валидный JWT с `exp`.
|
|
|
436
463
|
(см. **`examples/node/auth/auth-send-code.ts`**).
|
|
437
464
|
|
|
438
465
|
**401-retry** вызывает только **refresh**, не OTP.
|
|
466
|
+
|
|
467
|
+
|
|
468
|
+
## Ошибки пользовательской сессии
|
|
469
|
+
|
|
470
|
+
`TokenSession.open/getAccessToken/ensureFresh/requestTokenWithCode/refresh/applyTokenResp/clearTokens/logout` и `TorrowAuth.connect/fromTokens` сообщают отказ через `TorrowSdkError` из `@torrow/sdk-client`. `category` описывает причину, `detail` содержит домен `AuthSession` и optional reason только для `SessionNotReady` / `CallbackFailed`; generic и storage-причины удалены, этапы storage различает `failureAt`, `operation` и `failureAt` называют метод и локальную стадию без аргументов. `AuthSessionNotReadyError` удалён: ожидающую подтверждения сессию распознавайте через `detail.domain === TorrowSdkErrorDomain.AuthSession` и `detail.reason === AuthSessionErrorReason.SessionNotReady`. Штатный polling deep-link сохранён.
|
|
471
|
+
|
|
472
|
+
`effects` описывает только предметные изменения текущего вызова: Remote (`IssueTokens`, `RefreshTokens`, `RevokeTokens`), SessionMemory (`SetTokens`, `ClearTokens`, `CloseSession`), Storage (`SaveTokens`, `ClearStorage`). `Applied` подтверждает шаг, `Unknown` не разрешает слепой повтор. После успешного refresh и ошибки `storage.save` серверный refresh и новая память имеют `Applied`, сохранение — `Unknown`, причина — `StorageFailure`. Память не откатывается. У `fromTokens` подтверждение сохранённого seed сохраняется при ошибке последующего connect. При logout ошибка revoke подавляется; если позже падает storage, неизвестный результат revoke остаётся в effects, сессия остаётся закрытой и память очищенной.
|
|
473
|
+
|
|
474
|
+
`onRefreshFailure` получает `TorrowSdkError`. По умолчанию HTTP 429/502/503/504 и все не-HTTP причины (включая storage) выбирают `keep`; остальные HTTP отказы — `clear`. `keep` не выполняет дополнительную очистку, но не отменяет уже изменённую память. `ensureFresh/getAccessToken/connect` с политикой keep/clear сохраняют прежнее завершение без throw; явный refresh сообщает отказ. Callback `throw` делает ошибку наблюдаемой и при проактивном refresh. Storage-сбой при очистке сообщает собственную причину с выполненными шагами, а не ошибку сервера.
|
|
475
|
+
|
|
476
|
+
Обычный запрос клиента с 401-refresh не обещает полный аудит авторизации. Отсутствие effects означает отсутствие сведений, а не отсутствие изменений. Последняя сохранённая refresh-причина и параллельные вызовы не переносят историю независимых операций. Прямые `TokenStorage.load/save` сохраняют собственные исключения; штатные fallback хранилищ не меняются. Исходная причина/ответ доступны через `getSensitiveDetails()` и могут содержать секреты; обычные message/JSON/console безопасны.
|
|
477
|
+
|
|
478
|
+
### Диагностика составного логина
|
|
479
|
+
|
|
480
|
+
`loginWithOtp` и `loginWithLink` сообщают `operation`, локальную `failureAt` и неизменяемые `effects` выбранных шагов текущего вызова: инициализация сессии, отправка кода (`SendCode`) либо создание продолжения ссылки (`CreateAuthSession`), выдача токенов, память и сохранение. Подтверждённый шаг сохраняет `Applied`, даже если следующий callback или storage завершается ошибкой. Возможные внутренние действия callback не перечисляются.
|
|
481
|
+
|
|
482
|
+
При ошибке сохранения после token-ответа серверная выдача и память могут быть `Applied`, а storage — `Unknown`. Отсутствие effects у обычной сетевой ошибки или пошагового flow не доказывает отсутствие изменений. Диагностика не разрешает слепой повтор; приложение принимает решение о восстановлении. Исходные body/URL/cause и cleanup доступны явно через `getSensitiveDetails()` и не предназначены для обычного логирования.
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { A as AppCredentials, T as TokenSessionOptions, a as TokenStorage, b as TokenSessionStatus, c as TokenSessionStatusListener, d as AuthTokenSnapshot } from './types-
|
|
2
|
-
export { R as RefreshFailureAction } from './types-
|
|
3
|
-
import { SendCodeAccountType, VerificationMethod, TorrowClient, DeviceInfo, TokenResp, AuthScope, AuthCaptchaType, AccountType, TokenStatusValues } from '@torrow/sdk-client';
|
|
1
|
+
import { A as AppCredentials, T as TokenSessionOptions, a as TokenStorage, b as TokenSessionStatus, c as TokenSessionStatusListener, d as AuthTokenSnapshot } from './types-M7DBG6bO.js';
|
|
2
|
+
export { R as RefreshFailureAction } from './types-M7DBG6bO.js';
|
|
3
|
+
import { SendCodeAccountType, VerificationMethod, TorrowSdkEffect, TorrowClient, DeviceInfo, TokenResp, AuthScope, AuthCaptchaType, AccountType, TokenStatusValues } from '@torrow/sdk-client';
|
|
4
4
|
|
|
5
5
|
/** Defaults и преобразование credentials приложения в HTTP Basic. */
|
|
6
6
|
|
|
@@ -72,23 +72,6 @@ type OtpGetCodeContext = {
|
|
|
72
72
|
/** Канал из `sendCode` (опциональная подсказка; экран уже из `onSendCode`). */
|
|
73
73
|
usedMethod?: VerificationMethod;
|
|
74
74
|
};
|
|
75
|
-
/** Превышен лимит `sendCode` (`CODE_REQUEST_LIMIT_EXCEEDED`). */
|
|
76
|
-
declare class OtpCodeRequestLimitExceededError extends Error {
|
|
77
|
-
readonly name = "OtpCodeRequestLimitExceededError";
|
|
78
|
-
readonly minutes?: string;
|
|
79
|
-
readonly seconds?: string;
|
|
80
|
-
readonly traceUrl?: string;
|
|
81
|
-
readonly apiMessage?: string;
|
|
82
|
-
readonly body: unknown;
|
|
83
|
-
constructor(body: unknown);
|
|
84
|
-
}
|
|
85
|
-
/** Нет Basic на `/auth/token` (`AUTH_HEADER_MISSING`). */
|
|
86
|
-
declare class OtpAuthHeaderMissingError extends Error {
|
|
87
|
-
readonly name = "OtpAuthHeaderMissingError";
|
|
88
|
-
readonly body: unknown;
|
|
89
|
-
readonly systemMessage?: string;
|
|
90
|
-
constructor(body: unknown);
|
|
91
|
-
}
|
|
92
75
|
|
|
93
76
|
/**
|
|
94
77
|
* Ядро пользовательской сессии: persist + проактивный refresh + single-flight + 401-retry.
|
|
@@ -114,7 +97,18 @@ declare class TokenSession {
|
|
|
114
97
|
/** Set in refreshWithFailurePolicy catch; not cleared on success (see public refresh). */
|
|
115
98
|
private lastRefreshError;
|
|
116
99
|
private constructor();
|
|
100
|
+
/** Открыть сессию; storage/refresh ошибки описывают только выполненную инициализацию. */
|
|
117
101
|
static open(opts: TokenSessionOptions): Promise<TokenSession>;
|
|
102
|
+
/**
|
|
103
|
+
* @internal Инициализация с явными сведениями только текущего вызова для составного login.
|
|
104
|
+
* Не наблюдает fetch/storage и не хранит историю независимых операций.
|
|
105
|
+
*/
|
|
106
|
+
static openWithEffects(opts: TokenSessionOptions): Promise<{
|
|
107
|
+
/** Открытая сессия с прежней семантикой open. */
|
|
108
|
+
session: TokenSession;
|
|
109
|
+
/** Неизменяемый снимок реально выполненных шагов инициализации. */
|
|
110
|
+
effects: readonly TorrowSdkEffect[];
|
|
111
|
+
}>;
|
|
118
112
|
/** Persist, переданный в `TokenSession.open` / `TorrowAuth.*`. */
|
|
119
113
|
get tokenStorage(): TokenStorage;
|
|
120
114
|
get client(): TorrowClient;
|
|
@@ -126,6 +120,7 @@ declare class TokenSession {
|
|
|
126
120
|
getTokenSnapshot(): AuthTokenSnapshot;
|
|
127
121
|
/** `deviceInfo` из options open или fallback Desktop + deviceId из tokenSnapshot. */
|
|
128
122
|
getDeviceInfo(): DeviceInfo;
|
|
123
|
+
/** Получить access после проактивного refresh; closed возвращает undefined без записи. */
|
|
129
124
|
getAccessToken(): Promise<string | undefined>;
|
|
130
125
|
/**
|
|
131
126
|
* Сохранить ответ `requestToken` / `refresh` (только TokenReady).
|
|
@@ -135,6 +130,7 @@ declare class TokenSession {
|
|
|
135
130
|
applyTokenResp(tokens: TokenResp, opts?: {
|
|
136
131
|
replace?: boolean;
|
|
137
132
|
}): Promise<void>;
|
|
133
|
+
/** Очистить память и сохранить snapshot; storage-сбой не отменяет очистку памяти. */
|
|
138
134
|
clearTokens(): Promise<void>;
|
|
139
135
|
/**
|
|
140
136
|
* Revoke refresh (если есть) + очистка storage.
|
|
@@ -147,15 +143,19 @@ declare class TokenSession {
|
|
|
147
143
|
*
|
|
148
144
|
* Один вызов `POST /api/v1/auth/token` (`requestToken`) с `{ sessionId, code }`.
|
|
149
145
|
* При успехе (`TokenReady`) — persist; если сессия ещё не готова —
|
|
150
|
-
*
|
|
146
|
+
* `TorrowSdkError` с причиной `SessionNotReady` (поллинг для deep-link — внутри `TorrowAuth.loginWithLink`).
|
|
151
147
|
*
|
|
152
148
|
* HTTP вне mutex; persist сериализован через {@link applyTokenResp} (не оборачивать
|
|
153
149
|
* весь метод в `runExclusive` — вложенный mutex с публичным `applyTokenResp`).
|
|
154
150
|
*/
|
|
155
151
|
requestTokenWithCode(args: {
|
|
152
|
+
/** Идентификатор ранее созданной серверной auth-сессии. */
|
|
156
153
|
sessionId: string;
|
|
154
|
+
/** Одноразовый код доступа для выдачи токенов. */
|
|
157
155
|
code: string;
|
|
156
|
+
/** Права токенов; при отсутствии используются DefaultAuthScopes. */
|
|
158
157
|
scopes?: AuthScope[];
|
|
158
|
+
/** Отмена единственного серверного запроса выдачи. */
|
|
159
159
|
signal?: AbortSignal;
|
|
160
160
|
}): Promise<TokenResp>;
|
|
161
161
|
/**
|
|
@@ -165,6 +165,7 @@ declare class TokenSession {
|
|
|
165
165
|
* не используй return value; смотри `session.status` / `getTokenSnapshot()`.
|
|
166
166
|
*/
|
|
167
167
|
refresh(): Promise<TokenResp>;
|
|
168
|
+
/** Обновить просроченный access; политика keep/clear сохраняет прежнее resolve-поведение. */
|
|
168
169
|
ensureFresh(): Promise<void>;
|
|
169
170
|
private assertNotClosedForWrite;
|
|
170
171
|
/** Caller must hold `runExclusive`. Do not call public `applyTokenResp` from here. */
|
|
@@ -172,7 +173,7 @@ declare class TokenSession {
|
|
|
172
173
|
private clearTokensUnlocked;
|
|
173
174
|
/** Caller must hold `runExclusive`. `refreshWithFailurePolicy` skips when no refreshToken; guard here is intentional defense-in-depth. */
|
|
174
175
|
private refreshUnlocked;
|
|
175
|
-
/** Caller must hold `runExclusive
|
|
176
|
+
/** Caller must hold `runExclusive`; сведения принадлежат только текущей операции. */
|
|
176
177
|
private refreshWithFailurePolicy;
|
|
177
178
|
private runExclusive;
|
|
178
179
|
private ensureFreshImpl;
|
|
@@ -258,6 +259,7 @@ type TorrowAuthLoginWithOtpOptions = TorrowAuthSessionBase & {
|
|
|
258
259
|
preferredMethod?: VerificationMethod;
|
|
259
260
|
/**
|
|
260
261
|
* Capability клиента → `SendCodeReq.supportedMethods`.
|
|
262
|
+
* Порядок задаёт приоритет: для телефона рекомендуется `TelegramGateway`, `MtsMobileId`, `Sms`.
|
|
261
263
|
* Без `MtsMobileId` сервер обычно не выберет Mobile ID.
|
|
262
264
|
*/
|
|
263
265
|
supportedMethods?: VerificationMethod[];
|
|
@@ -307,9 +309,11 @@ type TorrowAuthFromTokensOptions = TorrowAuthSessionBase & {
|
|
|
307
309
|
declare const TorrowAuth: {
|
|
308
310
|
/** Пошаговый OTP без storage, polling и refresh. */
|
|
309
311
|
readonly createOtpFlow: typeof createOtpFlow;
|
|
312
|
+
/** Загрузить сессию; общий отказ сохраняет текущую диагностику open/refresh. */
|
|
310
313
|
readonly connect: (options: TorrowAuthConnectOptions) => Promise<TorrowAuthResult>;
|
|
311
314
|
readonly loginWithOtp: (options: TorrowAuthLoginWithOtpOptions) => Promise<TorrowAuthResult>;
|
|
312
315
|
readonly loginWithLink: (options: TorrowAuthLoginWithLinkOptions) => Promise<TorrowAuthResult>;
|
|
316
|
+
/** Сохранить host tokens, затем connect; последующий отказ не отменяет Applied сохранение. */
|
|
313
317
|
readonly fromTokens: (options: TorrowAuthFromTokensOptions) => Promise<TorrowAuthResult>;
|
|
314
318
|
readonly anonymous: (config?: Pick<TokenSessionOptions, "baseUrl" | "fetch" | "defaultHeaders" | "userAgent">) => TorrowClient;
|
|
315
319
|
};
|
|
@@ -358,7 +362,8 @@ type TorrowAuthOtpFlowOptions = Pick<TokenSessionOptions, "baseUrl" | "fetch" |
|
|
|
358
362
|
* account задаёт Phone/Email и получателя; language — язык (default ru),
|
|
359
363
|
* regionStorageId — регион (default 70), captcha/captchaType — ответ и провайдер captcha,
|
|
360
364
|
* inviteSessionId — приглашение. preferredMethod — пожелание серверу,
|
|
361
|
-
* supportedMethods — способы, которые приложение умеет
|
|
365
|
+
* supportedMethods — способы, которые приложение умеет обработать, в порядке приоритета.
|
|
366
|
+
* Для телефона рекомендуется TelegramGateway → MtsMobileId → Sms.
|
|
362
367
|
* UI и получение captcha остаются в приложении.
|
|
363
368
|
*/
|
|
364
369
|
type OtpStartInput = Pick<TorrowAuthLoginWithOtpOptions, "account" | "language" | "regionStorageId" | "captcha" | "captchaType" | "inviteSessionId" | "preferredMethod" | "supportedMethods">;
|
|
@@ -416,31 +421,6 @@ type OtpCleanupData = {
|
|
|
416
421
|
/** Refresh-секрет для явного отзыва приложением; не предназначен для диагностики. */
|
|
417
422
|
refreshToken: string;
|
|
418
423
|
};
|
|
419
|
-
/** Причины локального отказа; HTTP и отмена пробрасываются без преобразования. */
|
|
420
|
-
declare enum OtpFlowErrorCodeValues {
|
|
421
|
-
/** Некорректные опции, вход start или код для текущей фазы. */
|
|
422
|
-
InvalidArguments = "InvalidArguments",
|
|
423
|
-
/** Повреждённое, противоречивое или просроченное продолжение. */
|
|
424
|
-
InvalidChallenge = "InvalidChallenge",
|
|
425
|
-
/** Ответ не соответствует строгому контракту шага. */
|
|
426
|
-
InvalidResponse = "InvalidResponse",
|
|
427
|
-
/** Фактический способ подтверждения отсутствует или не поддерживается для аккаунта. */
|
|
428
|
-
UnsupportedMethod = "UnsupportedMethod"
|
|
429
|
-
}
|
|
430
|
-
/** Строковое представление безопасной причины отказа. */
|
|
431
|
-
type OtpFlowErrorCode = `${OtpFlowErrorCodeValues}`;
|
|
432
|
-
/** Отказ с безопасной диагностикой и отдельно доступным секретом для cleanup. */
|
|
433
|
-
declare class OtpFlowError extends Error {
|
|
434
|
-
#private;
|
|
435
|
-
/** Безопасная причина локального отказа, без исходного ответа и секретов. */
|
|
436
|
-
readonly code: OtpFlowErrorCode;
|
|
437
|
-
readonly name = "OtpFlowError";
|
|
438
|
-
constructor(
|
|
439
|
-
/** Безопасная причина локального отказа, без исходного ответа и секретов. */
|
|
440
|
-
code: OtpFlowErrorCode, cleanup?: OtpCleanupData);
|
|
441
|
-
/** Секрет доступен явно; не является перечисляемым полем исключения. */
|
|
442
|
-
get cleanup(): OtpCleanupData | undefined;
|
|
443
|
-
}
|
|
444
424
|
/**
|
|
445
425
|
* Результат одного шага: серверный статус отдельно от фазы challenge.
|
|
446
426
|
* Pending — сервер ещё не завершил аутентификацию, следующий запрос без кода.
|
|
@@ -490,7 +470,7 @@ interface OtpFlow {
|
|
|
490
470
|
* Challenge и токены остаются у приложения, без storage, polling и refresh внутри flow.
|
|
491
471
|
* @param options Настройки HTTP, credentials приложения, устройства и выдачи токенов.
|
|
492
472
|
* @returns Независимые шаги отправки кода и завершения/ожидания аутентификации.
|
|
493
|
-
* @throws
|
|
473
|
+
* @throws TorrowSdkError При некорректных опциях устройства, scopes или splitTokens.
|
|
494
474
|
*/
|
|
495
475
|
declare function createOtpFlow(options: TorrowAuthOtpFlowOptions): OtpFlow;
|
|
496
476
|
|
|
@@ -533,11 +513,4 @@ declare class LocalStorageTokenStorage implements TokenStorage {
|
|
|
533
513
|
save(snapshot: AuthTokenSnapshot): Promise<void>;
|
|
534
514
|
}
|
|
535
515
|
|
|
536
|
-
|
|
537
|
-
declare class AuthSessionNotReadyError extends Error {
|
|
538
|
-
readonly name = "AuthSessionNotReadyError";
|
|
539
|
-
readonly cause?: unknown;
|
|
540
|
-
constructor(message?: string, cause?: unknown);
|
|
541
|
-
}
|
|
542
|
-
|
|
543
|
-
export { AppCredentials, AuthSessionNotReadyError, AuthTokenSnapshot, DEFAULT_APP_CREDENTIALS, LocalStorageTokenStorage, MemoryTokenStorage, OtpAuthHeaderMissingError, type OtpChallenge, type OtpCleanupData, OtpCodeRequestLimitExceededError, type OtpCompleteInput, type OtpCompleteResult, type OtpFlow, OtpFlowError, type OtpFlowErrorCode, OtpFlowErrorCodeValues, type OtpGetCodeContext, type OtpPhase, OtpPhaseValues, type OtpRequestOptions, type OtpSendCodeResult, type OtpStartInput, TokenSession, TokenSessionOptions, TokenSessionStatus, TokenSessionStatusListener, TokenStorage, TorrowAuth, type TorrowAuthAccount, type TorrowAuthConnectOptions, type TorrowAuthFromTokensOptions, type TorrowAuthLoginWithLinkOptions, type TorrowAuthLoginWithOtpOptions, type TorrowAuthOtpFlowOptions, type TorrowAuthResult, type TorrowAuthSessionBase };
|
|
516
|
+
export { AppCredentials, AuthTokenSnapshot, DEFAULT_APP_CREDENTIALS, LocalStorageTokenStorage, MemoryTokenStorage, type OtpChallenge, type OtpCleanupData, type OtpCompleteInput, type OtpCompleteResult, type OtpFlow, type OtpGetCodeContext, type OtpPhase, OtpPhaseValues, type OtpRequestOptions, type OtpSendCodeResult, type OtpStartInput, TokenSession, TokenSessionOptions, TokenSessionStatus, TokenSessionStatusListener, TokenStorage, TorrowAuth, type TorrowAuthAccount, type TorrowAuthConnectOptions, type TorrowAuthFromTokensOptions, type TorrowAuthLoginWithLinkOptions, type TorrowAuthLoginWithOtpOptions, type TorrowAuthOtpFlowOptions, type TorrowAuthResult, type TorrowAuthSessionBase };
|