@salesforce/b2c-cli 2.3.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (421) hide show
  1. package/bin/dev.js +8 -8
  2. package/bin/run.js +5 -7
  3. package/content/guidance/b2c/b2c-business-manager-extensions/SKILL.md +361 -0
  4. package/content/guidance/b2c/b2c-business-manager-extensions/references/EXTENSIONS-XML.md +458 -0
  5. package/content/guidance/b2c/b2c-controllers/SKILL.md +301 -0
  6. package/content/guidance/b2c/b2c-controllers/references/CLASSIC-PATTERNS.md +335 -0
  7. package/content/guidance/b2c/b2c-controllers/references/SFRA-PATTERNS.md +400 -0
  8. package/content/guidance/b2c/b2c-custom-api-development/SKILL.md +281 -0
  9. package/content/guidance/b2c/b2c-custom-api-development/references/CONTRACT.md +142 -0
  10. package/content/guidance/b2c/b2c-custom-api-development/references/IMPLEMENTATION.md +153 -0
  11. package/content/guidance/b2c/b2c-custom-api-development/references/TESTING.md +118 -0
  12. package/content/guidance/b2c/b2c-custom-caches/SKILL.md +279 -0
  13. package/content/guidance/b2c/b2c-custom-job-steps/SKILL.md +520 -0
  14. package/content/guidance/b2c/b2c-custom-job-steps/references/CHUNK-ORIENTED.md +377 -0
  15. package/content/guidance/b2c/b2c-custom-job-steps/references/JOBS-XML.md +212 -0
  16. package/content/guidance/b2c/b2c-custom-job-steps/references/STEPTYPES-JSON.md +373 -0
  17. package/content/guidance/b2c/b2c-custom-job-steps/references/TASK-ORIENTED.md +344 -0
  18. package/content/guidance/b2c/b2c-custom-objects/SKILL.md +327 -0
  19. package/content/guidance/b2c/b2c-custom-objects/references/OCAPI-SEARCH.md +298 -0
  20. package/content/guidance/b2c/b2c-forms/SKILL.md +242 -0
  21. package/content/guidance/b2c/b2c-forms/references/FORM-XML.md +409 -0
  22. package/content/guidance/b2c/b2c-hooks/SKILL.md +500 -0
  23. package/content/guidance/b2c/b2c-hooks/references/OCAPI-SCAPI-HOOKS.md +403 -0
  24. package/content/guidance/b2c/b2c-hooks/references/ORDER-HOOK-LIFECYCLE.md +169 -0
  25. package/content/guidance/b2c/b2c-hooks/references/SYSTEM-HOOKS.md +433 -0
  26. package/content/guidance/b2c/b2c-isml/SKILL.md +320 -0
  27. package/content/guidance/b2c/b2c-isml/references/EXPRESSIONS.md +366 -0
  28. package/content/guidance/b2c/b2c-isml/references/TAGS.md +443 -0
  29. package/content/guidance/b2c/b2c-localization/SKILL.md +344 -0
  30. package/content/guidance/b2c/b2c-localization/references/PATTERNS.md +407 -0
  31. package/content/guidance/b2c/b2c-logging/SKILL.md +352 -0
  32. package/content/guidance/b2c/b2c-logging/references/LOG-FILES.md +282 -0
  33. package/content/guidance/b2c/b2c-metadata/SKILL.md +406 -0
  34. package/content/guidance/b2c/b2c-metadata/references/SYSTEM-OBJECTS.md +320 -0
  35. package/content/guidance/b2c/b2c-metadata/references/XML-EXAMPLES.md +366 -0
  36. package/content/guidance/b2c/b2c-onboarding/SKILL.md +154 -0
  37. package/content/guidance/b2c/b2c-ordering/SKILL.md +391 -0
  38. package/content/guidance/b2c/b2c-page-designer/SKILL.md +410 -0
  39. package/content/guidance/b2c/b2c-page-designer/references/ATTRIBUTE-TYPES.md +436 -0
  40. package/content/guidance/b2c/b2c-page-designer/references/META-DEFINITIONS.md +340 -0
  41. package/content/guidance/b2c/b2c-querying-data/SKILL.md +289 -0
  42. package/content/guidance/b2c/b2c-querying-data/references/PERFORMANCE-APIS.md +74 -0
  43. package/content/guidance/b2c/b2c-scapi-admin/SKILL.md +53 -0
  44. package/content/guidance/b2c/b2c-scapi-admin/references/CLIENT-EXAMPLES.md +440 -0
  45. package/content/guidance/b2c/b2c-scapi-admin/references/INTEGRATION-PATTERNS.md +518 -0
  46. package/content/guidance/b2c/b2c-scapi-admin/references/OAUTH-SCOPES.md +337 -0
  47. package/content/guidance/b2c/b2c-scapi-shopper/SKILL.md +56 -0
  48. package/content/guidance/b2c/b2c-scapi-shopper/references/CHECKOUT-FLOW.md +466 -0
  49. package/content/guidance/b2c/b2c-scapi-shopper/references/CLIENT-EXAMPLES.md +351 -0
  50. package/content/guidance/b2c/b2c-scapi-shopper/references/COMMON-PATTERNS.md +390 -0
  51. package/content/guidance/b2c/b2c-scapi-shopper/references/SCOPES.md +290 -0
  52. package/content/guidance/b2c/b2c-slas-auth-patterns/SKILL.md +420 -0
  53. package/content/guidance/b2c/b2c-slas-auth-patterns/references/PASSKEYS.md +126 -0
  54. package/content/guidance/b2c/b2c-slas-auth-patterns/references/SESSION-BRIDGE.md +267 -0
  55. package/content/guidance/b2c/b2c-slas-auth-patterns/references/TOKEN-LIFECYCLE.md +367 -0
  56. package/content/guidance/b2c/b2c-webservices/SKILL.md +318 -0
  57. package/content/guidance/b2c/b2c-webservices/references/FTP-SERVICES.md +524 -0
  58. package/content/guidance/b2c/b2c-webservices/references/HTTP-SERVICES.md +578 -0
  59. package/content/guidance/b2c/b2c-webservices/references/SERVICES-XML.md +351 -0
  60. package/content/guidance/b2c/b2c-webservices/references/SOAP-SERVICES.md +587 -0
  61. package/content/guidance/b2c-cli/b2c-am/SKILL.md +277 -0
  62. package/content/guidance/b2c-cli/b2c-bm-users-roles/SKILL.md +210 -0
  63. package/content/guidance/b2c-cli/b2c-cap/SKILL.md +131 -0
  64. package/content/guidance/b2c-cli/b2c-cip/SKILL.md +116 -0
  65. package/content/guidance/b2c-cli/b2c-cip/references/KNOWN_TABLES.md +105 -0
  66. package/content/guidance/b2c-cli/b2c-cip/references/SALES_ANALYSIS.md +50 -0
  67. package/content/guidance/b2c-cli/b2c-cip/references/STARTER_QUERIES.md +147 -0
  68. package/content/guidance/b2c-cli/b2c-code/SKILL.md +146 -0
  69. package/content/guidance/b2c-cli/b2c-config/SKILL.md +462 -0
  70. package/content/guidance/b2c-cli/b2c-content/SKILL.md +176 -0
  71. package/content/guidance/b2c-cli/b2c-debug/SKILL.md +138 -0
  72. package/content/guidance/b2c-cli/b2c-docs/SKILL.md +301 -0
  73. package/content/guidance/b2c-cli/b2c-ecdn/SKILL.md +135 -0
  74. package/content/guidance/b2c-cli/b2c-ecdn/references/ADVANCED.md +97 -0
  75. package/content/guidance/b2c-cli/b2c-ecdn/references/SECURITY.md +75 -0
  76. package/content/guidance/b2c-cli/b2c-import-set-migrations/SKILL.md +265 -0
  77. package/content/guidance/b2c-cli/b2c-job/SKILL.md +64 -0
  78. package/content/guidance/b2c-cli/b2c-job/references/EXPORT.md +121 -0
  79. package/content/guidance/b2c-cli/b2c-job/references/IMPORT.md +55 -0
  80. package/content/guidance/b2c-cli/b2c-job/references/RUN-AND-MONITOR.md +119 -0
  81. package/content/guidance/b2c-cli/b2c-logs/SKILL.md +249 -0
  82. package/content/guidance/b2c-cli/b2c-metrics/SKILL.md +315 -0
  83. package/content/guidance/b2c-cli/b2c-mrt/SKILL.md +207 -0
  84. package/content/guidance/b2c-cli/b2c-mrt/references/BUNDLE-COMMANDS.md +203 -0
  85. package/content/guidance/b2c-cli/b2c-mrt/references/ENVIRONMENT-COMMANDS.md +218 -0
  86. package/content/guidance/b2c-cli/b2c-mrt/references/PROJECT-COMMANDS.md +154 -0
  87. package/content/guidance/b2c-cli/b2c-sandbox/SKILL.md +112 -0
  88. package/content/guidance/b2c-cli/b2c-scapi-custom/SKILL.md +126 -0
  89. package/content/guidance/b2c-cli/b2c-scapi-schemas/SKILL.md +66 -0
  90. package/content/guidance/b2c-cli/b2c-scapi-schemas/references/CLI-EXAMPLES.md +108 -0
  91. package/content/guidance/b2c-cli/b2c-site-import-export/SKILL.md +57 -0
  92. package/content/guidance/b2c-cli/b2c-site-import-export/references/IMPORT-OPTIONS.md +118 -0
  93. package/content/guidance/b2c-cli/b2c-site-import-export/references/METADATA-XML.md +381 -0
  94. package/content/guidance/b2c-cli/b2c-site-import-export/references/WORKFLOWS.md +182 -0
  95. package/content/guidance/b2c-cli/b2c-sites/SKILL.md +112 -0
  96. package/content/guidance/b2c-cli/b2c-slas/SKILL.md +182 -0
  97. package/content/guidance/b2c-cli/b2c-webdav/SKILL.md +186 -0
  98. package/content/guidance/b2c-ops/b2c-checkout-triage/SKILL.md +68 -0
  99. package/content/guidance/b2c-ops/b2c-job-health/SKILL.md +75 -0
  100. package/content/guidance/b2c-ops/b2c-job-health/references/job-logs.md +21 -0
  101. package/content/guidance/b2c-ops/b2c-order-failure-triage/SKILL.md +66 -0
  102. package/content/guidance/b2c-ops/b2c-order-failure-triage/references/order-evidence.md +87 -0
  103. package/content/guidance/b2c-ops/b2c-production-triage/SKILL.md +87 -0
  104. package/content/guidance/b2c-ops/b2c-production-triage/references/escalation.md +57 -0
  105. package/content/guidance/index.json +1949 -0
  106. package/content/guidance/storefront-next/sfnext-accessibility/SKILL.md +103 -0
  107. package/content/guidance/storefront-next/sfnext-accessibility/references/checklist.md +64 -0
  108. package/content/guidance/storefront-next/sfnext-analytics-consent/SKILL.md +91 -0
  109. package/content/guidance/storefront-next/sfnext-analytics-consent/references/CUSTOM-ADAPTER.md +49 -0
  110. package/content/guidance/storefront-next/sfnext-authentication/SKILL.md +127 -0
  111. package/content/guidance/storefront-next/sfnext-authentication/references/COOKIES.md +39 -0
  112. package/content/guidance/storefront-next/sfnext-authentication/references/LOGIN-FLOWS.md +59 -0
  113. package/content/guidance/storefront-next/sfnext-commerce-features/SKILL.md +67 -0
  114. package/content/guidance/storefront-next/sfnext-commerce-features/references/FEATURE-PREREQUISITES.md +37 -0
  115. package/content/guidance/storefront-next/sfnext-components/SKILL.md +153 -0
  116. package/content/guidance/storefront-next/sfnext-components/references/COMPONENT-AUTHORING.md +118 -0
  117. package/content/guidance/storefront-next/sfnext-components/references/SHAPE-TOKENS.md +51 -0
  118. package/content/guidance/storefront-next/sfnext-components/references/STORYBOOK.md +54 -0
  119. package/content/guidance/storefront-next/sfnext-components/references/TOKEN-SYSTEM.md +53 -0
  120. package/content/guidance/storefront-next/sfnext-components/references/TROUBLESHOOTING.md +19 -0
  121. package/content/guidance/storefront-next/sfnext-configuration/SKILL.md +163 -0
  122. package/content/guidance/storefront-next/sfnext-configuration/references/ENV-VARIABLES.md +55 -0
  123. package/content/guidance/storefront-next/sfnext-configuration/references/MULTI-SITE-URLS.md +137 -0
  124. package/content/guidance/storefront-next/sfnext-data-fetching/SKILL.md +140 -0
  125. package/content/guidance/storefront-next/sfnext-data-fetching/references/ACTIONS.md +53 -0
  126. package/content/guidance/storefront-next/sfnext-data-fetching/references/API-CLIENTS.md +34 -0
  127. package/content/guidance/storefront-next/sfnext-data-fetching/references/LOADERS.md +73 -0
  128. package/content/guidance/storefront-next/sfnext-data-fetching/references/SCAPI-FETCHER.md +39 -0
  129. package/content/guidance/storefront-next/sfnext-deployment/SKILL.md +127 -0
  130. package/content/guidance/storefront-next/sfnext-deployment/references/MRT-DEPLOYMENT.md +59 -0
  131. package/content/guidance/storefront-next/sfnext-extensions/SKILL.md +118 -0
  132. package/content/guidance/storefront-next/sfnext-extensions/references/ACTION-HOOKS.md +57 -0
  133. package/content/guidance/storefront-next/sfnext-extensions/references/BASE-AUDIT.md +68 -0
  134. package/content/guidance/storefront-next/sfnext-extensions/references/CLI-AND-INSTALL.md +58 -0
  135. package/content/guidance/storefront-next/sfnext-extensions/references/EXTENSION-EXAMPLES.md +79 -0
  136. package/content/guidance/storefront-next/sfnext-hybrid-storefronts/SKILL.md +93 -0
  137. package/content/guidance/storefront-next/sfnext-hybrid-storefronts/references/HYBRID-PROXY-CONFIG.md +86 -0
  138. package/content/guidance/storefront-next/sfnext-i18n/SKILL.md +152 -0
  139. package/content/guidance/storefront-next/sfnext-i18n/references/locale-config.md +35 -0
  140. package/content/guidance/storefront-next/sfnext-overview/SKILL.md +101 -0
  141. package/content/guidance/storefront-next/sfnext-page-designer/SKILL.md +202 -0
  142. package/content/guidance/storefront-next/sfnext-page-designer/references/BUSINESS-MANAGER.md +46 -0
  143. package/content/guidance/storefront-next/sfnext-page-designer/references/COMPONENT-REGISTRY.md +111 -0
  144. package/content/guidance/storefront-next/sfnext-page-designer/references/DECORATOR-PATTERNS.md +168 -0
  145. package/content/guidance/storefront-next/sfnext-page-designer/references/REVIEW-CHECKLIST.md +83 -0
  146. package/content/guidance/storefront-next/sfnext-page-designer/references/TROUBLESHOOTING.md +35 -0
  147. package/content/guidance/storefront-next/sfnext-performance/SKILL.md +102 -0
  148. package/content/guidance/storefront-next/sfnext-performance/references/PERFORMANCE-REVIEW-CHECKLIST.md +85 -0
  149. package/content/guidance/storefront-next/sfnext-performance/references/SUSPENSE-AND-STREAMING.md +58 -0
  150. package/content/guidance/storefront-next/sfnext-project-setup/SKILL.md +147 -0
  151. package/content/guidance/storefront-next/sfnext-project-setup/references/PROJECT-STRUCTURE.md +61 -0
  152. package/content/guidance/storefront-next/sfnext-project-setup/references/SCRIPTS.md +47 -0
  153. package/content/guidance/storefront-next/sfnext-project-setup/references/SFNEXT-CLI.md +63 -0
  154. package/content/guidance/storefront-next/sfnext-quality-gates/SKILL.md +70 -0
  155. package/content/guidance/storefront-next/sfnext-quality-gates/references/lint-and-budgets.md +39 -0
  156. package/content/guidance/storefront-next/sfnext-revalidation/SKILL.md +121 -0
  157. package/content/guidance/storefront-next/sfnext-revalidation/references/POLICIES-AND-TAGS.md +55 -0
  158. package/content/guidance/storefront-next/sfnext-routing/SKILL.md +123 -0
  159. package/content/guidance/storefront-next/sfnext-routing/references/ROUTE-CONVENTIONS.md +65 -0
  160. package/content/guidance/storefront-next/sfnext-routing/references/URLS-AND-SEO-ROUTES.md +22 -0
  161. package/content/guidance/storefront-next/sfnext-scapi/SKILL.md +126 -0
  162. package/content/guidance/storefront-next/sfnext-scapi/references/WORKED-EXAMPLE.md +39 -0
  163. package/content/guidance/storefront-next/sfnext-security/SKILL.md +129 -0
  164. package/content/guidance/storefront-next/sfnext-security/references/COOKIE-DOMAIN.md +39 -0
  165. package/content/guidance/storefront-next/sfnext-security/references/TURNSTILE.md +43 -0
  166. package/content/guidance/storefront-next/sfnext-seo/SKILL.md +95 -0
  167. package/content/guidance/storefront-next/sfnext-seo/references/MULTI-DOMAIN-BASE-PATH.md +17 -0
  168. package/content/guidance/storefront-next/sfnext-seo/references/SEO-ROUTES.md +31 -0
  169. package/content/guidance/storefront-next/sfnext-state-management/SKILL.md +114 -0
  170. package/content/guidance/storefront-next/sfnext-state-management/references/PATTERNS.md +45 -0
  171. package/content/guidance/storefront-next/sfnext-testing/SKILL.md +151 -0
  172. package/content/guidance/storefront-next/sfnext-testing/references/E2E.md +38 -0
  173. package/content/guidance/storefront-next/sfnext-testing/references/STORYBOOK-PATTERNS.md +97 -0
  174. package/content/guidance/storefront-next/sfnext-testing/references/UNIT-AND-ROUTE-TESTS.md +60 -0
  175. package/content/guidance/storefront-next/sfnext-theming/SKILL.md +104 -0
  176. package/content/guidance/storefront-next/sfnext-theming/references/REBRAND-CHECKLIST.md +29 -0
  177. package/dist/commands/cap/install.d.ts +1 -0
  178. package/dist/commands/cap/list.d.ts +1 -0
  179. package/dist/commands/cap/pull.d.ts +1 -0
  180. package/dist/commands/cap/tasks.d.ts +1 -0
  181. package/dist/commands/cap/uninstall.d.ts +1 -0
  182. package/dist/commands/cip/describe.d.ts +1 -0
  183. package/dist/commands/cip/query.d.ts +1 -0
  184. package/dist/commands/cip/report/bot-traffic-share.d.ts +1 -0
  185. package/dist/commands/cip/report/checkout-funnel-dropoff.d.ts +1 -0
  186. package/dist/commands/cip/report/controller-error-rate-trend.d.ts +1 -0
  187. package/dist/commands/cip/report/controller-health-scorecard.d.ts +1 -0
  188. package/dist/commands/cip/report/customer-registration-trends.d.ts +1 -0
  189. package/dist/commands/cip/report/discount-depth-breakdown.d.ts +1 -0
  190. package/dist/commands/cip/report/inventory-stockout-by-location.d.ts +1 -0
  191. package/dist/commands/cip/report/new-vs-returning-buyer-revenue.d.ts +1 -0
  192. package/dist/commands/cip/report/ocapi-client-usage.d.ts +1 -0
  193. package/dist/commands/cip/report/ocapi-requests.d.ts +1 -0
  194. package/dist/commands/cip/report/payment-method-performance.d.ts +1 -0
  195. package/dist/commands/cip/report/product-co-purchase-analysis.d.ts +1 -0
  196. package/dist/commands/cip/report/promotion-discount-analysis.d.ts +1 -0
  197. package/dist/commands/cip/report/promotion-roi-leaderboard.d.ts +1 -0
  198. package/dist/commands/cip/report/recommender-effectiveness.d.ts +1 -0
  199. package/dist/commands/cip/report/remote-include-performance.d.ts +1 -0
  200. package/dist/commands/cip/report/revenue-by-channel.d.ts +1 -0
  201. package/dist/commands/cip/report/sales-analytics.d.ts +1 -0
  202. package/dist/commands/cip/report/sales-summary.d.ts +1 -0
  203. package/dist/commands/cip/report/scapi-cache-hit-ratio.d.ts +1 -0
  204. package/dist/commands/cip/report/scapi-error-rate-by-status.d.ts +1 -0
  205. package/dist/commands/cip/report/scapi-latency-distribution.d.ts +1 -0
  206. package/dist/commands/cip/report/scapi-traffic-latency.d.ts +1 -0
  207. package/dist/commands/cip/report/search-query-performance.d.ts +1 -0
  208. package/dist/commands/cip/report/top-referrers.d.ts +1 -0
  209. package/dist/commands/cip/report/top-selling-products.d.ts +1 -0
  210. package/dist/commands/cip/report/zero-result-searches.d.ts +1 -0
  211. package/dist/commands/cip/tables.d.ts +1 -0
  212. package/dist/commands/code/activate.d.ts +1 -0
  213. package/dist/commands/code/delete.d.ts +1 -0
  214. package/dist/commands/code/deploy.d.ts +1 -0
  215. package/dist/commands/code/download.d.ts +1 -0
  216. package/dist/commands/code/watch.d.ts +1 -0
  217. package/dist/commands/commands/search.d.ts +35 -0
  218. package/dist/commands/commands/search.js +85 -0
  219. package/dist/commands/commands/search.js.map +1 -0
  220. package/dist/commands/content/export.d.ts +1 -0
  221. package/dist/commands/content/list.d.ts +1 -0
  222. package/dist/commands/content/validate.d.ts +1 -0
  223. package/dist/commands/debug/cli.d.ts +1 -0
  224. package/dist/commands/debug/index.d.ts +1 -0
  225. package/dist/commands/docs/cache.d.ts +1 -0
  226. package/dist/commands/docs/download.d.ts +1 -0
  227. package/dist/commands/docs/read.d.ts +1 -0
  228. package/dist/commands/docs/schema.d.ts +1 -0
  229. package/dist/commands/docs/search.d.ts +1 -0
  230. package/dist/commands/docs/skill.d.ts +41 -0
  231. package/dist/commands/docs/skill.js +183 -0
  232. package/dist/commands/docs/skill.js.map +1 -0
  233. package/dist/commands/ecdn/cache/purge.d.ts +1 -0
  234. package/dist/commands/ecdn/certificates/add.d.ts +1 -0
  235. package/dist/commands/ecdn/certificates/delete.d.ts +1 -0
  236. package/dist/commands/ecdn/certificates/list.d.ts +1 -0
  237. package/dist/commands/ecdn/certificates/update.d.ts +1 -0
  238. package/dist/commands/ecdn/certificates/validate.d.ts +1 -0
  239. package/dist/commands/ecdn/cipher-suites/get.d.ts +1 -0
  240. package/dist/commands/ecdn/cipher-suites/update.d.ts +1 -0
  241. package/dist/commands/ecdn/firewall/create.d.ts +1 -0
  242. package/dist/commands/ecdn/firewall/delete.d.ts +1 -0
  243. package/dist/commands/ecdn/firewall/get.d.ts +1 -0
  244. package/dist/commands/ecdn/firewall/list.d.ts +1 -0
  245. package/dist/commands/ecdn/firewall/reorder.d.ts +1 -0
  246. package/dist/commands/ecdn/firewall/update.d.ts +1 -0
  247. package/dist/commands/ecdn/logpush/jobs/create.d.ts +1 -0
  248. package/dist/commands/ecdn/logpush/jobs/delete.d.ts +1 -0
  249. package/dist/commands/ecdn/logpush/jobs/get.d.ts +1 -0
  250. package/dist/commands/ecdn/logpush/jobs/list.d.ts +1 -0
  251. package/dist/commands/ecdn/logpush/jobs/update.d.ts +1 -0
  252. package/dist/commands/ecdn/logpush/ownership.d.ts +1 -0
  253. package/dist/commands/ecdn/mrt-rules/create.d.ts +1 -0
  254. package/dist/commands/ecdn/mrt-rules/delete.d.ts +1 -0
  255. package/dist/commands/ecdn/mrt-rules/get.d.ts +1 -0
  256. package/dist/commands/ecdn/mrt-rules/rules/delete.d.ts +1 -0
  257. package/dist/commands/ecdn/mrt-rules/rules/update.d.ts +1 -0
  258. package/dist/commands/ecdn/mrt-rules/update.d.ts +1 -0
  259. package/dist/commands/ecdn/mtls/create.d.ts +1 -0
  260. package/dist/commands/ecdn/mtls/delete.d.ts +1 -0
  261. package/dist/commands/ecdn/mtls/get.d.ts +1 -0
  262. package/dist/commands/ecdn/mtls/issue.d.ts +1 -0
  263. package/dist/commands/ecdn/mtls/list.d.ts +1 -0
  264. package/dist/commands/ecdn/mtls/setup.d.ts +1 -0
  265. package/dist/commands/ecdn/origin-headers/delete.d.ts +1 -0
  266. package/dist/commands/ecdn/origin-headers/get.d.ts +1 -0
  267. package/dist/commands/ecdn/origin-headers/set.d.ts +1 -0
  268. package/dist/commands/ecdn/page-shield/notifications/create.d.ts +1 -0
  269. package/dist/commands/ecdn/page-shield/notifications/delete.d.ts +1 -0
  270. package/dist/commands/ecdn/page-shield/notifications/list.d.ts +1 -0
  271. package/dist/commands/ecdn/page-shield/policies/create.d.ts +1 -0
  272. package/dist/commands/ecdn/page-shield/policies/delete.d.ts +1 -0
  273. package/dist/commands/ecdn/page-shield/policies/get.d.ts +1 -0
  274. package/dist/commands/ecdn/page-shield/policies/list.d.ts +1 -0
  275. package/dist/commands/ecdn/page-shield/policies/update.d.ts +1 -0
  276. package/dist/commands/ecdn/page-shield/scripts/get.d.ts +1 -0
  277. package/dist/commands/ecdn/page-shield/scripts/list.d.ts +1 -0
  278. package/dist/commands/ecdn/rate-limit/create.d.ts +1 -0
  279. package/dist/commands/ecdn/rate-limit/delete.d.ts +1 -0
  280. package/dist/commands/ecdn/rate-limit/get.d.ts +1 -0
  281. package/dist/commands/ecdn/rate-limit/list.d.ts +1 -0
  282. package/dist/commands/ecdn/rate-limit/update.d.ts +1 -0
  283. package/dist/commands/ecdn/security/get.d.ts +1 -0
  284. package/dist/commands/ecdn/security/update.d.ts +1 -0
  285. package/dist/commands/ecdn/speed/get.d.ts +1 -0
  286. package/dist/commands/ecdn/speed/update.d.ts +1 -0
  287. package/dist/commands/ecdn/waf/groups/list.d.ts +1 -0
  288. package/dist/commands/ecdn/waf/groups/update.d.ts +1 -0
  289. package/dist/commands/ecdn/waf/managed-rules/list.d.ts +1 -0
  290. package/dist/commands/ecdn/waf/managed-rules/update.d.ts +1 -0
  291. package/dist/commands/ecdn/waf/migrate.d.ts +1 -0
  292. package/dist/commands/ecdn/waf/owasp/get.d.ts +1 -0
  293. package/dist/commands/ecdn/waf/owasp/update.d.ts +1 -0
  294. package/dist/commands/ecdn/waf/rules/get.d.ts +1 -0
  295. package/dist/commands/ecdn/waf/rules/list.d.ts +1 -0
  296. package/dist/commands/ecdn/waf/rules/update.d.ts +1 -0
  297. package/dist/commands/ecdn/waf/rulesets/list.d.ts +1 -0
  298. package/dist/commands/ecdn/waf/rulesets/update.d.ts +1 -0
  299. package/dist/commands/ecdn/zones/create.d.ts +1 -0
  300. package/dist/commands/ecdn/zones/list.d.ts +1 -0
  301. package/dist/commands/job/execution/delete.d.ts +1 -0
  302. package/dist/commands/job/export.d.ts +1 -0
  303. package/dist/commands/job/import-set.d.ts +1 -0
  304. package/dist/commands/job/import.d.ts +1 -0
  305. package/dist/commands/job/log.d.ts +1 -0
  306. package/dist/commands/job/run.d.ts +1 -0
  307. package/dist/commands/job/search.d.ts +1 -0
  308. package/dist/commands/job/wait.d.ts +1 -0
  309. package/dist/commands/logs/get.d.ts +1 -0
  310. package/dist/commands/logs/list.d.ts +1 -0
  311. package/dist/commands/logs/tail.d.ts +1 -0
  312. package/dist/commands/metrics/controller.d.ts +1 -0
  313. package/dist/commands/metrics/ecdn.d.ts +1 -0
  314. package/dist/commands/metrics/mrt.d.ts +1 -0
  315. package/dist/commands/metrics/ocapi.d.ts +1 -0
  316. package/dist/commands/metrics/overall.d.ts +1 -0
  317. package/dist/commands/metrics/sales.d.ts +1 -0
  318. package/dist/commands/metrics/scapi-hooks.d.ts +1 -0
  319. package/dist/commands/metrics/scapi.d.ts +1 -0
  320. package/dist/commands/metrics/third-party.d.ts +1 -0
  321. package/dist/commands/mrt/bundle/delete.d.ts +1 -0
  322. package/dist/commands/mrt/bundle/deploy.d.ts +1 -0
  323. package/dist/commands/mrt/bundle/download.d.ts +1 -0
  324. package/dist/commands/mrt/bundle/history.d.ts +1 -0
  325. package/dist/commands/mrt/bundle/list.d.ts +1 -0
  326. package/dist/commands/mrt/bundle/save.d.ts +1 -0
  327. package/dist/commands/mrt/bundle/upload-v2.d.ts +1 -0
  328. package/dist/commands/mrt/env/access-control/list.d.ts +1 -0
  329. package/dist/commands/mrt/env/b2c.d.ts +1 -0
  330. package/dist/commands/mrt/env/clone.d.ts +1 -0
  331. package/dist/commands/mrt/env/create.d.ts +1 -0
  332. package/dist/commands/mrt/env/delete.d.ts +1 -0
  333. package/dist/commands/mrt/env/get.d.ts +1 -0
  334. package/dist/commands/mrt/env/invalidate.d.ts +1 -0
  335. package/dist/commands/mrt/env/list.d.ts +1 -0
  336. package/dist/commands/mrt/env/redirect/clone.d.ts +1 -0
  337. package/dist/commands/mrt/env/redirect/create.d.ts +1 -0
  338. package/dist/commands/mrt/env/redirect/delete.d.ts +1 -0
  339. package/dist/commands/mrt/env/redirect/list.d.ts +1 -0
  340. package/dist/commands/mrt/env/update.d.ts +1 -0
  341. package/dist/commands/mrt/env/var/delete.d.ts +1 -0
  342. package/dist/commands/mrt/env/var/list.d.ts +1 -0
  343. package/dist/commands/mrt/env/var/push.d.ts +1 -0
  344. package/dist/commands/mrt/env/var/set.d.ts +1 -0
  345. package/dist/commands/mrt/org/b2c.d.ts +1 -0
  346. package/dist/commands/mrt/org/cert/create.d.ts +1 -0
  347. package/dist/commands/mrt/org/cert/delete.d.ts +1 -0
  348. package/dist/commands/mrt/org/cert/get.d.ts +1 -0
  349. package/dist/commands/mrt/org/cert/list.d.ts +1 -0
  350. package/dist/commands/mrt/org/cert/restart-validation.d.ts +1 -0
  351. package/dist/commands/mrt/org/list.d.ts +1 -0
  352. package/dist/commands/mrt/org/member/add.d.ts +1 -0
  353. package/dist/commands/mrt/org/member/get.d.ts +1 -0
  354. package/dist/commands/mrt/org/member/list.d.ts +1 -0
  355. package/dist/commands/mrt/org/member/remove.d.ts +1 -0
  356. package/dist/commands/mrt/org/member/update.d.ts +1 -0
  357. package/dist/commands/mrt/project/create.d.ts +1 -0
  358. package/dist/commands/mrt/project/delete.d.ts +1 -0
  359. package/dist/commands/mrt/project/get.d.ts +1 -0
  360. package/dist/commands/mrt/project/list.d.ts +1 -0
  361. package/dist/commands/mrt/project/member/add.d.ts +1 -0
  362. package/dist/commands/mrt/project/member/get.d.ts +1 -0
  363. package/dist/commands/mrt/project/member/list.d.ts +1 -0
  364. package/dist/commands/mrt/project/member/remove.d.ts +1 -0
  365. package/dist/commands/mrt/project/member/update.d.ts +1 -0
  366. package/dist/commands/mrt/project/notification/delete.d.ts +1 -0
  367. package/dist/commands/mrt/project/notification/get.d.ts +1 -0
  368. package/dist/commands/mrt/project/update.d.ts +1 -0
  369. package/dist/commands/mrt/save-credentials.d.ts +1 -0
  370. package/dist/commands/mrt/tail-logs.d.ts +1 -0
  371. package/dist/commands/mrt/user/api-key.d.ts +1 -0
  372. package/dist/commands/mrt/user/email-prefs.d.ts +1 -0
  373. package/dist/commands/mrt/user/profile.d.ts +1 -0
  374. package/dist/commands/scaffold/init.js +2 -1
  375. package/dist/commands/scaffold/init.js.map +1 -1
  376. package/dist/commands/scapi/custom/status.d.ts +1 -0
  377. package/dist/commands/scapi/schemas/get.d.ts +1 -0
  378. package/dist/commands/scapi/schemas/list.d.ts +1 -0
  379. package/dist/commands/setup/ide/tsserver-plugin.d.ts +1 -0
  380. package/dist/commands/setup/ide/vscode-types.d.ts +1 -0
  381. package/dist/commands/setup/index.js +4 -3
  382. package/dist/commands/setup/index.js.map +1 -1
  383. package/dist/commands/setup/inspect.d.ts +1 -0
  384. package/dist/commands/setup/inspect.js +17 -2
  385. package/dist/commands/setup/inspect.js.map +1 -1
  386. package/dist/commands/setup/instance/create.d.ts +1 -0
  387. package/dist/commands/setup/instance/list.d.ts +1 -0
  388. package/dist/commands/setup/instance/remove.d.ts +1 -0
  389. package/dist/commands/setup/instance/set-active.d.ts +1 -0
  390. package/dist/commands/setup/openshell.d.ts +1 -0
  391. package/dist/commands/setup/skills.d.ts +1 -0
  392. package/dist/commands/slas/client/create.d.ts +1 -0
  393. package/dist/commands/slas/client/delete.d.ts +1 -0
  394. package/dist/commands/slas/client/get.d.ts +1 -0
  395. package/dist/commands/slas/client/list.d.ts +1 -0
  396. package/dist/commands/slas/client/open.d.ts +1 -0
  397. package/dist/commands/slas/client/update.d.ts +1 -0
  398. package/dist/commands/slas/token.d.ts +1 -0
  399. package/dist/commands/slas/token.js +2 -1
  400. package/dist/commands/slas/token.js.map +1 -1
  401. package/dist/commands/webdav/get.d.ts +1 -0
  402. package/dist/commands/webdav/mkdir.d.ts +2 -0
  403. package/dist/commands/webdav/mkdir.js +5 -3
  404. package/dist/commands/webdav/mkdir.js.map +1 -1
  405. package/dist/commands/webdav/put.d.ts +2 -0
  406. package/dist/commands/webdav/put.js +5 -3
  407. package/dist/commands/webdav/put.js.map +1 -1
  408. package/dist/commands/webdav/rm.d.ts +1 -0
  409. package/dist/help.d.ts +25 -0
  410. package/dist/help.js +96 -0
  411. package/dist/help.js.map +1 -0
  412. package/dist/lib/scaffold/generate-helper.js +3 -2
  413. package/dist/lib/scaffold/generate-helper.js.map +1 -1
  414. package/dist/lib/skills.d.ts +19 -0
  415. package/dist/lib/skills.js +75 -0
  416. package/dist/lib/skills.js.map +1 -0
  417. package/dist/utils/cip/command.d.ts +1 -0
  418. package/dist/utils/ecdn/zone-command.d.ts +1 -0
  419. package/dist/utils/slas/client.d.ts +1 -0
  420. package/oclif.manifest.json +10994 -7653
  421. package/package.json +11 -5
@@ -0,0 +1,420 @@
1
+ ---
2
+ name: b2c-slas-auth-patterns
3
+ description: Implement SLAS authentication patterns in B2C Commerce including passwordless login (email OTP, SMS OTP, passkeys), session bridging between PWA Kit/Storefront Next and SFRA, hybrid authentication (B2C 25.3+), token refresh flows, trusted system on behalf of (TSOB), and JWT validation. Use this skill whenever the user asks about shopper authentication beyond basic login, token exchange flows, passwordless or biometric auth, keeping sessions alive across storefronts, handling 409 Conflict errors on token endpoints, refreshing shopper tokens, or validating JWTs — even if they don't mention SLAS by name.
4
+ ---
5
+
6
+ # B2C SLAS Authentication Patterns
7
+
8
+ Advanced authentication patterns for SLAS (Shopper Login and API Access Service) beyond basic login. These patterns enable passwordless authentication, hybrid storefront support, and system-to-system integration.
9
+
10
+ ## Scope & grounding
11
+
12
+ This skill covers SLAS authentication patterns including passwordless login (email OTP, SMS, passkeys), session bridging, hybrid authentication (B2C 25.3+), token management, TSOB, and JWT validation with framework-specific examples for PWA Kit, Storefront Next, and SFRA. Code examples are illustrative of typical flows. Before answering version-specific questions, framework-specific implementations, or providing code the user will run in production, confirm current API contracts, parameters, rate limits, and version requirements against the official documentation via `b2c docs search` and `b2c docs read`. The canonical docs are the authoritative source for B2C platform specifics, API shapes, and configuration requirements.
13
+
14
+ ### Canonical docs
15
+
16
+ - `commerce-api/slas` - SLAS overview
17
+ - `commerce-api/slas-best-practices` - Security and implementation best practices
18
+ - `commerce-api/slas-passwordless-login-overview` - Passwordless authentication overview
19
+ - `commerce-api/slas-passwordless-login-email` - Email OTP implementation
20
+ - `commerce-api/slas-passwordless-login-passkey` - Passkey/WebAuthn implementation
21
+ - `commerce-api/slas-passwordless-sms` - SMS OTP implementation
22
+ - `commerce-api/slas-session-bridge-overview` - Session bridge overview
23
+ - `commerce-api/slas-session-bridge-auth` - Session bridge implementation
24
+ - `commerce-api/hybrid-authentication` - Hybrid authentication (B2C 25.3+)
25
+ - `commerce-api/hybrid-auth-pwa-kit-v2` - PWA Kit v2 hybrid auth
26
+ - `pwa-kit-managed-runtime/hybrid-auth` - PWA Kit managed runtime hybrid auth
27
+ - `pwa-kit-managed-runtime/plugin-slas-setup` - Plugin SLAS setup
28
+ - `commerce-api/slas-trusted-system` - Trusted system on behalf (TSOB)
29
+ - `commerce-api/slas-public-client` - Public client configuration
30
+ - `commerce-api/slas-private-client` - Private client configuration
31
+ - `commerce-api/slas-validate-jwt-with-jwks` - JWT validation
32
+
33
+ ## Authentication Methods Overview
34
+
35
+ | Method | Use Case | User Experience |
36
+ |--------|----------|-----------------|
37
+ | Password | Traditional login | Username + password form |
38
+ | Email OTP | Passwordless email | Code sent to email |
39
+ | SMS OTP | Passwordless SMS | Code sent to phone |
40
+ | Passkeys | FIDO2/WebAuthn | Biometric or device PIN |
41
+ | Session Bridge | Hybrid storefronts | Seamless PWA ↔ SFRA |
42
+ | Hybrid Auth | B2C 25.3+ | Built-in platform auth sync |
43
+ | TSOB | System integration | Backend service calls |
44
+
45
+ ## Passwordless Email OTP
46
+
47
+ > Illustrative of the flow; confirm current API shape, parameters, and rate limits with `b2c docs read commerce-api/slas-passwordless-login-email` and `b2c docs read commerce-api/slas-passwordless-login-overview`.
48
+
49
+ Send one-time passwords via email for passwordless login.
50
+
51
+ ### Flow Overview
52
+
53
+ 1. Call `/oauth2/passwordless/login` with callback URI
54
+ 2. SLAS POSTs `pwdless_login_token` to your callback
55
+ 3. Your app sends OTP to shopper via email
56
+ 4. Shopper enters OTP, app exchanges for tokens
57
+
58
+ ### Step 1: Initiate Passwordless Login
59
+
60
+ ```javascript
61
+ // POST /shopper/auth/v1/organizations/{org}/oauth2/passwordless/login
62
+ async function initiatePasswordlessLogin(email, siteId) {
63
+ const response = await fetch(
64
+ `https://${shortCode}.api.commercecloud.salesforce.com/shopper/auth/v1/organizations/${orgId}/oauth2/passwordless/login`,
65
+ {
66
+ method: 'POST',
67
+ headers: {
68
+ 'Content-Type': 'application/x-www-form-urlencoded'
69
+ },
70
+ body: new URLSearchParams({
71
+ user_id: email,
72
+ mode: 'callback',
73
+ channel_id: siteId,
74
+ callback_uri: 'https://yoursite.com/api/passwordless/callback'
75
+ })
76
+ }
77
+ );
78
+
79
+ // SLAS will POST to your callback_uri with pwdless_login_token
80
+ return response.json();
81
+ }
82
+ ```
83
+
84
+ ### Step 2: Handle Callback and Send OTP
85
+
86
+ Your callback endpoint receives `pwdless_login_token`. Generate an OTP and send it to the user:
87
+
88
+ ```javascript
89
+ // Your callback endpoint (receives POST from SLAS)
90
+ app.post('/api/passwordless/callback', async (req, res) => {
91
+ const { pwdless_login_token, user_id } = req.body;
92
+
93
+ // Generate 6-digit OTP
94
+ const otp = Math.floor(100000 + Math.random() * 900000).toString();
95
+
96
+ // Store token + OTP mapping (e.g., Redis with 10 min TTL)
97
+ await redis.setex(`pwdless:${otp}`, 600, JSON.stringify({
98
+ token: pwdless_login_token,
99
+ email: user_id
100
+ }));
101
+
102
+ // Send OTP via email (configure in SLAS Admin UI)
103
+ await sendOTPEmail(user_id, otp);
104
+
105
+ res.status(200).send('OK');
106
+ });
107
+ ```
108
+
109
+ ### Step 3: Exchange OTP for Tokens
110
+
111
+ ```javascript
112
+ // POST /shopper/auth/v1/organizations/{org}/oauth2/passwordless/token
113
+ async function exchangeOTPForToken(otp, clientId, clientSecret, siteId) {
114
+ // Retrieve stored token
115
+ const stored = JSON.parse(await redis.get(`pwdless:${otp}`));
116
+ if (!stored) throw new Error('Invalid or expired OTP');
117
+
118
+ const response = await fetch(
119
+ `https://${shortCode}.api.commercecloud.salesforce.com/shopper/auth/v1/organizations/${orgId}/oauth2/passwordless/token`,
120
+ {
121
+ method: 'POST',
122
+ headers: {
123
+ 'Content-Type': 'application/x-www-form-urlencoded',
124
+ 'Authorization': `Basic ${btoa(clientId + ':' + clientSecret)}`
125
+ },
126
+ body: new URLSearchParams({
127
+ grant_type: 'client_credentials',
128
+ hint: 'pwdless_login',
129
+ pwdless_login_token: stored.token,
130
+ channel_id: siteId
131
+ })
132
+ }
133
+ );
134
+
135
+ // Returns: { access_token, refresh_token, ... }
136
+ return response.json();
137
+ }
138
+ ```
139
+
140
+ ### Rate Limits
141
+
142
+ - 6 requests per user per 10 minutes
143
+ - 1,000 requests/month per endpoint on non-production tenants
144
+
145
+ ## Passwordless SMS OTP
146
+
147
+ Send OTP via SMS using Marketing Cloud or custom integration.
148
+
149
+ ### Using Marketing Cloud
150
+
151
+ Configure SMS through Salesforce Marketing Cloud:
152
+
153
+ 1. Set up Marketing Cloud connector
154
+ 2. Configure SMS journey with OTP template
155
+ 3. Trigger via SLAS callback (same flow as email OTP)
156
+
157
+ ### Custom SMS Provider
158
+
159
+ Use the same callback flow as email, but send via SMS provider:
160
+
161
+ ```javascript
162
+ // In your callback handler
163
+ const twilio = require('twilio')(accountSid, authToken);
164
+
165
+ async function sendOTPSMS(phoneNumber, otp) {
166
+ await twilio.messages.create({
167
+ body: `Your login code is: ${otp}`,
168
+ from: '+1234567890',
169
+ to: phoneNumber
170
+ });
171
+ }
172
+ ```
173
+
174
+ ## Passkeys (FIDO2/WebAuthn)
175
+
176
+ > Illustrative of the flow; confirm current API shape and parameters with `b2c docs read commerce-api/slas-passwordless-login-passkey`.
177
+
178
+ Enable biometric authentication using FIDO2/WebAuthn passkeys. Registration requires prior identity verification via OTP. The flow involves starting registration with SLAS, creating a credential via the browser WebAuthn API, then completing registration. Authentication follows a similar start/authenticate/finish pattern.
179
+
180
+ See [references/PASSKEYS.md](references/PASSKEYS.md) for full registration and authentication code examples.
181
+
182
+ ## Session Bridge
183
+
184
+ > Illustrative of the flow; confirm current API shape and platform-agnostic patterns with `b2c docs read commerce-api/slas-session-bridge-overview` and `b2c docs read commerce-api/slas-session-bridge-auth`. PWA Kit examples are framework-specific.
185
+
186
+ Maintain session continuity between PWA Kit and SFRA storefronts using signed bridge tokens (`dwsgst` for guest, `dwsrst` for registered). Supports both PWA-to-SFRA and SFRA-to-PWA directions. Note that DWSID is deprecated for registered shoppers.
187
+
188
+ See [references/SESSION-BRIDGE.md](references/SESSION-BRIDGE.md) for full implementation details including token generation, redirect patterns, callback handlers, and error handling.
189
+
190
+ ## Hybrid Authentication (B2C 25.3+)
191
+
192
+ > Illustrative of the concept; confirm version requirements and migration guidance with `b2c docs read commerce-api/hybrid-authentication`.
193
+
194
+ **Hybrid Auth replaces Plugin SLAS** for hybrid PWA/SFRA storefronts. It's built directly into the B2C platform and provides automatic session synchronization.
195
+
196
+ ### Benefits
197
+
198
+ - No manual session bridge implementation needed
199
+ - Automatic sync between PWA and SFRA
200
+ - Simplified token management
201
+ - Built-in platform support
202
+
203
+ ### Migration from Plugin SLAS
204
+
205
+ If using Plugin SLAS, migrate to Hybrid Auth:
206
+
207
+ 1. Upgrade to B2C Commerce 25.3+
208
+ 2. Enable Hybrid Auth in Business Manager
209
+ 3. Remove Plugin SLAS cartridge
210
+ 4. Update storefront to use platform auth
211
+
212
+ ## Token Refresh
213
+
214
+ > Illustrative of the flow; confirm parameter requirements and token rotation behavior with `b2c docs read commerce-api/slas-public-client` and `b2c docs read commerce-api/slas-private-client`.
215
+
216
+ **Important:** The `channel_id` parameter is **required** for guest token refresh.
217
+
218
+ ### Public Clients (Single-Use Refresh)
219
+
220
+ Public clients (no secret) receive single-use refresh tokens:
221
+
222
+ ```javascript
223
+ async function refreshTokenPublic(refreshToken, clientId, siteId) {
224
+ const response = await fetch(
225
+ `https://${shortCode}.api.commercecloud.salesforce.com/shopper/auth/v1/organizations/${orgId}/oauth2/token`,
226
+ {
227
+ method: 'POST',
228
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
229
+ body: new URLSearchParams({
230
+ grant_type: 'refresh_token',
231
+ refresh_token: refreshToken,
232
+ client_id: clientId,
233
+ channel_id: siteId // REQUIRED
234
+ })
235
+ }
236
+ );
237
+
238
+ // Returns NEW refresh_token (old one is invalidated)
239
+ return response.json();
240
+ }
241
+ ```
242
+
243
+ ### Private Clients (Reusable Refresh)
244
+
245
+ Private clients can reuse refresh tokens:
246
+
247
+ ```javascript
248
+ async function refreshTokenPrivate(refreshToken, clientId, clientSecret, siteId) {
249
+ const response = await fetch(
250
+ `https://${shortCode}.api.commercecloud.salesforce.com/shopper/auth/v1/organizations/${orgId}/oauth2/token`,
251
+ {
252
+ method: 'POST',
253
+ headers: {
254
+ 'Content-Type': 'application/x-www-form-urlencoded',
255
+ 'Authorization': `Basic ${btoa(clientId + ':' + clientSecret)}`
256
+ },
257
+ body: new URLSearchParams({
258
+ grant_type: 'refresh_token',
259
+ refresh_token: refreshToken,
260
+ channel_id: siteId // REQUIRED
261
+ })
262
+ }
263
+ );
264
+
265
+ // Same refresh_token can be used again
266
+ return response.json();
267
+ }
268
+ ```
269
+
270
+ ## Trusted System on Behalf (TSOB)
271
+
272
+ > Illustrative of the flow; confirm current API shape and configuration requirements with `b2c docs read commerce-api/slas-trusted-system`.
273
+
274
+ Server-to-server authentication to act on behalf of a shopper.
275
+
276
+ ### Use Cases
277
+
278
+ - Backend services accessing shopper data
279
+ - Order management systems
280
+ - Customer service applications
281
+
282
+ ### Get Token on Behalf of Shopper
283
+
284
+ ```javascript
285
+ async function getTSOBToken(shopperLoginId) {
286
+ const response = await fetch(
287
+ `https://${shortCode}.api.commercecloud.salesforce.com/shopper/auth/v1/organizations/${orgId}/oauth2/trusted-system/token`,
288
+ {
289
+ method: 'POST',
290
+ headers: {
291
+ 'Content-Type': 'application/x-www-form-urlencoded',
292
+ 'Authorization': `Basic ${btoa(clientId + ':' + clientSecret)}`
293
+ },
294
+ body: new URLSearchParams({
295
+ grant_type: 'client_credentials',
296
+ login_id: shopperLoginId,
297
+ channel_id: siteId,
298
+ usid: shopperUsid // Optional: reuse existing session
299
+ })
300
+ }
301
+ );
302
+
303
+ // Returns tokens that act as the specified shopper
304
+ return response.json();
305
+ }
306
+ ```
307
+
308
+ ### Important Constraints
309
+
310
+ **3-Second Protection Window:** Multiple TSOB calls for the same shopper within 3 seconds return HTTP 409:
311
+
312
+ ```
313
+ "Tenant id <id> has already performed a login operation for user id <user_id> in the last 3 seconds."
314
+ ```
315
+
316
+ Handle this in your code:
317
+
318
+ ```javascript
319
+ async function getTSOBTokenWithRetry(shopperLoginId, maxRetries = 3) {
320
+ for (let i = 0; i < maxRetries; i++) {
321
+ try {
322
+ return await getTSOBToken(shopperLoginId);
323
+ } catch (error) {
324
+ if (error.status === 409 && i < maxRetries - 1) {
325
+ await new Promise(r => setTimeout(r, 3000));
326
+ continue;
327
+ }
328
+ throw error;
329
+ }
330
+ }
331
+ }
332
+ ```
333
+
334
+ ### Required Configuration
335
+
336
+ 1. SLAS client must have TSOB enabled (`sfcc.ts_ext_on_behalf_of` scope)
337
+ 2. Configure in SLAS Admin API or Business Manager
338
+ 3. Secure the client secret (server-side only)
339
+ 4. Keep `login_id` length under 60 characters
340
+
341
+ ## JWT Validation
342
+
343
+ > Illustrative of the flow; confirm current API shape and validation patterns with `b2c docs read commerce-api/slas-validate-jwt-with-jwks`.
344
+
345
+ Validate SLAS tokens using JWKS (JSON Web Key Set).
346
+
347
+ ### Get JWKS
348
+
349
+ ```javascript
350
+ async function getJWKS() {
351
+ const response = await fetch(
352
+ `https://${shortCode}.api.commercecloud.salesforce.com/shopper/auth/v1/organizations/${orgId}/oauth2/jwks`
353
+ );
354
+ return response.json();
355
+ }
356
+ ```
357
+
358
+ ### Validate Token
359
+
360
+ ```javascript
361
+ const jose = require('jose');
362
+
363
+ async function validateToken(accessToken) {
364
+ // Get JWKS
365
+ const jwksUrl = `https://${shortCode}.api.commercecloud.salesforce.com/shopper/auth/v1/organizations/${orgId}/oauth2/jwks`;
366
+ const JWKS = jose.createRemoteJWKSet(new URL(jwksUrl));
367
+
368
+ // Verify token
369
+ const { payload } = await jose.jwtVerify(accessToken, JWKS, {
370
+ issuer: `https://${shortCode}.api.commercecloud.salesforce.com/shopper/auth/v1/organizations/${orgId}`,
371
+ audience: clientId
372
+ });
373
+
374
+ return payload;
375
+ }
376
+ ```
377
+
378
+ ### Token Claims
379
+
380
+ | Claim | Description |
381
+ |-------|-------------|
382
+ | `sub` | Subject (customer ID or guest ID) |
383
+ | `isb` | Identity subject binding |
384
+ | `iss` | Issuer |
385
+ | `aud` | Audience (client ID) |
386
+ | `exp` | Expiration time |
387
+ | `iat` | Issued at time |
388
+ | `scope` | Granted scopes |
389
+ | `tsob` | TSOB token type (for trusted system tokens) |
390
+
391
+ ## Best Practices
392
+
393
+ ### Security
394
+
395
+ - Never expose client secrets in frontend code
396
+ - Use HTTPS for all token exchanges
397
+ - Validate tokens server-side for sensitive operations
398
+ - Implement proper CORS policies
399
+ - Store tokens securely (httpOnly cookies preferred)
400
+
401
+ ### Token Management
402
+
403
+ - Implement proactive token refresh before expiry
404
+ - Handle refresh token rotation for public clients
405
+ - Clear tokens on logout from all storage locations
406
+ - Use short-lived access tokens where possible
407
+ - Always include `channel_id` in refresh requests
408
+
409
+ ### User Experience
410
+
411
+ - Provide fallback authentication methods
412
+ - Show clear error messages for auth failures
413
+ - Remember user's preferred auth method
414
+ - Handle session expiry gracefully
415
+
416
+ ## Detailed References
417
+
418
+ - [Passkeys (FIDO2/WebAuthn)](references/PASSKEYS.md) - Registration and authentication code examples
419
+ - [Session Bridge Flows](references/SESSION-BRIDGE.md) - Detailed session bridge implementation
420
+ - [Token Lifecycle](references/TOKEN-LIFECYCLE.md) - Token expiry and refresh patterns
@@ -0,0 +1,126 @@
1
+ # Passkeys (FIDO2/WebAuthn)
2
+
3
+ > Illustrative of the flow; confirm current API shape and parameters with `b2c docs read commerce-api/slas-passwordless-login-passkey`.
4
+
5
+ Enable biometric authentication using passkeys.
6
+
7
+ **Important:** Passkey registration requires **prior identity verification via OTP**. Users must first verify their email before registering a passkey.
8
+
9
+ ## Registration Flow (3 Steps)
10
+
11
+ ```javascript
12
+ // Step 1: Verify identity via OTP first
13
+ // Use the Email OTP flow above to verify the user
14
+
15
+ // Step 2: Start passkey registration (requires valid access token)
16
+ async function startPasskeyRegistration(accessToken) {
17
+ const response = await fetch(
18
+ `https://${shortCode}.api.commercecloud.salesforce.com/shopper/auth/v1/organizations/${orgId}/oauth2/webauthn/register/start`,
19
+ {
20
+ method: 'POST',
21
+ headers: {
22
+ 'Authorization': `Bearer ${accessToken}`,
23
+ 'Content-Type': 'application/json'
24
+ },
25
+ body: JSON.stringify({
26
+ channel_id: siteId
27
+ })
28
+ }
29
+ );
30
+ return response.json();
31
+ }
32
+
33
+ // Step 3: Create credential using WebAuthn API
34
+ async function createPasskey(options) {
35
+ const credential = await navigator.credentials.create({
36
+ publicKey: {
37
+ challenge: base64ToBuffer(options.challenge),
38
+ rp: { name: options.rp_name, id: options.rp_id },
39
+ user: {
40
+ id: base64ToBuffer(options.user_id),
41
+ name: options.user_name,
42
+ displayName: options.user_display_name
43
+ },
44
+ pubKeyCredParams: options.pub_key_cred_params,
45
+ authenticatorSelection: {
46
+ authenticatorAttachment: 'platform',
47
+ userVerification: 'required'
48
+ }
49
+ }
50
+ });
51
+ return credential;
52
+ }
53
+
54
+ // Step 4: Complete registration with SLAS
55
+ async function finishPasskeyRegistration(accessToken, credential) {
56
+ const response = await fetch(
57
+ `https://${shortCode}.api.commercecloud.salesforce.com/shopper/auth/v1/organizations/${orgId}/oauth2/webauthn/register/finish`,
58
+ {
59
+ method: 'POST',
60
+ headers: {
61
+ 'Authorization': `Bearer ${accessToken}`,
62
+ 'Content-Type': 'application/json'
63
+ },
64
+ body: JSON.stringify({
65
+ channel_id: siteId,
66
+ credential_id: bufferToBase64(credential.rawId),
67
+ client_data_json: bufferToBase64(credential.response.clientDataJSON),
68
+ attestation_object: bufferToBase64(credential.response.attestationObject)
69
+ })
70
+ }
71
+ );
72
+ return response.json();
73
+ }
74
+ ```
75
+
76
+ ## Authentication Flow
77
+
78
+ ```javascript
79
+ // Step 1: Get authentication options
80
+ async function startPasskeyAuth() {
81
+ const response = await fetch(
82
+ `https://${shortCode}.api.commercecloud.salesforce.com/shopper/auth/v1/organizations/${orgId}/oauth2/webauthn/authenticate/start`,
83
+ {
84
+ method: 'POST',
85
+ headers: { 'Content-Type': 'application/json' },
86
+ body: JSON.stringify({ channel_id: siteId })
87
+ }
88
+ );
89
+ return response.json();
90
+ }
91
+
92
+ // Step 2: Get credential using WebAuthn API
93
+ async function authenticateWithPasskey(options) {
94
+ const assertion = await navigator.credentials.get({
95
+ publicKey: {
96
+ challenge: base64ToBuffer(options.challenge),
97
+ rpId: options.rp_id,
98
+ allowCredentials: options.allow_credentials.map(c => ({
99
+ type: 'public-key',
100
+ id: base64ToBuffer(c.id)
101
+ })),
102
+ userVerification: 'required'
103
+ }
104
+ });
105
+ return assertion;
106
+ }
107
+
108
+ // Step 3: Complete authentication and get tokens
109
+ async function finishPasskeyAuth(assertion) {
110
+ const response = await fetch(
111
+ `https://${shortCode}.api.commercecloud.salesforce.com/shopper/auth/v1/organizations/${orgId}/oauth2/webauthn/authenticate/finish`,
112
+ {
113
+ method: 'POST',
114
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
115
+ body: new URLSearchParams({
116
+ credential_id: bufferToBase64(assertion.rawId),
117
+ client_data_json: bufferToBase64(assertion.response.clientDataJSON),
118
+ authenticator_data: bufferToBase64(assertion.response.authenticatorData),
119
+ signature: bufferToBase64(assertion.response.signature),
120
+ channel_id: siteId
121
+ })
122
+ }
123
+ );
124
+ return response.json();
125
+ }
126
+ ```