最近は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に設定を書き足せば一部使えるが、完全ではない