Open3
supabaseにユーザーテーブルとかを作る
-- users テーブルの作成
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- user_preferences テーブルの作成
CREATE TABLE user_preferences (
user_id INT REFERENCES users (id),
account_number INT,
trade_history_visibility BOOLEAN,
current_positions_visibility BOOLEAN,
lot_sizes_visibility BOOLEAN,
detailed_stats_visibility BOOLEAN,
positions_count_visibility BOOLEAN,
profit_loss_visibility BOOLEAN,
balance_visibility BOOLEAN,
PRIMARY KEY (user_id, account_number)
);
-- magic_number_preferences テーブルの作成
CREATE TABLE magic_number_preferences (
user_id INT REFERENCES users (id),
account_number INT,
magic_number INT,
visibility BOOLEAN,
comment TEXT,
PRIMARY KEY (user_id, account_number, magic_number)
);
JWTを使用したユーザー認証と初回アクセス時の自動ユーザー登録
概要
この記事では、JWT (JSON Web Tokens) を使用してユーザー認証を行い、初回アクセス時にデータベースにユーザーレコードが存在しない場合に自動的に新規作成する方法について説明します。これにより、外部サービスとの連携をシンプルに保ちながら、効率的にユーザー管理を行うことができます。
ユーザー認証のフロー
1. ユーザー認証
ユーザーがログインすると、認証サーバーからJWTが発行されます。このトークンにはユーザーの識別情報が含まれています。
2. JWTの検証
アプリケーションは受け取ったJWTを検証し、その正当性を確認します。JWTの検証には、発行元の公開鍵やシークレットキーが使用されます。
3. データベースチェック
JWTからユーザーIDを抽出し、そのIDを使ってデータベースのusers
テーブルでユーザーを検索します。
4. ユーザーの新規作成
もしデータベースにユーザーが存在しなければ、JWTに含まれるその他の情報(例えば、ユーザー名やメールアドレス)を利用して新しいユーザーレコードを作成します。
5. アクセス許可
データベースからユーザーレコードが確認できれば、ユーザーに対してアプリケーションのリソースへのアクセスを許可します。
まとめ
JWTを使用した認証はセキュリティが高く、スケーラビリティに優れています。初回アクセス時にユーザーの自動登録を行うことで、ユーザー情報の同期や管理がアプリケーション側で効率的に行われ、外部サービスとの連携もシンプルに保つことができます。
ディレクトリの構造例(Remix)
データベースのユーザーIDの取得はアプリ全体で使いまわすので上位のディレクトリに隔離する
/app
/supabase
- client.js // Supabaseクライアントの初期設定
- auth.js // 認証関連の関数
- database.js // データベース操作関連の関数
/routes
/utils
/components
/models