mcpField
B
b2c-slas-auth-patterns

b2c-slas-auth-patterns

github.com/salesforcecommercecloudセキュリティ57112 回インストール今日更新
リポジトリ

b2c-slas-auth-patterns について

Salesforce B2C Commerce の開発者向けに、基本ログインを超える SLAS 認証パターンを扱うスキルです。パスワードレス認証、ストアフロント間のセッション連携、システム間アクセス、トークン保護を、PWA Kit、Storefront Next、SFRA の例とともに説明します。

主な機能

  1. 01メール・SMS OTP フロー
  2. 02FIDO2/WebAuthn パスキー
  3. 03PWA Kit と SFRA のセッション連携
  4. 04ハイブリッド認証のガイダンス
  5. 05TSOB とトークン管理
  6. 06JWKS による JWT 検証

活用シーン

  1. 01ストアフロントにパスワードレス認証を追加
  2. 02PWA Kit と SFRA 間でセッションを維持
  3. 03バックエンドから購入者に代わって操作
  4. 04サーバー側で SLAS トークンを検証

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/salesforcecommercecloud/b2c-developer-tooling --skill b2c-slas-auth-patterns

インストール後、Claude Code で/b2c-slas-auth-patternsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

evals/
trigger-evals.json
references/
PASSKEYS.md
SESSION-BRIDGE.md
TOKEN-LIFECYCLE.md

詳細

B2C SLAS 認証パターン

基本的なログインを超える、SLAS(Shopper Login and API Access Service)の高度な認証パターンです。これらのパターンにより、パスワードレス認証、ハイブリッドストアフロントのサポート、システム間連携が可能になります。

対象範囲と根拠

このスキルでは、パスワードレスログイン(メール OTP、SMS、パスキー)、セッションブリッジ、ハイブリッド認証(B2C 25.3+)、トークン管理、TSOB、JWT 検証など、SLAS 認証パターンを扱います。また、PWA Kit、Storefront Next、SFRA に固有の例も含まれます。コード例は一般的なフローを示すものです。バージョン固有の質問への回答、フレームワーク固有の実装、またはユーザーが本番環境で実行するコードを提供する前に、b2c docs search および b2c docs read を使用して、公式ドキュメントで現在の API コントラクト、パラメーター、レート制限、バージョン要件を確認してください。正規ドキュメントは、B2C プラットフォーム固有の情報、API の形式、設定要件に関する信頼できる情報源です。

正規ドキュメント
  • commerce-api/slas - SLAS の概要
  • commerce-api/slas-best-practices - セキュリティと実装のベストプラクティス
  • commerce-api/slas-passwordless-login-overview - パスワードレス認証の概要
  • commerce-api/slas-passwordless-login-email - メール OTP の実装
  • commerce-api/slas-passwordless-login-passkey - パスキー/WebAuthn の実装
  • commerce-api/slas-passwordless-sms - SMS OTP の実装
  • commerce-api/slas-session-bridge-overview - セッションブリッジの概要
  • commerce-api/slas-session-bridge-auth - セッションブリッジの実装
  • commerce-api/hybrid-authentication - ハイブリッド認証(B2C 25.3+)
  • commerce-api/hybrid-auth-pwa-kit-v2 - PWA Kit v2 のハイブリッド認証
  • pwa-kit-managed-runtime/hybrid-auth - PWA Kit Managed Runtime のハイブリッド認証
  • pwa-kit-managed-runtime/plugin-slas-setup - Plugin SLAS の設定
  • commerce-api/slas-trusted-system - 信頼されたシステムによる代理アクセス(TSOB)
  • commerce-api/slas-public-client - パブリッククライアントの設定
  • commerce-api/slas-private-client - プライベートクライアントの設定
  • commerce-api/slas-validate-jwt-with-jwks - JWT の検証

認証方法の概要

方法ユースケースユーザー体験
パスワード従来型のログインユーザー名とパスワードのフォーム
メール OTPメールによるパスワードレス認証メールでコードを送信
SMS OTPSMS によるパスワードレス認証電話にコードを送信
パスキーFIDO2/WebAuthn生体認証またはデバイス PIN
セッションブリッジハイブリッドストアフロントPWA ↔ SFRA 間をシームレスに連携
ハイブリッド認証B2C 25.3+プラットフォーム組み込みの認証同期
TSOBシステム連携バックエンドサービスの呼び出し

パスワードレスメール OTP

フローの例です。現在の API 形式、パラメーター、レート制限は、b2c docs read commerce-api/slas-passwordless-login-email および b2c docs read commerce-api/slas-passwordless-login-overview で確認してください。

パスワードレスログイン用のワンタイムパスワードをメールで送信します。

フローの概要
  1. コールバック URI を指定して /oauth2/passwordless/login を呼び出します
  2. SLAS が pwdless_login_token をコールバックに POST します
  3. アプリがメールで購入者に OTP を送信します
  4. 購入者が OTP を入力し、アプリがトークンと交換します
ステップ 1:パスワードレスログインを開始する
// POST /shopper/auth/v1/organizations/{org}/oauth2/passwordless/login
async function initiatePasswordlessLogin(email, siteId) {
    const response = await fetch(
        `https://${shortCode}.api.commercecloud.salesforce.com/shopper/auth/v1/organizations/${orgId}/oauth2/passwordless/login`,
        {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded'
            },
            body: new URLSearchParams({
                user_id: email,
                mode: 'callback',
                channel_id: siteId,
                callback_uri: 'https://yoursite.com/api/passwordless/callback'
            })
        }
    );

    // SLAS will POST to your callback_uri with pwdless_login_token
    return response.json();
}
ステップ 2:コールバックを処理して OTP を送信する

コールバックエンドポイントで pwdless_login_token を受け取ります。OTP を生成し、ユーザーに送信します。

// Your callback endpoint (receives POST from SLAS)
app.post('/api/passwordless/callback', async (req, res) => {
    const { pwdless_login_token, user_id } = req.body;

    // Generate 6-digit OTP
    const otp = Math.floor(100000 + Math.random() * 900000).toString();

    // Store token + OTP mapping (e.g., Redis with 10 min TTL)
    await redis.setex(`pwdless:${otp}`, 600, JSON.stringify({
        token: pwdless_login_token,
        email: user_id
    }));

    // Send OTP via email (configure in SLAS Admin UI)
    await sendOTPEmail(user_id, otp);

    res.status(200).send('OK');
});
ステップ 3:OTP をトークンと交換する
// POST /shopper/auth/v1/organizations/{org}/oauth2/passwordless/token
async function exchangeOTPForToken(otp, clientId, clientSecret, siteId) {
    // Retrieve stored token
    const stored = JSON.parse(await redis.get(`pwdless:${otp}`));
    if (!stored) throw new Error('Invalid or expired OTP');

    const response = await fetch(
        `https://${shortCode}.api.commercecloud.salesforce.com/shopper/auth/v1/organizations/${orgId}/oauth2/passwordless/token`,
        {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
                'Authorization': `Basic ${btoa(clientId + ':' + clientSecret)}`
            },
            body: new URLSearchParams({
                grant_type: 'client_credentials',
                hint: 'pwdless_login',
                pwdless_login_token: stored.token,
                channel_id: siteId
            })
        }
    );

    // Returns: { access_token, refresh_token, ... }
    return response.json();
}
レート制限
  • ユーザーごとに 10 分間で 6 リクエスト
  • 非本番テナントではエンドポイントごとに月間 1,000 リクエスト

パスワードレス SMS OTP

Marketing Cloud またはカスタム連携を使用して、OTP を SMS で送信します。

Marketing Cloud の使用

Salesforce Marketing Cloud で SMS を設定します。

  1. Marketing Cloud コネクターを設定します
  2. OTP テンプレートを使用して SMS ジャーニーを設定します
  3. SLAS コールバック経由でトリガーします(メール OTP と同じフロー)
カスタム SMS プロバイダー

メールと同じコールバックフローを使用しますが、SMS プロバイダー経由で送信します。

// In your callback handler
const twilio = require('twilio')(accountSid, authToken);

async function sendOTPSMS(phoneNumber, otp) {
    await twilio.messages.create({
        body: `Your login code is: ${otp}`,
        from: '+1234567890',
        to: phoneNumber
    });
}

パスキー(FIDO2/WebAuthn)

フローの例を示しています。現在の API の形式とパラメーターについては、b2c docs read commerce-api/slas-passwordless-login-passkeyで確認してください。

FIDO2/WebAuthn パスキーを使用して生体認証を有効にします。登録には、事前に OTP による本人確認が必要です。フローでは、まず SLAS で登録を開始し、ブラウザーの WebAuthn API を使って認証情報を作成してから、登録を完了します。認証も同様に、開始、認証、完了の順で進みます。

登録と認証の完全なコード例については、references/PASSKEYS.mdを参照してください。

セッションブリッジ

フローの例を示しています。現在の API の形式と、プラットフォームに依存しないパターンについては、b2c docs read commerce-api/slas-session-bridge-overviewおよびb2c docs read commerce-api/slas-session-bridge-authで確認してください。PWA Kit の例はフレームワーク固有です。

署名付きブリッジトークン(ゲスト用はdwsgst、登録済みユーザー用はdwsrst)を使用して、PWA Kit と SFRA のストアフロント間でセッションの継続性を維持します。PWA から SFRA への方向と、SFRA から PWA への方向の両方に対応しています。登録済みの購入者については、DWSID は非推奨であることに注意してください。

トークンの生成、リダイレクトのパターン、コールバックハンドラー、エラー処理など、実装の詳細についてはreferences/SESSION-BRIDGE.mdを参照してください。

ハイブリッド認証(B2C 25.3 以降)

概念の例を示しています。バージョン要件と移行ガイダンスについては、b2c docs read commerce-api/hybrid-authenticationで確認してください。

ハイブリッド認証は、ハイブリッド PWA/SFRA ストアフロント向けの Plugin SLAS に代わるものです。 B2C プラットフォームに直接組み込まれており、セッションを自動的に同期します。

利点
  • セッションブリッジを手動で実装する必要がありません
  • PWA と SFRA 間の自動同期
  • トークン管理の簡素化
  • プラットフォームに組み込まれたサポート
Plugin SLAS からの移行

Plugin SLAS を使用している場合は、ハイブリッド認証に移行してください。

  1. B2C Commerce 25.3 以降にアップグレードします
  2. Business Manager でハイブリッド認証を有効にします
  3. Plugin SLAS カートリッジを削除します
  4. プラットフォーム認証を使用するようにストアフロントを更新します

トークンの更新

フローの例を示しています。パラメーターの要件とトークンのローテーション動作については、b2c docs read commerce-api/slas-public-clientおよびb2c docs read commerce-api/slas-private-clientで確認してください。

重要: ゲストトークンの更新には、channel_idパラメーターが必須です。

パブリッククライアント(1 回限りの更新)

パブリッククライアント(シークレットなし)には、1 回限りの更新トークンが発行されます。

async function refreshTokenPublic(refreshToken, clientId, siteId) {
    const response = await fetch(
        `https://${shortCode}.api.commercecloud.salesforce.com/shopper/auth/v1/organizations/${orgId}/oauth2/token`,
        {
            method: 'POST',
            headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
            body: new URLSearchParams({
                grant_type: 'refresh_token',
                refresh_token: refreshToken,
                client_id: clientId,
                channel_id: siteId  // REQUIRED
            })
        }
    );

    // Returns NEW refresh_token (old one is invalidated)
    return response.json();
}
プライベートクライアント(再利用可能な更新)

プライベートクライアントは更新トークンを再利用できます。

async function refreshTokenPrivate(refreshToken, clientId, clientSecret, siteId) {
    const response = await fetch(
        `https://${shortCode}.api.commercecloud.salesforce.com/shopper/auth/v1/organizations/${orgId}/oauth2/token`,
        {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
                'Authorization': `Basic ${btoa(clientId + ':' + clientSecret)}`
            },
            body: new URLSearchParams({
                grant_type: 'refresh_token',
                refresh_token: refreshToken,
                channel_id: siteId  // REQUIRED
            })
        }
    );

    // Same refresh_token can be used again
    return response.json();
}

Trusted System on Behalf(TSOB)

フローの例を示しています。現在の API の形式と構成要件については、b2c docs read commerce-api/slas-trusted-systemで確認してください。

購入者に代わって操作を行うための、サーバー間認証です。

ユースケース
  • 購入者データにアクセスするバックエンドサービス
  • 注文管理システム
  • カスタマーサービスアプリケーション
購入者に代わってトークンを取得する
async function getTSOBToken(shopperLoginId) {
    const response = await fetch(
        `https://${shortCode}.api.commercecloud.salesforce.com/shopper/auth/v1/organizations/${orgId}/oauth2/trusted-system/token`,
        {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
                'Authorization': `Basic ${btoa(clientId + ':' + clientSecret)}`
            },
            body: new URLSearchParams({
                grant_type: 'client_credentials',
                login_id: shopperLoginId,
                channel_id: siteId,
                usid: shopperUsid // Optional: reuse existing session
            })
        }
    );

    // Returns tokens that act as the specified shopper
    return response.json();
}
重要な制約

3 秒間の保護ウィンドウ: 同じ購入者に対する複数の TSOB 呼び出しを 3 秒以内に行うと、HTTP 409 が返されます。

"Tenant id <id> has already performed a login operation for user id <user_id> in the last 3 seconds."

コード内で次のように処理してください。

async function getTSOBTokenWithRetry(shopperLoginId, maxRetries = 3) {
    for (let i = 0; i < maxRetries; i++) {
        try {
            return await getTSOBToken(shopperLoginId);
        } catch (error) {
            if (error.status === 409 && i < maxRetries - 1) {
                await new Promise(r => setTimeout(r, 3000));
                continue;
            }
            throw error;
        }
    }
}
必要な構成
  1. SLAS クライアントで TSOB を有効にする必要があります(sfcc.ts_ext_on_behalf_ofスコープ)
  2. SLAS Admin API または Business Manager で構成します
  3. クライアントシークレットを安全に管理します(サーバー側のみ)
  4. login_idの長さを 60 文字未満に保ちます

JWT の検証

フローの例を示しています。現在の API の形式と検証パターンについては、b2c docs read commerce-api/slas-validate-jwt-with-jwksで確認してください。

JWKS(JSON Web Key Set)を使用して SLAS トークンを検証します。

JWKS を取得する
async function getJWKS() {
    const response = await fetch(
        `https://${shortCode}.api.commercecloud.salesforce.com/shopper/auth/v1/organizations/${orgId}/oauth2/jwks`
    );
    return response.json();
}
トークンを検証する
const jose = require('jose');

async function validateToken(accessToken) {
    // Get JWKS
    const jwksUrl = `https://${shortCode}.api.commercecloud.salesforce.com/shopper/auth/v1/organizations/${orgId}/oauth2/jwks`;
    const JWKS = jose.createRemoteJWKSet(new URL(jwksUrl));

    // Verify token
    const { payload } = await jose.jwtVerify(accessToken, JWKS, {
        issuer: `https://${shortCode}.api.commercecloud.salesforce.com/shopper/auth/v1/organizations/${orgId}`,
        audience: clientId
    });

    return payload;
}
トークンのクレーム
クレーム説明
subサブジェクト(顧客 ID またはゲスト ID)
isbアイデンティティのサブジェクトバインディング
iss発行者
aud対象者(クライアント ID)
exp有効期限
iat発行日時
scope付与されたスコープ
tsobTSOB トークンの種類(信頼されたシステムのトークンの場合)

ベストプラクティス

セキュリティ
  • フロントエンドのコードでクライアントシークレットを決して公開しないでください
  • すべてのトークン交換に HTTPS を使用してください
  • 機密性の高い操作では、サーバー側でトークンを検証してください
  • 適切な CORS ポリシーを実装してください
  • トークンは安全に保存してください(httpOnly Cookie を推奨します)
トークン管理
  • 有効期限が切れる前に、事前にトークンを更新してください
  • パブリッククライアントでは、リフレッシュトークンのローテーションに対応してください
  • ログアウト時に、すべての保存場所からトークンを削除してください
  • 可能な場合は、有効期間の短いアクセストークンを使用してください
  • リフレッシュリクエストには、必ず channel_id を含めてください
ユーザーエクスペリエンス
  • 代替の認証方法を用意してください
  • 認証に失敗した場合は、明確なエラーメッセージを表示してください
  • ユーザーが希望する認証方法を記憶してください
  • セッションの有効期限切れに適切に対応してください

詳細なリファレンス

コメント