はじめに
AWSのAPI GatewayがWebSocket対応しています。
この接続を認証したもののみでOpenするのにどうするか?の話です。
wscatなどでコマンドで叩かれると接続だけはできちゃったりするので、そのあたりをどう防止できるかというものです。
今回は別のシステムなりで認証後に発行されたIDがDynamoDBにあり、ブラウザ側へ送信されてるのを前提とします。
$connect時にそのIDがついてる時だけconnectionIdをDynamoDBに格納したい時にどのように出来るかの話となります。
$connect時のみGetパラメータが取れる
もう結論出てるんですが、API Gatewayで設定したものはブラウザ上でnew WebSocket()などでOpenした時に、URLについたGetパラメータがいつも通りにLambda側で取得できます。
ブラウザ側
const socket = new WebSocket("wss://xxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod?id=xyz");
Lambda側
const id = event.queryStringParameters.id;
console.log(id); // xyzと出力する
このパラメータを利用して別の認証なりでDynamoDBに保存されたIDを参照して、そのまま切断するかなどを処理できます。
例えばここにRoomIDみたいなものをつけて、その部屋があいてる時だけ繋ぐなどの方法も使えます。
ただし、このパラメータは他の$disconnectなどの他の状態の時にはついてきませんので、どこのRoomに繋いでるかなどの前提の識別には利用できません。
そのため、$connect時以外では、よくあるサンプル通りにconnectionIdをキーとしてDynamoDBから状態の情報を取得する必要があります。