クイックスタート
パブリッククライアントのユースケース
プライベートクライアントのユースケース
SLAS JWT の検証
信頼できるエージェントの認可
信頼できる代理システムの認可
パスワードのリセット
カスタムパラメーターとフック
買い物客プロフィールのマージ
買い物客の追跡環境設定の管理
プロモーションのタイプと要件
Agentic MCP Shopper Tools クイックスタート (パイロット)
URL マッピング
Ask the Community
Shopper Login and API Access Service (SLAS) を使用すると、B2C Commerce API と Open Commerce API (OCAPI) の Shopper API にセキュアにアクセスできます。
SLAS を設定するための管理ツールとして、SLAS Admin API と SLAS Admin UI の 2 つが用意されています。どちらの管理ツールでもアクセスコントロールに Account Manager を使用し、SLAS Organization Administrator (SLAS 組織管理者) の役割をもち、B2C Commerce インスタンスに正しいフィルターが設定されている必要があります。
SLAS Admin UI にアクセスするには、次の URL の {{short-code}} を、自社の B2C Commerce インスタンスで使用されているショートコードに置き換えます。
1https://{{short-code}}.api.commercecloud.salesforce.com/shopper/auth-admin/v1/ui/ショートコードの詳細については、ベース URL とリクエストの作成のガイドを参照してください。
高ボリュームの状況で SLAS を使用する場合のアドバイスについては、Salesforce デベロッパーのブログ記事 Shopper Login API: Techniques and Tricks to Get the Most Out of High-Volume Holidays (Shopper Login API: 高ボリュームのホリデー期間を最大限に活用するためのテクニックとコツ) を参照してください。
認可されたリクエストを SLAS に対して行うには、各アプリケーションを 1 つまたは複数の SLAS クライアントと関連付ける必要があります。各 SLAS クライアントは 1 つの SLAS テナントに登録され、各 SLAS テナントは 1 つの B2C Commerce インスタンスに関連付けられます。
SLAS クライアントは、パブリックまたはプライベートの 2 つのタイプのいずれかを使用して作成できます。アプリケーションに適切なクライアントタイプを選択するために最も重要なことは、そのクライアントがクライアントシークレットを安全に保存できると信頼できるかどうかです。クライアントを信頼できる場合はプライベートクライアントを使用し、信頼できない場合はパブリッククライアントを使用してください。
たとえば、SLAS と直接通信するモバイルアプリは、買い物客のデバイスにクライアントシークレットを保存する必要がありますが、これは安全ではありません。このため、ほとんどのモバイルアプリはパブリッククライアントを使用します。それに対し、BFF (Backend for Frontend) システムを備えたモバイルアプリは、買い物客のデバイスがアクセスできない安全な場所にクライアントシークレットを保存 できます。ですから、BFF システムを備えたアプリはプライベートクライアントを使用できます。
次の表は、最も一般的なタイプのアプリケーションで使用されるクライアントタイプをまとめたものです。
| アプリケーション | クライアントタイプ |
|---|---|
| シングルページの Web アプリ (PWA Kit のストアフロントなど) | パブリッククライアント |
| 従来のフルスタック Web アプリ | プライベートクライアント |
| モバイルアプリ (Android または iOS) | パブリッククライアント |
| BFF (Backend for Frontend) 方式を備えたあらゆる種類のアプリ | プライベートクライアント |
Important
SLAS API は、OAuth 2.1 規格で定義された付与タイプに基づいています。
アクセストークンリクエストに使用される付与タイプは、SLAS クライアントのタイプ (パブリックまたはプライベート) と買い物客の認証メソッドに依存します。
ほとんどの SLAS クライアントは getAccessToken エンドポイントでアクセストークンをリクエストし、ShopperToken を受け取ります。
信頼できるシステムは getTrustedSystemAccessToken エンドポイントを使用し、ShopperTsob トークン を受け取ります。このトークンは、信頼できるシステムがユーザーの代理でリクエストを行えるように、追加の機能を備えています。
買い物客の代理を務めるエージェントは、getTrustedAgentAccessToken エンドポイントを使用して、ShopperTokenTaob トークンを受け取ります。
B2C Commerce セッションの SLAS トークンを取得するには、getSessionBridgeAccessToken エンドポイントを使用します。
次の表は、SLAS クライアントとユーザー認証メソッドのタイプごとに使用されるさまざまな付与タイプとトークンタイプをまとめたものです。
| SLAS クライアント | 認証メソッド | メソッド | 付与タイプ | トークン |
|---|---|---|---|---|
| パブリック | なし (ゲストユーザー) | getAccessToken | authorization_code_pkce | Shopper |
| パブリック | 登録済みユーザー (フェデレーションログイン) | getAccessToken | authorization_code_pkce | Shopper |
| パブリック | 登録済みユーザー (B2C Commerce ログイン) | getAccessToken | authorization_code_pkce | Shopper |
| プライベート | なし (ゲストユーザー) | getAccessToken | client_credentials | Shopper |
| プライベート | 登録済みユーザー (フェデレーションログイン) | getAccessToken | authorization_code | Shopper |
| プライベート | 登録済みユーザー (B2C Commerce ログイン) | getAccessToken | authorization_code | Shopper |
| プライベート | 登録済みユーザー (B2C Commerce ログイン) | getAccessToken | authorization_code_pkce | Shopper |
| プライベート | 信頼できる代理システム (TSOB) ユーザー | getTrustedSystemAccessToken | client_credentials | ShopperTsob |
| パブリック | セッションブリッジ (ゲストユーザー) | getSessionBridgeAccessToken | session_bridge | ShopperSesb |
| パブリック | セッションブリッジ (B2C Commerce ログイン) | getSessionBridgeAccessToken | session_bridge | ShopperSesb |
| プライベート | セッションブリッジ (ゲストユーザー) | getSessionBridgeAccessToken | client_credentials | ShopperSesb |
| プライベート | セッションブリッジ (B2C Commerce ログイン) | getSessionBridgeAccessToken | client_credentials | ShopperSesb |
| プライベート | 信頼できる代理エージェント (TAOB) | getTrustedAgentAccessToken | client_credentials | ShopperTaob |
ShopperToken をリクエストするには、getAccessToken のエンドポイントを使用します。ShopperTokenTsob をリクエストするには、getTrustedSystemAccessToken のエンドポイントを使用します。
両エンドポイントは、認証に成功すると以下を返します。
customer_id 文字列アクセストークンは 30 分間有効です。このトークンは、発行元の SLAS API クライアントのスコープの対象となる B2C Commerce API エンドポイントにリクエストを行うときに使用できます。また、このトークンで、SLAS API クライアント ID が許可されている Open Commerce API エンドポイントをリクエストできます。発行されたインスタンスおよびサイトから API をリクエストする目的でのみ使用可能です。
リフレッシュトークンを使用して、新しいアクセストークンをリクエストできます。Production (本番) テナントの場合、リフレッシュトークンは、登録済みの買い物客においては 90 日間、ゲストにおいては 30 日間有効です。本番以外のテナントの場合、リフレッシュトークンは 9 日間有効です。リフレッシュトークンを使用すると、その後発行されるトークンの有効期間は、その有効期間分延長されます。
パブリッククライアントを使用して発行されたリフレッシュトークンは、1 回限り使用できます。リフレッシュトークンが使用されると、レスポンスで新しいトークンが返されます。プライベートクライアントを使用して発行されたリフレッシュトークンは、複数回使用できる場合があります。同じリフレッシュトークンは、レスポンスに返されます。
異なるストアフロント間での不正アクセスを防ぐため、grant_type が client_credentials または authorization_code_pkce の場合は、ゲストアクセストークンをリクエストする際に channel_id (site) パラメーターが必要です。このパラメーターが指定されていない場合、400 invalid refresh token エラーが返されます。
段階的なロールアウトに伴い、channel_id パラメーター要件は、2025/9/9 にすべての本番テナントで適用されるようになりました。詳細については、SLAS リリースノートを参照してください。
既存の顧客は、ゲストアクセストークンリクエストに channel_id パラメーターを含めるように実装を更新する必要があります。
Important
以下のサンプルリクエストは、channel_id パラメーターを必須で使用する方法を示しています。
1curl -X POST --location '`[`https://<host>/api/v1/organization/<org_id>/oauth2/token`](http://localhost:9020/api/v1/organization/bgvn_stg/oauth2/token)`' \
2--header 'Content-Type: application/x-www-form-urlencoded' \
3--header 'Authorization: Basic <client_id:secret>' \
4--data-urlencode 'grant_type=client_credentials' \
5--data-urlencode 'channel_id=RefArch'1curl --location '[http://<host>/api/v1/organizations/bgvn_stg/oauth2/token](http://localhost:9020/api/v1/organizations/bgvn_stg/oauth2/token)' \
2--header 'Content-Type: application/x-www-form-urlencoded' \
3--data-urlencode 'code=4bc7QNx0NDc-n991Ppi6IiwPO6OaPrT_jMgF823lGyg' \
4--data-urlencode 'grant_type=authorization_code_pkce' \
5--data-urlencode 'redirect_uri=[http://localhost:9010/callback`](http://localhost:9010/callback)' \
6--data-urlencode 'client_id=3a15f34e-fecd-4fcc-8235-86b70978e629' \
7--data-urlencode 'code_verifier=MyLi6hIowxiGsvBvvCJ0FV4AkOpOOnRHxC2PCsvD7yVLy4ZtzKl9Mv9a1r65dh1qg0ZvZ2nvMlLN8uYsZOKcj8cae1XbBBmD' \
8--data-urlencode 'channel_id=SiteGenesis'1curl "https://$CODE.api.commercecloud.salesforce.com/shopper/auth/v1/organizations/$ORG/oauth2/token" \
2 --user "$CLIENT:$SECRET" \
3 --data 'grant_type=client_credentials' \
4 --data "channel_id=$CHANNEL_ID"さらに、あるサイト (Site A) 用に発行された SLAS 買い物客トークンは、別のサイト (Site B) に対する SCAPI または OCAPI 呼び出しには使用できません。たとえば、RefArch の channel_id を指定してリクエストした SLAS アクセストークンは、同じ site_id を使用する SCAPI または OCAPI 呼び出しでのみ使用できます。
1curl --location 'https://sandbox-001.api.commercecloud.salesforce.com/product/shopper-products/v1/organizations/f_ecom_bcgl_stg/products?ids=nikon-d90-wlens&siteId=RefArch' \
2--header 'Authorization: Bearer <access_token>'`デコードされたアクセストークンのトークン詳細 (トークンの有効期間や承認されたスコープなど) を表示できます。以下に例を示します。
1{
2 "ver": "1.0",
3 "jku": "slas/prod/zzrf_001",
4 "kid": "73290ac8-ee0d-414e-ae51-2078ab4dc4d1",
5 "typ": "jwt",
6 "clv": "J2.3.4",
7 "alg": "ES256"
8}jku : これはボディの iss クレームと同じです。kid : トークン署名の検証に使用する公開鍵のキー ID。getJwksUri エンドポイントを使用してキーを取得します。1{
2 "aut": "GUID",
3 "scp": "sfcc.shopper-myaccount.baskets sfcc.shopper-discovery-search sfcc.shopper-myaccount.paymentinstruments sfcc.shopper-customers.login sfcc.shopper-experience sfcc.shopper-myaccount.orders sfcc.shopper-productlists sfcc.shopper-promotions sfcc.session_bridge sfcc.shopper-myaccount.paymentinstruments.rw sfcc.shopper-myaccount.productlists sfcc.shopper-categories sfcc.shopper-myaccount sfcc.shopper-myaccount.addresses sfcc.shopper-products sfcc.shopper-myaccount.rw sfcc.shopper-stores sfcc.shopper-customers.register sfcc.shopper-baskets-orders sfcc.shopper-myaccount.addresses.rw sfcc.shopper-myaccount.productlists.rw sfcc.shopper-baskets-orders.rw sfcc.shopper-gift-certificates sfcc.shopper-product-search sfcc.shopper-seo",
4 "sub": "cc-slas::zzrf_001::scid:c9c45bfd-0ed3-4aa2-9971-40f88962b836::usid:51b61c73-3a52-4b29-ac90-5ace596e5b27",
5 "ctx": "slas",
6 "iss": "slas/prod/zzrf_001",
7 "ist": 1,
8 "dnt": "0",
9 "aud": "commercecloud/prod/zzrf_001",
10 "nbf": 1717191705,
11 "sty": "User",
12 "isb": "uido:slas::upn:Guest::uidn:Guest User::gcid:ablrdGlHdHlXkRk0cZkGYYwHg3::chid:RefArchGlobal",
13 "exp": 1717193535,
14 "iat": 1717191735,
15 "jti": "C2C4856201860-1890678903105595297713040"
16}scp: トークン内のスコープ。特定のスコープがリクエストされない限り、これは SLAS クライアントのスコープになります。sub: client_id、tenant_id、および usid が含まれます。dnt: 買い物客の追跡環境設定。詳細については、買い物客の追跡環境設定の管理を参照してください。isb: IDP オリジン、買い物客情報、ゲスト ID、登録済み買い物客 ID、トークンタイプ、チャネル ID が含まれます。パスワードなしのログインおよびパスワードリセットコールバックの信頼性を保証するために、SLAS は、SLAS が送信するパスワードなしのログインおよびパスワードリセットコールバックごとに SlasCallbackToken (JWT) を提供します。
x-slas-callback-token HTTP ヘッダーを追加します。x-slas-callback-token HTTP ヘッダーは作成されないため、コールバックボディを使用してコールバック値を取得する必要があります。SLAS は、ヘッダーやパラメーターを追加せずに、指定された callback_uri に対して POST 呼び出しを行います。callback_uri に Authorization ヘッダーなどの追加のヘッダーが必要な場合は、必要に応じてヘッダーやパラメーターを追加できるプロキシを SLAS と callback_uri の間に配置する必要があります。
Important
1{
2 "user-agent": "ReactorNetty/1.0.38",
3 "host": "localhost:9003",
4 "accept": "*/*",
5 "x-correlation-id": "1cf7ce67-1d49-4ab5-832e-85daac619e4a",
6 "content-type": "application/json",
7 "x-slas-callback-token": "eyJraWQiOiIyZDY3MGZhOC0wZjI4LTQ0YTEtYjhiNC04N2E2ZDJmZWIxZDgiLCJ0eXAiOiJqd3QiLCJhbGciOiJFUzI1NiJ9.eyJlbWFpbF9pZCI6ImRhcnRoLnZhZGVyQGVuZG9yLm9yZyIsImxvZ2luX2lkIjoiZGFydGgudmFkZXIiLCJzdWIiOiI4NzlhOTczMC0zYjNlLTQ3N2QtOWVhMC0xYzdiYWI1ZjI4MzMiLCJwaG9uZSI6IiIsImlzcyI6InNsYXMvZGV2L2Jndm5fc3RnIiwiY3VzdG9tZXJfaWQiOiJhZFUxS0V3WEhLd3JiUjl5OVRhbjFPdHhXQSIsImV4cCI6MTcyNTQxNzMxMiwiaWF0IjoxNzI1NDE2NDEyLCJ0b2tlbiI6IjQwMjc1NTQ5IiwidXNpZCI6IjNmMDY4OTg3LWE3YWItNDE1Ny1iZmRkLTBmOGY4MjYzMzlkNSJ9.gFdqdu5gNNyZ6g2eFehbgOzY5DsoJZcHg0G5EZyhHy_FnD0bTFxE_pGzMgxttUrpeI7o7UBXGzvK5YL3K4wtAA",
8 "content-length": "180"
9}1{
2 "email_id": "darth.vader@endor.org",
3 "login_id": "darth.vader",
4 "phone": "",
5 "customer_id": "adU1KEwXHKwrbR9y9Tan1OtxWA",
6 "token": "40275549",
7 "usid": "3f068987-a7ab-4157-bfdd-0f8f826339d5"
8}x-slas-callback-token ヘッダーを抽出します。前述の例を使用すると、コールバックヘッダーの値は次のようになります。1eyJraWQiOiIyZDY3MGZhOC0wZjI4LTQ0YTEtYjhiNC04N2E2ZDJmZWIxZDgiLCJ0eXAiOiJqd3QiLCJhbGciOiJFUzI1NiJ9.eyJlbWFpbF9pZCI6ImRhcnRoLnZhZGVyQGVuZG9yLm9yZyIsImxvZ2luX2lkIjoiZGFydGgudmFkZXIiLCJzdWIiOiI4NzlhOTczMC0zYjNlLTQ3N2QtOWVhMC0xYzdiYWI1ZjI4MzMiLCJwaG9uZSI6IiIsImlzcyI6InNsYXMvZGV2L2Jndm5fc3RnIiwiY3VzdG9tZXJfaWQiOiJhZFUxS0V3WEhLd3JiUjl5OVRhbjFPdHhXQSIsImV4cCI6MTcyNTQxNzMxMiwiaWF0IjoxNzI1NDE2NDEyLCJ0b2tlbiI6IjQwMjc1NTQ5IiwidXNpZCI6IjNmMDY4OTg3LWE3YWItNDE1Ny1iZmRkLTBmOGY4MjYzMzlkNSJ9.gFdqdu5gNNyZ6g2eFehbgOzY5DsoJZcHg0G5EZyhHy_FnD0bTFxE_pGzMgxttUrpeI7o7UBXGzvK5YL3K4wtAA/jwks エンドポイントを使用して、JWT 署名を検証するための公開鍵を取得します。レスポンスには、次のようなテナントの公開キーが含まれます。1{
2 "keys": [
3 {
4 "kty": "EC",
5 "crv": "P-256",
6 "use": "sig",
7 "kid": "2d670fa8-0f28-44a1-b8b4-87a6d2feb1d8",
8 "x": "_2tPqxGhgX6cA5Qg7v6UH_9om8OR3-OehkgXXWraTp8",
9 "y": "DAykmQPtf282buIcL0rLwKYbK6ApgripMjazdAthUFw"
10 },
11 {
12 "kty": "EC",
13 "crv": "P-256",
14 "use": "sig",
15 "kid": "eb70508f-4d64-46f7-a3d5-b36558d6e6b6",
16 "x": "VV0JVJFhkz71wY0E73Z-snorZ5oJf1QOdkIbCjyMqLs",
17 "y": "QLkqBVSPPrkd7HjaSEMgMU9Ob-FDpg1W-oLq5I4ExqQ"
18 }
19 ]
20}SlasCallbackToken 署名を検証します。nimbus-jose-jwt ライブラリを使用して署名を検証します。1// prerequsite is to get the public keys using the SLAS /jwks endpoint
2// response into a String.
3
4import com.nimbusds.jose.JWSVerifier;
5import com.nimbusds.jose.crypto.ECDSAVerifier;
6import com.nimbusds.jose.jwk.ECKey;
7import com.nimbusds.jwt.SignedJWT;
8import org.apache.commons.lang3.StringUtils;
9import org.json.JSONArray;
10import org.json.JSONObject;
11
12public boolean isSignatureValid(String callbackJwt) {
13
14 ECDSAVerifier jwksVerifier = null;
15
16 try {
17 // publicKeys value is from the /jwks endpoint
18 JSONObject publicKeyJSON = new JSONObject(publicKeys);
19 JSONArray publicKeyArray = publicKeyJSON.getJSONArray("keys");
20 // Build a signed JWT
21 SignedJWT callbackSignedJWT = SignedJWT.parse(callbackJwt);
22 // Get the signing key id.
23 String jwtKeyId = callbackSignedJWT.getHeader().getKeyID();
24
25 // Find the signing key from the array of public keys.
26 // If found then create a verifier.
27 for(Object jo : publicKeyArray) {
28 if( StringUtils.equals(((JSONObject)jo).getString("kid"), jwtKeyId)) {
29 String publicKey = jo.toString();
30 jwksVerifier = new ECDSAVerifier(ECKey.parse(publicKey));
31 break;
32 }
33 }
34
35 if(Objects.nonNull(jwksVerifier) ) {
36 // Verifiy the JWT.
37 return callbackSignedJWT.verify(jwksVerifier);
38 } else {
39 return false;
40 }
41 }
42 catch(ParseException | JOSEException e) {
43 return false;
44 }
45 }買い物客の追跡環境設定をアプリケーションに組み込むことができます。getAccessTokenを使用して SLAS トークンを取得する場合は、追跡環境設定を指定します。追跡環境設定は、そのトークンを使用するすべてのリクエストで考慮されます。B2C Commerce 24.4 以降のリリースの場合、Shopper Login API には、セッションに Do Not Track を設定するためのブール値 dnt パラメーターが含まれます。定義されていない場合、dnt の値はデフォルトで false になります。
詳細については、買い物客の追跡環境設定の管理を参照してください。
SLAS 4xx および 5xx のエラーログは Log Center で利用でき、すべてのレルムを 1 つの URL で表示できることや、最大 14 日間のログデータ、検索機能の向上など、さまざまな利点が得られます。
SLAS 4xx および 5xx エラーログにアクセスするには、以下の手順を実行します。
httpStatus コードを使用して結果をフィルタリングする LCQL クエリを使用します。
(httpstatus) コードを入力します (例: text:(httpstatus) AND text:(401))。SLAS でサポートされるレート制限は次のとおりです。
レート制限に達すると、SLAS は Retry-After HTTP レスポンスヘッダーを含む HTTP 429 Too Many Requests で応答します。Retry-After ヘッダーの値には、リクエストを再試行するまでの待機時間 (秒単位) が設定されています。
1HTTP/1.1 429 Too Many Requests
2Retry-After: 3600クライアントコードはこのリスポンスを処理できる必要があります。次のリクエストが確実に成功するよう、再試行する前に必ず指定された時間待機してください。
レート制限の問題を回避するには、次の推奨事項を確認してください。
SLAS サービス保護メカニズムは、同じ SLAS エンドポイントへの呼び出しを、同じ USID (一意の買い物客 ID) を使用して短期間に繰り返し使用することを制限します。これにより、409 HTTP レスポンスが返されます。
authenticateCustomer を含む一部の SLAS エンドポイントは、関連付けられている B2C Commerce インスタンスと通信します。そのインスタンスを使用できない場合、これらのエンドポイントへの呼び出しは失敗します。
dw.ocapi.shop.customer.auth.* のフックを含む SCAPI フックは、SLAS 呼び出しと競合する可能性があります。SLAS 呼び出しが予期せず失敗する場合、B2C Commerce ログでフック呼び出しエラーがないか確認してください。
アクセストークンに関連付けられた買い物客アカウントが無効化または削除された場合、そのアクセストークンを使用して行われたその後のリクエストは失敗します。
SLAS では、最大 30 個のカスタムオブジェクトスコープを処理できます。詳細については、Shopper Custom Objects API を参照してください。
B2C Commerce では、SLAS はマルチテナントサービスとして機能し、本番環境から PRD インスタンスと非 PRD インスタンスの両方にサービスを提供します。SLAS は、PRD インスタンスと非 PRD インスタンスを異なる「エンティティ」として扱い、非 PRD のトラフィックとイベントが本番環境に与える潜在的な影響を最小限に抑えることで、本番環境のパフォーマンスを優先します。その結果、PRD 環境と非 PRD 環境の間に SLAS の違いが生じますが、これは将来解決される予定です。SLAS の PRD と非 PRD の違いは次のとおりです。
deleteShopperを使用して SLAS 内の対応するレコードを削除する必要があります。入門ガイドの Shopper API の認可の指示に従って、パブリック SLAS クライアントまたはプライベート SLAS クライアントを設定します (この設定が完了していない場合)。
SLAS クライアントの設定が完了したら、メインの SLAS API と SLAS Admin API の両方を使用する方法について説明する以下の SLAS ガイドを参照してください。
SLAS API の機能に関する技術的な詳細については、参照資料セクションの次の API 仕様を参照してください。