TypeScript と JavaScript
パッケージ: @tenon-auth/sdk 1.0.0。
- ランタイム: Node.js 20 以降、Deno、Bun、Cloudflare Workers。
fetchを使い、依存関係はありません。ESM と CommonJS を型定義つきで提供します。 - サーバー専用: ブラウザーでは動作しません。ブラウザーでは API キーが公開されてしまうためです。
インストール
Section titled “インストール”ダウンロードからパッケージを取得し、SHA-256 を確認してインストールします:
npm install ./tenon-auth-sdk-1.0.0.tgzimport { TenonAuthClient } from '@tenon-auth/sdk';
export const tenonAuth = new TenonAuthClient({ baseUrl: process.env.TENON_AUTH_URL!, // https://api.glow-kin.com apiKey: process.env.TENON_AUTH_API_KEY!, // tnk_...});オプション:
timeoutMs(30 000)headersfetch(独自のもの。プロキシ用のエージェントなど)
キーはプライベートフィールドに保持され、console.log、util.inspect、JSON.stringify では (hidden) と表示されます。
ログイン(Express)
Section titled “ログイン(Express)”import { TenonAuthUnavailableError, type SecondStep } from '@tenon-auth/sdk';
app.post('/login', async (req, res) => { const account = await checkPassword(req.body.username, req.body.password); // あなたの処理 let step: SecondStep; try { step = await tenonAuth.beginSecondStep(account.id, { context: { ipAddress: req.ip, userAgent: req.get('user-agent') }, // req.ip には app.set('trust proxy', ...) trustedDeviceToken: req.cookies.tenon_device, }); } catch (error) { if (error instanceof TenonAuthUnavailableError) return emergencyOrRefuse(req, res, account); // フェイルクローズ throw error; } req.session.secondStep = step; // 単純なデータなので、どのセッションストアでも保存できます if (step.kind === 'CODE_ENTRY') return res.redirect('/login/code'); if (step.kind === 'PUSH_WAIT') return res.redirect('/login/approve'); if (step.kind === 'RECOVERY_ONLY') return res.redirect('/login/recover'); return signIn(req, res, account); // TRUSTED または NO_METHOD});
app.post('/login/code', async (req, res) => { const result = await tenonAuth.completeWithCode(req.session.secondStep, req.body.code); if (result.approved) return signIn(req, res); if (result.status === 'WRONG_CODE') return res.redirect(`/login/code?left=${result.attemptsRemaining}`); return res.redirect('/login'); // FAILED、EXPIRED});待機画面では2秒ごとに tenonAuth.pollApproval(step)、リカバリー画面では tenonAuth.completeWithRecoveryCode(step, code) を呼びます。
すべて TenonAuthError のサブクラスです:
TenonAuthUnavailableError(reason)ApiKeyRejectedError、ForbiddenErrorInvalidRequestError、NotFoundError、InvalidCodeErrorFactorLockedError、TooManyRequestsErrorEmailRefusedError、EmailUnavailableErrorConflictError
エラーを参照してください。