Node.js+TypeScript でも Python の secrets.token_urlsafe を使いたい
Python のは secrets モジュール という CSPRNG を手軽に扱えるモジュールがある。
特に secrets.token_urlsafe が便利で、簡単に URL セーフなトークンが作れる。
URL セーフなのがポイントで Base64URL でエンコードされるので URL に埋め込みやすくて便利である。
使い方はこんな感じ。
import secrets
token = secrets.token_urlsafe(32)
Node.js でも手軽にトークン生成できないかなと思うけど crypto.randomBytes は OpenSSL の API 丸出しでなかなか大変。
それなら Python の secrets.token_urlsafe と同等の関数作っちまえ。
ということでこんな感じに TypeScript で実装してみた。
// secrets.ts
import { randomBytes } from "node:crypto";
export const tokenUrlSafe = (bytes: number): string => {
return randomBytes(bytes).toString("base64url");
}
使い方はこんな感じで。
import { tokenUrlSafe } from "./secrets.ts";
try {
const token = tokenUrlSafe(32);
} catch(err) {
// エラー処理
}
なにかとサーバ側ではトークン生成が発生するので、重宝している。
ただ実装が同期処理なのであまり長いトークンを作るとブロックされちゃう。
そんなときには crypto.randomBytes を非同期で呼び出すようにする必要があるのに注意。
UUIDv4 じゃダメなの? と言われそうだけど UUID だと 128 ビットなので、ちょっと今どきのセキュリティ感覚だと短いんだよね。
できれば 256 ビット以上は欲しいところ。