b2c-slas-auth-patterns について
Salesforce B2C Commerce の開発者向けに、基本ログインを超える SLAS 認証パターンを扱うスキルです。パスワードレス認証、ストアフロント間のセッション連携、システム間アクセス、トークン保護を、PWA Kit、Storefront Next、SFRA の例とともに説明します。
主な機能
- 01メール・SMS OTP フロー
- 02FIDO2/WebAuthn パスキー
- 03PWA Kit と SFRA のセッション連携
- 04ハイブリッド認証のガイダンス
- 05TSOB とトークン管理
- 06JWKS による JWT 検証
活用シーン
- 01ストアフロントにパスワードレス認証を追加
- 02PWA Kit と SFRA 間でセッションを維持
- 03バックエンドから購入者に代わって操作
- 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.jsonreferences/PASSKEYS.mdSESSION-BRIDGE.mdTOKEN-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 OTP | SMS によるパスワードレス認証 | 電話にコードを送信 |
| パスキー | 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で確認してください。
パスワードレスログイン用のワンタイムパスワードをメールで送信します。
フローの概要
- コールバック URI を指定して
/oauth2/passwordless/loginを呼び出します - SLAS が
pwdless_login_tokenをコールバックに POST します - アプリがメールで購入者に OTP を送信します
- 購入者が 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 を設定します。
- Marketing Cloud コネクターを設定します
- OTP テンプレートを使用して SMS ジャーニーを設定します
- 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 を使用している場合は、ハイブリッド認証に移行してください。
- B2C Commerce 25.3 以降にアップグレードします
- Business Manager でハイブリッド認証を有効にします
- Plugin SLAS カートリッジを削除します
- プラットフォーム認証を使用するようにストアフロントを更新します
トークンの更新
フローの例を示しています。パラメーターの要件とトークンのローテーション動作については、
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;
}
}
}
必要な構成
- SLAS クライアントで TSOB を有効にする必要があります(
sfcc.ts_ext_on_behalf_ofスコープ) - SLAS Admin API または Business Manager で構成します
- クライアントシークレットを安全に管理します(サーバー側のみ)
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 | 付与されたスコープ |
tsob | TSOB トークンの種類(信頼されたシステムのトークンの場合) |
ベストプラクティス
セキュリティ
- フロントエンドのコードでクライアントシークレットを決して公開しないでください
- すべてのトークン交換に HTTPS を使用してください
- 機密性の高い操作では、サーバー側でトークンを検証してください
- 適切な CORS ポリシーを実装してください
- トークンは安全に保存してください(httpOnly Cookie を推奨します)
トークン管理
- 有効期限が切れる前に、事前にトークンを更新してください
- パブリッククライアントでは、リフレッシュトークンのローテーションに対応してください
- ログアウト時に、すべての保存場所からトークンを削除してください
- 可能な場合は、有効期間の短いアクセストークンを使用してください
- リフレッシュリクエストには、必ず
channel_idを含めてください
ユーザーエクスペリエンス
- 代替の認証方法を用意してください
- 認証に失敗した場合は、明確なエラーメッセージを表示してください
- ユーザーが希望する認証方法を記憶してください
- セッションの有効期限切れに適切に対応してください
詳細なリファレンス
- パスキー(FIDO2/WebAuthn) - 登録および認証のコード例
- セッションブリッジのフロー - セッションブリッジの実装に関する詳細
- トークンのライフサイクル - トークンの有効期限と更新のパターン