認証APIを利用した応用例(IDログイン)
メールアドレスの代わりに、ユーザー名+テナントID でログインするID認証方式の実装方法を解説します。
IDログインは単独で実装することも、メールアドレスログインと併用することもできます。SRP認証の計算処理やトークン検証(POST /verify)の仕組みはメールアドレスログインと同じで、チャレンジリクエストのエンドポイントとパラメータのみが異なります。
基本のメールアドレスログインの実装については 認証APIを利用した基本実装 を、認証APIの全体像については 認証API実装ガイド をご参照ください。
概要
IDログインでは、SaaSus Platform のテナント属性に設定された login_domain を利用します。バックエンドがテナント情報を取得し、ユーザー名 + login_domain(例: taro + @example.com = taro@example.com)を結合して SaaSus Platform Auth API に送信します。
これにより、ユーザーはメールアドレス全体を覚えていなくても、ユーザー名とテナントIDだけでログインできるようになります。複数テナントを運用する SaaS において、テナントごとに完結したログイン体験を提供したい場合に有効です。
前提条件
IDログインを実装するためには、以下の前提条件をすべて満たしている必要があります。
1. SaaSus Platform 側の設定
テナント属性 login_domain が定義されていること
SaaS運用コンソールの「テナント属性」設定で、login_domain という名前のテナント属性を追加してください。
- 属性名:
login_domain - 属性タイプ: 文字列(string)
- 値の形式:
@を含むドメイン部分(例:@example.com、@tenant1.example.com)
login_domain にはメールアドレスの @ 以降を含む形式で設定します(例: @example.com)。これにより user_id と単純結合した際に有効なメールアドレス形式になります。@ を含まないドメイン名のみで設定すると、結合時に正しいメールアドレスにならず認証に失敗します。
対象テナントに login_domain の値が設定されていること
ログイン対象となるテナントごとに、上記で定義した login_domain 属性に値が設定されている必要があります。値が未設定のテナントに対しては、IDログイン処理が失敗します。
ユーザーが ユーザー名 + login_domain の形式で SaaSus Platform に登録されていること
たとえば login_domain が @example.com のテナントで taro というID名でログインさせたい場合、SaaSus Platform 側のユーザーは taro@example.com というメールアドレスで登録されている必要があります。
2. アプリケーション側の前提
メールアドレスログインの基本実装が完了していること
IDログインは、基本のメールアドレスログイン(POST /sign-in および POST /sign-in/challenge)の仕組みの上に成り立ちます。先に 認証APIを利用した基本実装 を完了させた状態が前提です。
具体的には、以下が動作している必要があります:
- フロントエンドからの SRP_A 生成と送信
- バックエンドの
POST /sign-inエンドポイント - SRP 署名計算とトークン取得(
POST /verifyまたはPOST /sign-in/challenge) - HttpOnly Cookie によるトークン管理
テナント情報を取得する権限を持つ API キーが設定されていること
バックエンドから SaaSus Platform Auth API の GetTenant を呼び出すため、テナント情報の参照権限を持つ API キーがアプリケーションに設定されている必要があります。
3. UI 上の前提
ユーザーがテナントIDを把握できる手段があること
IDログインではユーザーがテナントIDを入力する必要があるため、以下のいずれかの方法でテナントIDをユーザーに提示する必要があ ります:
- テナント固有のログインURLを配布する(例:
https://app.example.com/login?tenant_id=xxx) - ログイン画面でテナントIDの入力欄を設ける
- ログイン前のテナント選択画面を設ける
本サンプルアプリケーションでは、URLクエリパラメータ ?tenant_id=xxx での事前指定と、フォームでの直接入力の両方をサポートしています。
フロントエンド
入力項目
IDログインでは、フロントエンドで以下の入力を受け付けます:
- ユーザー名: メールアドレスの
@より前の部分(例:taro) - テナントID: ログイン対象のテナントID
- パスワード: ユーザーのパスワード(SRP計算にのみ使用し、サーバーには送信しない)
テナントIDは、URLクエリパラメータ ?tenant_id=xxx で事前に指定することもできます。これにより、テナント固有のログインURLを配布するといった運用が可能です。
チャレンジリクエスト
IDログインでは、メールアドレスログ インの /challenge の代わりに /challenge-id エンドポイントを呼び出します。
// IDログイン時のチャレンジリクエスト
const challengeResponse = await apiClient.post('/challenge-id', {
user_id: userId,
tenant_id: tenantId,
srp_a: srpA,
});
チャレンジ取得以降の処理(SRP署名計算、POST /verify によるトークン取得)はメールアドレスログインと同じです。