Skip to content

saasus-platform/implementation-sample-auth-api

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 

Repository files navigation

SaaSus Sample Login Application

SRP (Secure Remote Password) 認証を使用したサンプルログインアプリケーション

セキュリティの特徴

このアプリケーションは、SRPの本来の設計思想に沿った実装を採用しています:

  • パスワードがネットワーク上を一切流れない
  • パスワードはブラウザ内でのみ使用される
  • バックエンドがパスワードを見ることがない
  • 中間者攻撃に対して強い耐性

📋 認証フロー

1. フロント: SRP_A生成
   ↓
2. フロント → バックエンド: { email, srp_a }  ← ✅ パスワードなし
   ↓
3. バックエンド → SaaSus API → バックエンド → フロント: { srp_b, salt, secret_block, ... }
   ↓
4. フロント: パスワードで署名計算  ← ✅ パスワードはローカルのみ
   ↓
5. フロント → バックエンド: { username, signature, timestamp, secret_block }  ← ✅ パスワードなし
   ↓
6. バックエンド → SaaSus API → バックエンド → フロント: { access_token, id_token, refresh_token }

アーキテクチャ

バックエンド(Go)

2つのエンドポイントで構成:

  1. POST /challenge - チャレンジパラメータ取得

    • 入力: { email, srp_a }
    • 出力: { srp_b, salt, secret_block, pool_name, username, session }
  2. POST /verify - 署名検証

    • 入力: { username, signature, timestamp, secret_block, session }
    • 出力: { access_token, id_token, refresh_token }

フロントエンド(React + TypeScript)

  • SRP計算: 自前実装(AWS Cognito互換)
  • 暗号化ライブラリ: crypto-js(SHA-256、HMAC、HKDF)
  • BigInteger演算: big-integer
  • HTTPクライアント: axios

🚀 セットアップ

前提条件

  • Go 1.24以上
  • Node.js 16以上
  • SaaSus アカウント

環境変数の設定

バックエンド用の.envファイルを作成:

cd backend-go
cp .env.example .env

.envファイルを編集:

SAASUS_SAAS_ID=your-saas-id
SAASUS_API_KEY=your-api-key
SAASUS_SECRET_KEY=your-secret-key
PORT=80

バックエンドの起動

cd backend-go
go run main.go

サーバーは http://localhost で起動します(デフォルトポート: 80)。

フロントエンドの起動

cd frontend
npm install
npm start

アプリケーションは http://localhost:3000 で起動します。

📦 依存関係

バックエンド

  • github.com/labstack/echo/v4 - Webフレームワーク
  • github.com/saasus-platform/saasus-sdk-go - SaaSus SDK
  • github.com/joho/godotenv - 環境変数管理

フロントエンド

  • react - UIフレームワーク
  • typescript - 型安全性
  • axios - HTTPクライアント
  • crypto-js - 暗号化ライブラリ(SHA-256、HMAC、HKDF)
  • big-integer - BigInteger演算ライブラリ

🔍 実装の詳細

SRP認証ヘルパー(フロントエンド)

frontend/src/lib/srpAuth.tsに実装:

export class SRPAuthHelper {
  // SRP_A(公開値)を生成
  public getLargeAValue(): string

  // パスワードからHKDFキーを計算
  public getPasswordAuthenticationKey(
    userPoolName: string,
    username: string,
    password: string,
    serverBValue: string,
    salt: string
  ): number[]  // 16バイトのHKDFキー

  // 署名を生成
  public getSignature(
    userPoolName: string,
    username: string,
    secretBlock: string,
    dateNow: string,
    hkdfKey: number[]
  ): string  // Base64エンコードされた署名
}

// タイムスタンプ生成(AWS Cognito互換フォーマット)
export const getNowString = (): string

実装の特徴:

  • AWS Cognito SRP認証プロトコルと完全互換
  • 3072-bit safe prime (N) を使用
  • HKDF (HMAC-based Key Derivation Function) による鍵導出
  • すべての暗号化処理をブラウザ内で完結

バックエンドエンドポイント

backend-go/main.goに実装:

// チャレンジエンドポイント
func challenge(c echo.Context) error

// 検証エンドポイント
func verify(c echo.Context) error

技術的な詳細

SRP認証プロトコル

このアプリケーションは、AWS Cognito互換のSRP認証プロトコルを実装しています:

  1. クライアント側(フロントエンド):

    • ランダムな秘密値 a を生成
    • 公開値 A = g^a mod N を計算
    • サーバーから受け取った Bsalt を使用
    • U = H(A | B) を計算
    • x = H(salt | H(userPoolName | username | ":" | password)) を計算
    • 共有秘密 S = (B - k * g^x) ^ (a + U * x) mod N を計算
    • HKDF で鍵を導出: hkdfKey = HKDF(S, U, "Caldera Derived Key")
    • HMAC-SHA256 で署名を生成
  2. サーバー側(バックエンド):

    • クライアントから A を受け取り、SaaSus APIに転送
    • SaaSus APIから Bsaltsecret_block を受け取り、クライアントに返す
    • クライアントから署名を受け取り、SaaSus APIで検証
    • 検証成功時にトークンを返す

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors