コンテンツにスキップ

TypeScript と JavaScript

パッケージ: @tenon-auth/sdk 1.0.0。

  • ランタイム: Node.js 20 以降、Deno、Bun、Cloudflare Workers。fetch を使い、依存関係はありません。ESM と CommonJS を型定義つきで提供します。
  • サーバー専用: ブラウザーでは動作しません。ブラウザーでは API キーが公開されてしまうためです。

ダウンロードからパッケージを取得し、SHA-256 を確認してインストールします:

ターミナルウィンドウ
npm install ./tenon-auth-sdk-1.0.0.tgz
import { 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)
  • headers
  • fetch(独自のもの。プロキシ用のエージェントなど)

キーはプライベートフィールドに保持され、console.log、util.inspect、JSON.stringify では (hidden) と表示されます。

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、ForbiddenError
  • InvalidRequestError、NotFoundError、InvalidCodeError
  • FactorLockedError、TooManyRequestsError
  • EmailRefusedError、EmailUnavailableError
  • ConflictError

エラーを参照してください。