最近はCloudflare Workersを触っている。Cloudflare Workersが動いているWorkd("わーくでぃー"って読む)ランタイムではnode.jsに依存するAPIが利用できない*1ため、一部の関数/ライブラリが使えない。
今までアクセスしたユーザーのIPアドレスを書きだすにはremix-utilsのgetClientIPAddress(request:Request)関数を利用していたが、ランタイムをnodeからworkedに移行したためremix-utilsが使えなくなり、結果として別の手段を検討する必要が出てきた。理由としては、remix-utilsがcrypt-jsモジュールに依存し、crypto-jsモジュールはnode APIを利用するためである。
実装を見ていたら結構簡単にできそうだったので、自分でサクッと書いてみた。
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を利用している
なお、個人情報の取り扱いが面倒なため、IPアドレス自体は保存はせずに復元不可能な形でハッシュした値をDBに保存している。
*1:wrangler.tomlに設定を書き足せば一部使えるが、完全ではない