現実モデリング

データとかエンジニアリングとか健エミュとか

RemixでRequestオブジェクトからクライアントのIPアドレスを抜き出すだけの関数

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

github.com

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

remix.run

nodejs.org

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

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を利用している

    developer.mozilla.org

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

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