最近はCloudflare Workersを触っている。Cloudflare Workersが動いているWorkd(“わーくでぃー”って読む)ランタイムではnode.jsに依存するAPIが利用できない1ため、一部の関数/ライブラリが使えない。

cloudflare/workerd - GitHub

今までアクセスしたユーザーのIPアドレスを書きだすにはremix-utilsのgetClientIPAddress(request:Request)関数を利用していたが、ランタイムをnodeからworkedに移行したためremix-utilsが使えなくなり、結果として別の手段を検討する必要が出てきた。理由としては、remix-utilsがcrypt-jsモジュールに依存し、crypto-jsモジュールはnode APIを利用するためである。

Remix Utils | Remix Resources

Crypto - Node.js API Docs

実装を見ていたら結構簡単にできそうだったので、自分でサクッと書いてみた。

export async function getClientIPAddress(request:Request) {
    const headers = request.headers;
    const ipAddress = headers.get("X-Forwarded-For");
    return ipAddress;
}
import { getClientIPAddress } from '~/modules/session.server';
 
export async function action({ request } : ActionFunctionArgs) {
  const clientIPAddress = getClientIPAddress(request); 
  // 以下略
}
  • IPアドレスの取得にはX-Forwarded-Forを利用している

    X-Forwarded-For - HTTP | MDN

  • なお、個人情報の取り扱いが面倒なため、IPアドレス自体は保存はせずに復元不可能な形でハッシュした値をDBに保存している。

Footnotes

  1. wrangler.tomlに設定を書き足せば一部使えるが、完全ではない