@elcrm/passkey
v0.2.3
Published
Passkey клиент для elCRM: createPasskeyClient (register/login/discoverable). Сервер: @elcrm/server/passkey.
Readme
@elcrm/passkey
Клиентская библиотека WebAuthn Passkey для elCRM: createPasskeyClient — полный цикл register / login / discoverable.
Серверный runtime: @elcrm/server/passkey.
Установка
bun add @elcrm/passkey
bun add @elcrm/serverИспользование
import { createPasskeyClient } from "@elcrm/passkey";
const passkey = createPasskeyClient({ baseUrl: "https://api.example.com" });
await passkey.register({ userId: "u-1", username: "[email protected]" });
await passkey.login({ userId: "u-1" });
const session = await passkey.loginDiscoverable();
await passkey.remove({
userId: session.userId,
credentialId: session.credentialId,
});Клиент выполняет options → WebAuthn → verify для путей:
| Метод | HTTP |
| ------------------- | ------------------------------------------------------------------------- |
| register | /passkey/register/options, /passkey/register/verify |
| login | /passkey/auth/options, /passkey/auth/verify |
| loginDiscoverable | /passkey/auth/discoverable/options, /passkey/auth/discoverable/verify |
| remove | /passkey/remove |
Переопределение: paths, headers, fetch.
React
import { createPasskeyClient } from "@elcrm/passkey";
import { usePasskeyClient, usePasskeySupport } from "@elcrm/passkey/react";
const client = createPasskeyClient({ baseUrl: "/api" });
function LoginButton() {
const { data: support } = usePasskeySupport();
const { loginDiscoverable } = usePasskeyClient(client);
return (
<button
disabled={!support?.supported || loginDiscoverable.status === "loading"}
onClick={() => void loginDiscoverable.run()}
>
Войти с Passkey
</button>
);
}Ядро @elcrm/passkey без React (~2.5 KB gzip). Хуки — отдельный entry @elcrm/passkey/react.
Ошибки
PasskeyError с полем code.
