LoginSignup
4
2

More than 3 years have passed since last update.

APIGatewayでWebSocketを利用した場合のOpen時の認証処理

Last updated at Posted at 2020-04-20

はじめに

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から状態の情報を取得する必要があります。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2