@salesforce/afv-skills 1.8.0 → 1.9.1
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.
- package/package.json +1 -1
- package/skills/activating-datacloud/CREDITS.md +5 -0
- package/skills/activating-datacloud/README.md +39 -0
- package/skills/activating-datacloud/SKILL.md +118 -0
- package/skills/analyzing-omnistudio-dependencies/CREDITS.md +5 -0
- package/skills/analyzing-omnistudio-dependencies/SKILL.md +477 -0
- package/skills/analyzing-omnistudio-dependencies/references/dependency-patterns.md +508 -0
- package/skills/analyzing-omnistudio-dependencies/references/namespace-guide.md +300 -0
- package/skills/building-omnistudio-callable-apex/CREDITS.md +9 -0
- package/skills/building-omnistudio-callable-apex/README.md +80 -0
- package/skills/building-omnistudio-callable-apex/SKILL.md +276 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_callable_openinterface.cls +40 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_callable_vanilla.cls +32 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_migration.cls +54 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_openinterface.cls +45 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_test_class.cls +65 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/IndustriesCallableException.cls +7 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/Industries_QuoteByProductCallable.cls +115 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/Industries_QuoteByProductCallableTest.cls +189 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/TRANSCRIPT.md +115 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/IndustriesCallableException.cls +7 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomCallable.cls +74 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomCallableTest.cls +146 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomRemoteClass.cls +16 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/TRANSCRIPT.md +120 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/IndustriesCallableException.cls +7 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomCallable.cls +73 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomCallableTest.cls +128 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomVlocityOpenInterface2.cls +23 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/TRANSCRIPT.md +75 -0
- package/skills/building-omnistudio-datamapper/CREDITS.md +5 -0
- package/skills/building-omnistudio-datamapper/SKILL.md +270 -0
- package/skills/building-omnistudio-datamapper/assets/completion-summary-template.md +28 -0
- package/skills/building-omnistudio-datamapper/assets/omni-data-transform-extract.json +6 -0
- package/skills/building-omnistudio-datamapper/assets/omni-data-transform-item.json +12 -0
- package/skills/building-omnistudio-datamapper/assets/omni-data-transform-load.json +6 -0
- package/skills/building-omnistudio-datamapper/assets/omni-data-transform-transform.json +6 -0
- package/skills/building-omnistudio-datamapper/references/best-practices.md +277 -0
- package/skills/building-omnistudio-datamapper/references/naming-conventions.md +145 -0
- package/skills/building-omnistudio-flexcard/CREDITS.md +5 -0
- package/skills/building-omnistudio-flexcard/SKILL.md +325 -0
- package/skills/building-omnistudio-flexcard/assets/omni-ui-card.json +10 -0
- package/skills/building-omnistudio-flexcard/references/best-practices.md +291 -0
- package/skills/building-omnistudio-flexcard/references/data-binding-guide.md +311 -0
- package/skills/building-omnistudio-flexcard/references/scoring-rubric.md +66 -0
- package/skills/building-omnistudio-flexcard/scripts/flexcard-commands.sh +24 -0
- package/skills/building-omnistudio-integration-procedure/CREDITS.md +5 -0
- package/skills/building-omnistudio-integration-procedure/SKILL.md +275 -0
- package/skills/building-omnistudio-integration-procedure/assets/omni-process-element-dr-extract.json +10 -0
- package/skills/building-omnistudio-integration-procedure/assets/omni-process-element-set-values.json +10 -0
- package/skills/building-omnistudio-integration-procedure/assets/omni-process-ip.json +12 -0
- package/skills/building-omnistudio-integration-procedure/assets/scoring-report-format.txt +14 -0
- package/skills/building-omnistudio-integration-procedure/references/best-practices.md +388 -0
- package/skills/building-omnistudio-integration-procedure/references/element-types.md +588 -0
- package/skills/building-omnistudio-integration-procedure/scripts/cli-commands.sh +18 -0
- package/skills/building-omnistudio-omniscript/CREDITS.md +5 -0
- package/skills/building-omnistudio-omniscript/SKILL.md +367 -0
- package/skills/building-omnistudio-omniscript/assets/omni-process-element-step.json +10 -0
- package/skills/building-omnistudio-omniscript/assets/omni-process-element-text-block.json +11 -0
- package/skills/building-omnistudio-omniscript/assets/omni-process-omniscript.json +12 -0
- package/skills/building-omnistudio-omniscript/references/best-practices.md +480 -0
- package/skills/building-omnistudio-omniscript/references/element-types.md +1172 -0
- package/skills/building-omnistudio-omniscript/scripts/check-duplicate-omniscript.sh +13 -0
- package/skills/building-omnistudio-omniscript/scripts/cli-reference.sh +21 -0
- package/skills/building-omnistudio-omniscript/scripts/deploy-omniscript.sh +29 -0
- package/skills/building-sf-integrations/CREDITS.md +5 -0
- package/skills/building-sf-integrations/README.md +95 -0
- package/skills/building-sf-integrations/SKILL.md +192 -0
- package/skills/building-sf-integrations/assets/callouts/callout-retry-handler.cls +167 -0
- package/skills/building-sf-integrations/assets/callouts/http-response-handler.cls +257 -0
- package/skills/building-sf-integrations/assets/callouts/rest-queueable-callout.cls +262 -0
- package/skills/building-sf-integrations/assets/callouts/rest-sync-callout.cls +211 -0
- package/skills/building-sf-integrations/assets/cdc/cdc-handler.cls +246 -0
- package/skills/building-sf-integrations/assets/cdc/cdc-subscriber-trigger.trigger +139 -0
- package/skills/building-sf-integrations/assets/endpoint-security/example.cspTrustedSite-meta.xml +58 -0
- package/skills/building-sf-integrations/assets/endpoint-security/example.remoteSite-meta.xml +39 -0
- package/skills/building-sf-integrations/assets/external-credentials/jwt-external-credential.externalCredential-meta.xml +90 -0
- package/skills/building-sf-integrations/assets/external-credentials/oauth-external-credential.externalCredential-meta.xml +87 -0
- package/skills/building-sf-integrations/assets/external-services/external-service-operations.md +221 -0
- package/skills/building-sf-integrations/assets/external-services/openapi-registration.externalServiceRegistration-meta.xml +193 -0
- package/skills/building-sf-integrations/assets/named-credentials/certificate-auth.namedCredential-meta.xml +62 -0
- package/skills/building-sf-integrations/assets/named-credentials/custom-auth.namedCredential-meta.xml +71 -0
- package/skills/building-sf-integrations/assets/named-credentials/oauth-client-credentials.namedCredential-meta.xml +51 -0
- package/skills/building-sf-integrations/assets/named-credentials/oauth-jwt-bearer.namedCredential-meta.xml +67 -0
- package/skills/building-sf-integrations/assets/platform-events/event-publisher.cls +191 -0
- package/skills/building-sf-integrations/assets/platform-events/event-subscriber-action.cls +295 -0
- package/skills/building-sf-integrations/assets/platform-events/event-subscriber-trigger.trigger +108 -0
- package/skills/building-sf-integrations/assets/platform-events/platform-event-definition.object-meta.xml +124 -0
- package/skills/building-sf-integrations/assets/soap/soap-callout-service.cls +186 -0
- package/skills/building-sf-integrations/assets/soap/wsdl2apex-guide.md +213 -0
- package/skills/building-sf-integrations/hooks/scripts/suggest_credential_setup.py +271 -0
- package/skills/building-sf-integrations/hooks/scripts/validate_integration.py +363 -0
- package/skills/building-sf-integrations/references/callout-patterns.md +719 -0
- package/skills/building-sf-integrations/references/cdc-guide.md +288 -0
- package/skills/building-sf-integrations/references/cli-reference.md +94 -0
- package/skills/building-sf-integrations/references/event-driven-architecture-guide.md +266 -0
- package/skills/building-sf-integrations/references/event-patterns.md +838 -0
- package/skills/building-sf-integrations/references/external-services-guide.md +303 -0
- package/skills/building-sf-integrations/references/messaging-api-v2.md +609 -0
- package/skills/building-sf-integrations/references/named-credentials-automation.md +201 -0
- package/skills/building-sf-integrations/references/named-credentials-guide.md +173 -0
- package/skills/building-sf-integrations/references/platform-events-guide.md +288 -0
- package/skills/building-sf-integrations/references/rest-callout-patterns.md +288 -0
- package/skills/building-sf-integrations/references/scoring-rubric.md +59 -0
- package/skills/building-sf-integrations/references/security-best-practices.md +248 -0
- package/skills/building-sf-integrations/scripts/README.md +100 -0
- package/skills/building-sf-integrations/scripts/configure-named-credential.sh +236 -0
- package/skills/building-sf-integrations/scripts/set-api-credential.sh +146 -0
- package/skills/building-sf-integrations/scripts/templates/setup-credentials-with-csp.sh +158 -0
- package/skills/configuring-connected-apps/CREDITS.md +3 -0
- package/skills/configuring-connected-apps/README.md +99 -0
- package/skills/configuring-connected-apps/SKILL.md +224 -0
- package/skills/configuring-connected-apps/assets/connected-app-basic.xml +29 -0
- package/skills/configuring-connected-apps/assets/connected-app-canvas.xml +62 -0
- package/skills/configuring-connected-apps/assets/connected-app-jwt.xml +49 -0
- package/skills/configuring-connected-apps/assets/connected-app-oauth.xml +65 -0
- package/skills/configuring-connected-apps/assets/eca-global-oauth.xml +36 -0
- package/skills/configuring-connected-apps/assets/eca-oauth-settings.xml +36 -0
- package/skills/configuring-connected-apps/assets/eca-policies.xml +36 -0
- package/skills/configuring-connected-apps/assets/external-client-app.xml +35 -0
- package/skills/configuring-connected-apps/references/example-usage.md +256 -0
- package/skills/configuring-connected-apps/references/migration-guide.md +328 -0
- package/skills/configuring-connected-apps/references/oauth-flows-reference.md +660 -0
- package/skills/configuring-connected-apps/references/security-checklist.md +209 -0
- package/skills/configuring-connected-apps/references/testing-validation-guide.md +275 -0
- package/skills/connecting-datacloud/CREDITS.md +5 -0
- package/skills/connecting-datacloud/README.md +59 -0
- package/skills/connecting-datacloud/SKILL.md +155 -0
- package/skills/connecting-datacloud/examples/connections/heroku-postgres.json +15 -0
- package/skills/connecting-datacloud/examples/connections/ingest-api-connection.json +5 -0
- package/skills/connecting-datacloud/examples/connections/ingest-api-schema.json +31 -0
- package/skills/connecting-datacloud/examples/connections/redshift.json +16 -0
- package/skills/connecting-datacloud/examples/connections/sharepoint-unstructured.json +20 -0
- package/skills/connecting-datacloud/examples/connections/snowflake-connection.json +42 -0
- package/skills/debugging-apex-logs/CREDITS.md +22 -0
- package/skills/debugging-apex-logs/README.md +74 -0
- package/skills/debugging-apex-logs/SKILL.md +172 -0
- package/skills/debugging-apex-logs/assets/benchmarking-template.cls +327 -0
- package/skills/debugging-apex-logs/assets/cpu-heap-optimization.cls +307 -0
- package/skills/debugging-apex-logs/assets/dml-in-loop-fix.cls +219 -0
- package/skills/debugging-apex-logs/assets/null-pointer-fix.cls +252 -0
- package/skills/debugging-apex-logs/assets/soql-in-loop-fix.cls +157 -0
- package/skills/debugging-apex-logs/references/analysis-playbook.md +53 -0
- package/skills/debugging-apex-logs/references/benchmarking-guide.md +287 -0
- package/skills/debugging-apex-logs/references/cli-commands.md +368 -0
- package/skills/debugging-apex-logs/references/common-issues.md +68 -0
- package/skills/debugging-apex-logs/references/debug-log-reference.md +328 -0
- package/skills/debugging-apex-logs/references/log-analysis-tools.md +248 -0
- package/skills/debugging-apex-logs/references/scoring-rubric.md +21 -0
- package/skills/deploying-metadata/CREDITS.md +25 -0
- package/skills/deploying-metadata/README.md +104 -0
- package/skills/deploying-metadata/SKILL.md +214 -0
- package/skills/deploying-metadata/assets/destructiveChanges.xml +143 -0
- package/skills/deploying-metadata/assets/package.xml +121 -0
- package/skills/deploying-metadata/references/agent-deployment-guide.md +628 -0
- package/skills/deploying-metadata/references/deploy.sh +73 -0
- package/skills/deploying-metadata/references/deployment-report-template.md +89 -0
- package/skills/deploying-metadata/references/deployment-workflows.md +395 -0
- package/skills/deploying-metadata/references/orchestration.md +183 -0
- package/skills/deploying-metadata/references/trigger-deployment-safety.md +376 -0
- package/skills/deploying-omnistudio-datapacks/CREDITS.md +5 -0
- package/skills/deploying-omnistudio-datapacks/README.md +88 -0
- package/skills/deploying-omnistudio-datapacks/SKILL.md +174 -0
- package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle/TRANSCRIPT.md +124 -0
- package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle/deploy-business-internet-plus-bundle.yaml +11 -0
- package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle-deploy/TRANSCRIPT.md +142 -0
- package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle-deploy/deploy-business-internet-plus-bundle.yaml +10 -0
- package/skills/deploying-omnistudio-datapacks/references/job-file-template.md +42 -0
- package/skills/deploying-omnistudio-datapacks/references/troubleshooting-matrix.md +24 -0
- package/skills/developing-agentforce/assets/metadata/http-callout-flow.flow-meta.xml +1 -1
- package/skills/developing-agentforce/references/actions-reference.md +8 -8
- package/skills/fetching-salesforce-docs/README.md +66 -0
- package/skills/fetching-salesforce-docs/SKILL.md +209 -0
- package/skills/fetching-salesforce-docs/requirements.txt +2 -0
- package/skills/fetching-salesforce-docs/scripts/extract_help_salesforce.py +497 -0
- package/skills/fetching-salesforce-docs/scripts/extract_salesforce_doc.py +357 -0
- package/skills/fetching-salesforce-docs/scripts/runtime_bootstrap.py +58 -0
- package/skills/generating-apex/CREDITS.md +1 -26
- package/skills/generating-apex-test/CREDITS.md +2 -27
- package/skills/generating-lwc-components/CREDITS.md +5 -0
- package/skills/generating-lwc-components/README.md +126 -0
- package/skills/generating-lwc-components/SKILL.md +191 -0
- package/skills/generating-lwc-components/assets/apex-controller/LwcController.cls +327 -0
- package/skills/generating-lwc-components/assets/basic-component/basicComponent.css +72 -0
- package/skills/generating-lwc-components/assets/basic-component/basicComponent.html +111 -0
- package/skills/generating-lwc-components/assets/basic-component/basicComponent.js +163 -0
- package/skills/generating-lwc-components/assets/basic-component/basicComponent.js-meta.xml +137 -0
- package/skills/generating-lwc-components/assets/datatable-component/datatableComponent.html +111 -0
- package/skills/generating-lwc-components/assets/datatable-component/datatableComponent.js +367 -0
- package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.css +63 -0
- package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.html +154 -0
- package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.js +348 -0
- package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.js-meta.xml +87 -0
- package/skills/generating-lwc-components/assets/form-component/formComponent.html +165 -0
- package/skills/generating-lwc-components/assets/form-component/formComponent.js +275 -0
- package/skills/generating-lwc-components/assets/graphql-component/graphqlComponent.html +100 -0
- package/skills/generating-lwc-components/assets/graphql-component/graphqlComponent.js +336 -0
- package/skills/generating-lwc-components/assets/jest-test/componentName.test.js.example +371 -0
- package/skills/generating-lwc-components/assets/message-channel/RecordSelected.messageChannel-meta.xml +71 -0
- package/skills/generating-lwc-components/assets/message-channel/lmsPublisher.js +103 -0
- package/skills/generating-lwc-components/assets/message-channel/lmsSubscriber.js +181 -0
- package/skills/generating-lwc-components/assets/modal-component/modalComponent.html +85 -0
- package/skills/generating-lwc-components/assets/modal-component/modalComponent.js +199 -0
- package/skills/generating-lwc-components/assets/record-picker/recordPicker.html +55 -0
- package/skills/generating-lwc-components/assets/record-picker/recordPicker.js +199 -0
- package/skills/generating-lwc-components/assets/state-store/store.js +282 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.css +65 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.html +95 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.js-meta.xml +75 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.test.ts.example +301 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.ts +295 -0
- package/skills/generating-lwc-components/assets/workspace-api/workspaceComponent.html +71 -0
- package/skills/generating-lwc-components/assets/workspace-api/workspaceComponent.js +316 -0
- package/skills/generating-lwc-components/hooks/scripts/lwc-lsp-validate.py +295 -0
- package/skills/generating-lwc-components/hooks/scripts/post-tool-validate.py +347 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_data/deprecated_patterns.json +74 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_data/styling_hooks.json +111 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_data/valid_slds_classes.json +127 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_linter_wrapper.py +294 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_rules/__init__.py +22 -0
- package/skills/generating-lwc-components/hooks/scripts/template_validator.py +332 -0
- package/skills/generating-lwc-components/hooks/scripts/validate_slds.py +595 -0
- package/skills/generating-lwc-components/references/accessibility-guide.md +843 -0
- package/skills/generating-lwc-components/references/advanced-features.md +108 -0
- package/skills/generating-lwc-components/references/async-notification-patterns.md +661 -0
- package/skills/generating-lwc-components/references/cli-commands.md +545 -0
- package/skills/generating-lwc-components/references/component-patterns.md +1476 -0
- package/skills/generating-lwc-components/references/flow-integration-guide.md +675 -0
- package/skills/generating-lwc-components/references/jest-testing.md +1011 -0
- package/skills/generating-lwc-components/references/lms-guide.md +860 -0
- package/skills/generating-lwc-components/references/lwc-best-practices.md +1310 -0
- package/skills/generating-lwc-components/references/performance-guide.md +861 -0
- package/skills/generating-lwc-components/references/scoring-and-testing.md +116 -0
- package/skills/generating-lwc-components/references/slds-blueprints.json +14389 -0
- package/skills/generating-lwc-components/references/slds-design-guide.md +166 -0
- package/skills/generating-lwc-components/references/state-management.md +642 -0
- package/skills/generating-lwc-components/references/template-anti-patterns.md +948 -0
- package/skills/generating-lwc-components/references/triangle-pattern.md +365 -0
- package/skills/generating-lwc-components/scripts/local-dev-preview.sh +34 -0
- package/skills/generating-mermaid-diagrams/CREDITS.md +46 -0
- package/skills/generating-mermaid-diagrams/README.md +114 -0
- package/skills/generating-mermaid-diagrams/SKILL.md +218 -0
- package/skills/generating-mermaid-diagrams/assets/agentforce/agent-flow.md +313 -0
- package/skills/generating-mermaid-diagrams/assets/architecture/system-landscape.md +351 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/b2b-commerce-erd.md +317 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/campaigns-erd.md +195 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/consent-erd.md +262 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/files-erd.md +266 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/forecasting-erd.md +261 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/fsl-erd.md +332 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/party-model-erd.md +237 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/quote-order-erd.md +277 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/revenue-cloud-erd.md +343 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/sales-cloud-erd.md +192 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/salesforce-erd.md +209 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/scheduler-erd.md +276 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/service-cloud-erd.md +217 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/territory-management-erd.md +241 -0
- package/skills/generating-mermaid-diagrams/assets/integration/api-sequence.md +387 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/authorization-code-pkce.md +197 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/authorization-code.md +152 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/client-credentials.md +233 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/device-authorization.md +295 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/jwt-bearer.md +256 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/refresh-token.md +281 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/user-agent-social-sign-on.md +281 -0
- package/skills/generating-mermaid-diagrams/assets/role-hierarchy/user-hierarchy.md +322 -0
- package/skills/generating-mermaid-diagrams/references/color-palette.md +464 -0
- package/skills/generating-mermaid-diagrams/references/diagram-conventions.md +313 -0
- package/skills/generating-mermaid-diagrams/references/erd-conventions.md +320 -0
- package/skills/generating-mermaid-diagrams/references/mermaid-reference.md +434 -0
- package/skills/generating-mermaid-diagrams/references/mermaid-styling.md +81 -0
- package/skills/generating-mermaid-diagrams/references/preview-guide.md +49 -0
- package/skills/generating-mermaid-diagrams/references/usage-examples.md +340 -0
- package/skills/generating-mermaid-diagrams/scripts/README.md +160 -0
- package/skills/generating-mermaid-diagrams/scripts/mermaid_preview.py +654 -0
- package/skills/generating-mermaid-diagrams/scripts/query-org-metadata.py +293 -0
- package/skills/generating-visual-diagrams/CREDITS.md +80 -0
- package/skills/generating-visual-diagrams/README.md +83 -0
- package/skills/generating-visual-diagrams/SKILL.md +208 -0
- package/skills/generating-visual-diagrams/assets/architecture/integration-flow.md +55 -0
- package/skills/generating-visual-diagrams/assets/erd/core-objects.md +131 -0
- package/skills/generating-visual-diagrams/assets/erd/custom-objects.md +60 -0
- package/skills/generating-visual-diagrams/assets/lwc/dashboard-card.md +45 -0
- package/skills/generating-visual-diagrams/assets/lwc/data-table.md +57 -0
- package/skills/generating-visual-diagrams/assets/lwc/record-form.md +60 -0
- package/skills/generating-visual-diagrams/assets/review/apex-review.md +57 -0
- package/skills/generating-visual-diagrams/assets/review/lwc-review.md +48 -0
- package/skills/generating-visual-diagrams/references/architect-aesthetic-guide.md +257 -0
- package/skills/generating-visual-diagrams/references/examples-index.md +35 -0
- package/skills/generating-visual-diagrams/references/gemini-cli-setup.md +65 -0
- package/skills/generating-visual-diagrams/references/interview-questions.md +529 -0
- package/skills/generating-visual-diagrams/references/iteration-workflow.md +173 -0
- package/skills/generating-visual-diagrams/scripts/check-prerequisites.sh +101 -0
- package/skills/generating-visual-diagrams/scripts/generate_image.py +243 -0
- package/skills/handling-sf-data/CREDITS.md +5 -0
- package/skills/handling-sf-data/README.md +112 -0
- package/skills/handling-sf-data/SKILL.md +235 -0
- package/skills/handling-sf-data/assets/bulk/bulk-insert-10000.apex +293 -0
- package/skills/handling-sf-data/assets/bulk/bulk-insert-200.apex +208 -0
- package/skills/handling-sf-data/assets/bulk/bulk-insert-500.apex +219 -0
- package/skills/handling-sf-data/assets/bulk/bulk-upsert-external-id.apex +324 -0
- package/skills/handling-sf-data/assets/cleanup/delete-by-created-date.apex +319 -0
- package/skills/handling-sf-data/assets/cleanup/delete-by-name.apex +240 -0
- package/skills/handling-sf-data/assets/cleanup/delete-test-data.apex +311 -0
- package/skills/handling-sf-data/assets/cleanup/rollback-transaction.apex +266 -0
- package/skills/handling-sf-data/assets/csv/account-import.csv +11 -0
- package/skills/handling-sf-data/assets/csv/contact-import.csv +11 -0
- package/skills/handling-sf-data/assets/csv/custom-object-import.csv +11 -0
- package/skills/handling-sf-data/assets/csv/opportunity-import.csv +11 -0
- package/skills/handling-sf-data/assets/factories/account-factory.apex +165 -0
- package/skills/handling-sf-data/assets/factories/case-factory.apex +237 -0
- package/skills/handling-sf-data/assets/factories/contact-factory.apex +168 -0
- package/skills/handling-sf-data/assets/factories/custom-object-factory.apex +260 -0
- package/skills/handling-sf-data/assets/factories/event-factory.apex +275 -0
- package/skills/handling-sf-data/assets/factories/hierarchy-factory.apex +372 -0
- package/skills/handling-sf-data/assets/factories/lead-factory.apex +190 -0
- package/skills/handling-sf-data/assets/factories/opportunity-factory.apex +206 -0
- package/skills/handling-sf-data/assets/factories/task-factory.apex +246 -0
- package/skills/handling-sf-data/assets/factories/user-factory.apex +278 -0
- package/skills/handling-sf-data/assets/json/account-contact-tree.json +130 -0
- package/skills/handling-sf-data/assets/json/account-opportunity-tree.json +110 -0
- package/skills/handling-sf-data/assets/json/full-hierarchy-tree.json +188 -0
- package/skills/handling-sf-data/assets/soql/aggregate.soql +226 -0
- package/skills/handling-sf-data/assets/soql/child-to-parent.soql +162 -0
- package/skills/handling-sf-data/assets/soql/parent-to-child.soql +153 -0
- package/skills/handling-sf-data/assets/soql/polymorphic.soql +198 -0
- package/skills/handling-sf-data/assets/soql/subquery.soql +287 -0
- package/skills/handling-sf-data/references/anonymous-apex-guide.md +98 -0
- package/skills/handling-sf-data/references/bulk-operations-guide.md +94 -0
- package/skills/handling-sf-data/references/bulk-testing-example.md +194 -0
- package/skills/handling-sf-data/references/cleanup-rollback-example.md +322 -0
- package/skills/handling-sf-data/references/cleanup-rollback-guide.md +84 -0
- package/skills/handling-sf-data/references/crud-workflow-example.md +183 -0
- package/skills/handling-sf-data/references/governor-limits-reference.md +74 -0
- package/skills/handling-sf-data/references/orchestration.md +174 -0
- package/skills/handling-sf-data/references/relationship-query-examples.md +249 -0
- package/skills/handling-sf-data/references/sf-cli-data-commands.md +158 -0
- package/skills/handling-sf-data/references/soql-relationship-guide.md +84 -0
- package/skills/handling-sf-data/references/test-data-best-practices.md +104 -0
- package/skills/handling-sf-data/references/test-data-factory-usage.md +290 -0
- package/skills/handling-sf-data/references/test-data-patterns.md +98 -0
- package/skills/handling-sf-data/scripts/soql_validator.py +292 -0
- package/skills/handling-sf-data/scripts/validate_data_operation.py +379 -0
- package/skills/harmonizing-datacloud/CREDITS.md +3 -0
- package/skills/harmonizing-datacloud/README.md +31 -0
- package/skills/harmonizing-datacloud/SKILL.md +117 -0
- package/skills/modeling-omnistudio-epc-catalog/CREDITS.md +14 -0
- package/skills/modeling-omnistudio-epc-catalog/README.md +89 -0
- package/skills/modeling-omnistudio-epc-catalog/SKILL.md +395 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/attribute-assignment-template.json +402 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/compiled-attribute-overrides-template.json +43 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/completion-block-template.txt +8 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/decomposition-relationships-template.json +233 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_AttributeAssignments.json +514 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_CompiledAttributeOverrides.json +21 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_DataPack.json +649 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_DecompositionRelationships.json +200 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ObjectFieldAttributes.json +138 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_OrchestrationScenarios.json +54 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_OverrideDefinitions.json +266 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ParentKeys.json +23 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_PriceListEntries.json +54 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_PricebookEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ProductChildItems.json +34 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_RuleAssignments.json +21 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_AttributeAssignments.json +410 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_DataPack.json +535 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_DecompositionRelationships.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ObjectFieldAttributes.json +138 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_OrchestrationScenarios.json +28 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ParentKeys.json +23 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_PriceListEntries.json +220 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_PricebookEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ProductChildItems.json +414 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_AttributeAssignments.json +382 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_DataPack.json +565 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_DecompositionRelationships.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ObjectFieldAttributes.json +104 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_OrchestrationScenarios.json +28 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ParentKeys.json +13 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_PriceListEntries.json +106 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_PricebookEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ProductChildItems.json +72 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_AttributeAssignments.json +142 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_DataPack.json +377 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_DecompositionRelationships.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ObjectFieldAttributes.json +36 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ParentKeys.json +8 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_PriceListEntries.json +54 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_PricebookEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ProductChildItems.json +34 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/object-field-attributes-template.json +138 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/orchestration-scenarios-template.json +54 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/override-definitions-template.json +134 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/parent-keys-template.json +29 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/price-list-entries-template.json +158 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/pricebook-entries-template.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/product-child-item-template.json +338 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/product2-offer-template.json +527 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/.gitkeep +1 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_AttributeAssignments.json +95 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_CompiledAttributeOverrides.json +1 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_DataPack.json +214 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_DecompositionRelationships.json +28 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ObjectFieldAttributes.json +98 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_OrchestrationScenarios.json +22 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_OverrideDefinitions.json +1 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ParentKeys.json +13 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_PriceListEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_PricebookEntries.json +28 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ProductChildItems.json +110 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/TRANSCRIPT.md +58 -0
- package/skills/modeling-omnistudio-epc-catalog/references/epc-field-guide.md +90 -0
- package/skills/modeling-omnistudio-epc-catalog/references/naming-conventions.md +80 -0
- package/skills/modeling-omnistudio-epc-catalog/references/scoring-model.md +57 -0
- package/skills/modeling-omnistudio-epc-catalog/scripts/cli-validation-commands.sh +19 -0
- package/skills/modeling-omnistudio-epc-catalog/scripts/sample-invocations.sh +18 -0
- package/skills/orchestrating-datacloud/CREDITS.md +15 -0
- package/skills/orchestrating-datacloud/README.md +129 -0
- package/skills/orchestrating-datacloud/SKILL.md +236 -0
- package/skills/orchestrating-datacloud/UPSTREAM.md +45 -0
- package/skills/orchestrating-datacloud/assets/definitions/activation-target.template.json +5 -0
- package/skills/orchestrating-datacloud/assets/definitions/activation.template.json +7 -0
- package/skills/orchestrating-datacloud/assets/definitions/calculated-insight.template.json +7 -0
- package/skills/orchestrating-datacloud/assets/definitions/data-action-target.template.json +5 -0
- package/skills/orchestrating-datacloud/assets/definitions/data-action.template.json +5 -0
- package/skills/orchestrating-datacloud/assets/definitions/data-graph.template.json +21 -0
- package/skills/orchestrating-datacloud/assets/definitions/data-stream.template.json +55 -0
- package/skills/orchestrating-datacloud/assets/definitions/dmo.template.json +17 -0
- package/skills/orchestrating-datacloud/assets/definitions/identity-resolution.template.json +30 -0
- package/skills/orchestrating-datacloud/assets/definitions/mapping.template.json +14 -0
- package/skills/orchestrating-datacloud/assets/definitions/relationship.template.json +12 -0
- package/skills/orchestrating-datacloud/assets/definitions/search-index.template.json +9 -0
- package/skills/orchestrating-datacloud/assets/definitions/segment.template.json +16 -0
- package/skills/orchestrating-datacloud/references/feature-readiness.md +157 -0
- package/skills/orchestrating-datacloud/references/plugin-setup.md +140 -0
- package/skills/orchestrating-datacloud/scripts/bootstrap-plugin.sh +53 -0
- package/skills/orchestrating-datacloud/scripts/diagnose-org.mjs +511 -0
- package/skills/orchestrating-datacloud/scripts/generate-manifest.mjs +68 -0
- package/skills/orchestrating-datacloud/scripts/verify-plugin.sh +58 -0
- package/skills/preparing-datacloud/CREDITS.md +7 -0
- package/skills/preparing-datacloud/README.md +51 -0
- package/skills/preparing-datacloud/SKILL.md +191 -0
- package/skills/preparing-datacloud/examples/ingestion-api/.env.example +8 -0
- package/skills/preparing-datacloud/examples/ingestion-api/README.md +48 -0
- package/skills/preparing-datacloud/examples/ingestion-api/send-data.py +144 -0
- package/skills/querying-soql/CREDITS.md +21 -0
- package/skills/querying-soql/README.md +41 -0
- package/skills/querying-soql/SKILL.md +143 -0
- package/skills/querying-soql/assets/aggregate-queries.soql +242 -0
- package/skills/querying-soql/assets/basic-queries.soql +188 -0
- package/skills/querying-soql/assets/bulkified-query-pattern.cls +280 -0
- package/skills/querying-soql/assets/optimization-patterns.soql +259 -0
- package/skills/querying-soql/assets/relationship-queries.soql +203 -0
- package/skills/querying-soql/assets/selector-class.cls +219 -0
- package/skills/querying-soql/references/anti-patterns.md +348 -0
- package/skills/querying-soql/references/cli-commands.md +358 -0
- package/skills/querying-soql/references/field-coverage-rules.md +514 -0
- package/skills/querying-soql/references/query-optimization.md +142 -0
- package/skills/querying-soql/references/selector-patterns.md +479 -0
- package/skills/querying-soql/references/soql-reference.md +227 -0
- package/skills/querying-soql/references/soql-syntax-reference.md +208 -0
- package/skills/querying-soql/scripts/post-tool-validate.py +322 -0
- package/skills/retrieving-datacloud/CREDITS.md +7 -0
- package/skills/retrieving-datacloud/README.md +44 -0
- package/skills/retrieving-datacloud/SKILL.md +120 -0
- package/skills/retrieving-datacloud/examples/search-indexes/hybrid-structured.json +44 -0
- package/skills/retrieving-datacloud/examples/search-indexes/vector-knowledge.json +43 -0
- package/skills/running-apex-tests/CREDITS.md +22 -0
- package/skills/running-apex-tests/README.md +94 -0
- package/skills/running-apex-tests/SKILL.md +158 -0
- package/skills/running-apex-tests/assets/basic-test.cls +169 -0
- package/skills/running-apex-tests/assets/bulk-test.cls +255 -0
- package/skills/running-apex-tests/assets/dml-mock.cls +339 -0
- package/skills/running-apex-tests/assets/mock-callout-test.cls +353 -0
- package/skills/running-apex-tests/assets/stub-provider-example.cls +364 -0
- package/skills/running-apex-tests/assets/test-data-factory.cls +328 -0
- package/skills/running-apex-tests/hooks/scripts/parse-test-results.py +364 -0
- package/skills/running-apex-tests/references/cli-commands.md +289 -0
- package/skills/running-apex-tests/references/mocking-patterns.md +500 -0
- package/skills/running-apex-tests/references/performance-optimization.md +283 -0
- package/skills/running-apex-tests/references/test-fix-loop.md +49 -0
- package/skills/running-apex-tests/references/test-patterns.md +154 -0
- package/skills/running-apex-tests/references/testing-best-practices.md +509 -0
- package/skills/segmenting-datacloud/CREDITS.md +3 -0
- package/skills/segmenting-datacloud/README.md +36 -0
- package/skills/segmenting-datacloud/SKILL.md +115 -0
|
@@ -0,0 +1,660 @@
|
|
|
1
|
+
<!-- Parent: configuring-connected-apps/SKILL.md -->
|
|
2
|
+
# OAuth Flows Reference for Connected Apps
|
|
3
|
+
|
|
4
|
+
Detailed OAuth flow patterns, configuration examples, and implementation guidance for the configuring-connected-apps skill.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Flow Selection Decision Tree
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
START
|
|
12
|
+
│
|
|
13
|
+
├─ Do you have a backend server?
|
|
14
|
+
│ ├─ YES: Can it securely store secrets?
|
|
15
|
+
│ │ ├─ YES: Authorization Code Flow (Web Server)
|
|
16
|
+
│ │ └─ NO: Authorization Code + PKCE (SPA/Mobile)
|
|
17
|
+
│ │
|
|
18
|
+
│ └─ NO: Is this server-to-server?
|
|
19
|
+
│ ├─ YES: JWT Bearer Flow
|
|
20
|
+
│ └─ NO: Device Authorization Flow (CLI/IoT)
|
|
21
|
+
│
|
|
22
|
+
└─ Is this for a specific integration user?
|
|
23
|
+
├─ YES: JWT Bearer Flow
|
|
24
|
+
└─ NO: Authorization Code Flow
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Authorization Code Flow (Web Server)
|
|
30
|
+
|
|
31
|
+
### When to Use
|
|
32
|
+
- Web applications with backend server
|
|
33
|
+
- Can securely store consumer secret
|
|
34
|
+
- User-interactive flow needed
|
|
35
|
+
- Examples: Portal, Integration Hub, Admin Console
|
|
36
|
+
|
|
37
|
+
### Connected App Configuration
|
|
38
|
+
|
|
39
|
+
**Minimal scopes for API access**:
|
|
40
|
+
```xml
|
|
41
|
+
<oauthConfig>
|
|
42
|
+
<callbackUrl>https://app.example.com/oauth/callback</callbackUrl>
|
|
43
|
+
<scopes>Api</scopes>
|
|
44
|
+
<scopes>RefreshToken</scopes>
|
|
45
|
+
<isConsumerSecretOptional>false</isConsumerSecretOptional>
|
|
46
|
+
</oauthConfig>
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**With OpenID Connect**:
|
|
50
|
+
```xml
|
|
51
|
+
<oauthConfig>
|
|
52
|
+
<callbackUrl>https://app.example.com/oauth/callback</callbackUrl>
|
|
53
|
+
<scopes>Api</scopes>
|
|
54
|
+
<scopes>RefreshToken</scopes>
|
|
55
|
+
<scopes>OpenID</scopes>
|
|
56
|
+
<isIdTokenEnabled>true</isIdTokenEnabled>
|
|
57
|
+
<isConsumerSecretOptional>false</isConsumerSecretOptional>
|
|
58
|
+
</oauthConfig>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Security Checklist
|
|
62
|
+
- [ ] HTTPS callback URL (no localhost in production)
|
|
63
|
+
- [ ] Consumer secret stored in environment variables (never in code)
|
|
64
|
+
- [ ] State parameter validated (CSRF protection)
|
|
65
|
+
- [ ] Authorization code used only once
|
|
66
|
+
- [ ] Refresh token rotation enabled
|
|
67
|
+
- [ ] IP restrictions configured (optional)
|
|
68
|
+
|
|
69
|
+
### Common Issues
|
|
70
|
+
|
|
71
|
+
**Problem**: "redirect_uri_mismatch" error
|
|
72
|
+
- **Cause**: Callback URL doesn't match exactly
|
|
73
|
+
- **Fix**: Ensure exact match including protocol, domain, path, and query parameters
|
|
74
|
+
|
|
75
|
+
**Problem**: "invalid_client_id" error
|
|
76
|
+
- **Cause**: Consumer key incorrect or app not deployed
|
|
77
|
+
- **Fix**: Verify consumer key from Setup > App Manager
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Authorization Code + PKCE (Public Clients)
|
|
82
|
+
|
|
83
|
+
### When to Use
|
|
84
|
+
- Single Page Applications (React, Vue, Angular)
|
|
85
|
+
- Mobile apps (iOS, Android)
|
|
86
|
+
- Desktop apps
|
|
87
|
+
- Any client that cannot securely store secrets
|
|
88
|
+
|
|
89
|
+
### Connected App Configuration
|
|
90
|
+
|
|
91
|
+
```xml
|
|
92
|
+
<oauthConfig>
|
|
93
|
+
<callbackUrl>myapp://oauth/callback</callbackUrl>
|
|
94
|
+
<scopes>Api</scopes>
|
|
95
|
+
<scopes>RefreshToken</scopes>
|
|
96
|
+
<isConsumerSecretOptional>true</isConsumerSecretOptional>
|
|
97
|
+
<isPkceRequired>true</isPkceRequired>
|
|
98
|
+
</oauthConfig>
|
|
99
|
+
|
|
100
|
+
<oauthPolicy>
|
|
101
|
+
<refreshTokenPolicy>infinite</refreshTokenPolicy>
|
|
102
|
+
<isRefreshTokenRotationEnabled>true</isRefreshTokenRotationEnabled>
|
|
103
|
+
</oauthPolicy>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### External Client App Configuration
|
|
107
|
+
|
|
108
|
+
```xml
|
|
109
|
+
<!-- ecaGlblOauth-meta.xml -->
|
|
110
|
+
<ExtlClntAppGlobalOauthSettings xmlns="http://soap.sforce.com/2006/04/metadata">
|
|
111
|
+
<callbackUrl>myapp://oauth/callback</callbackUrl>
|
|
112
|
+
<externalClientApplication>MyMobileApp</externalClientApplication>
|
|
113
|
+
<isConsumerSecretOptional>true</isConsumerSecretOptional>
|
|
114
|
+
<isPkceRequired>true</isPkceRequired>
|
|
115
|
+
<isSecretRequiredForRefreshToken>false</isSecretRequiredForRefreshToken>
|
|
116
|
+
<label>Mobile App OAuth Settings</label>
|
|
117
|
+
</ExtlClntAppGlobalOauthSettings>
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Implementation Pattern (JavaScript)
|
|
121
|
+
|
|
122
|
+
```javascript
|
|
123
|
+
// Generate PKCE verifier and challenge
|
|
124
|
+
function generatePKCE() {
|
|
125
|
+
const array = new Uint8Array(32);
|
|
126
|
+
crypto.getRandomValues(array);
|
|
127
|
+
const codeVerifier = base64URLEncode(array);
|
|
128
|
+
|
|
129
|
+
return crypto.subtle.digest('SHA-256', new TextEncoder().encode(codeVerifier))
|
|
130
|
+
.then(buffer => ({
|
|
131
|
+
codeVerifier,
|
|
132
|
+
codeChallenge: base64URLEncode(new Uint8Array(buffer))
|
|
133
|
+
}));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Store verifier in sessionStorage (cleared on close)
|
|
137
|
+
const { codeVerifier, codeChallenge } = await generatePKCE();
|
|
138
|
+
sessionStorage.setItem('pkce_verifier', codeVerifier);
|
|
139
|
+
|
|
140
|
+
// Authorization URL
|
|
141
|
+
const authUrl = `https://login.salesforce.com/services/oauth2/authorize?` +
|
|
142
|
+
`response_type=code` +
|
|
143
|
+
`&client_id=${CLIENT_ID}` +
|
|
144
|
+
`&redirect_uri=${REDIRECT_URI}` +
|
|
145
|
+
`&scope=api%20refresh_token` +
|
|
146
|
+
`&state=${STATE}` +
|
|
147
|
+
`&code_challenge=${codeChallenge}` +
|
|
148
|
+
`&code_challenge_method=S256`;
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Security Checklist
|
|
152
|
+
- [ ] PKCE required in Connected App config
|
|
153
|
+
- [ ] Consumer secret optional
|
|
154
|
+
- [ ] Refresh token rotation enabled
|
|
155
|
+
- [ ] Code verifier stored securely (sessionStorage, keychain)
|
|
156
|
+
- [ ] State parameter validated
|
|
157
|
+
- [ ] Deep link callback handled securely (mobile)
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## JWT Bearer Flow (Server-to-Server)
|
|
162
|
+
|
|
163
|
+
### When to Use
|
|
164
|
+
- CI/CD pipelines (GitHub Actions, Jenkins)
|
|
165
|
+
- Backend integrations without user interaction
|
|
166
|
+
- Service accounts
|
|
167
|
+
- Scheduled jobs
|
|
168
|
+
|
|
169
|
+
### Prerequisites
|
|
170
|
+
|
|
171
|
+
**1. Generate X.509 Certificate**:
|
|
172
|
+
```bash
|
|
173
|
+
# Generate private key
|
|
174
|
+
openssl genrsa -out server.key 2048
|
|
175
|
+
|
|
176
|
+
# Generate certificate signing request
|
|
177
|
+
openssl req -new -key server.key -out server.csr
|
|
178
|
+
|
|
179
|
+
# Self-sign certificate (valid 1 year)
|
|
180
|
+
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
**2. Upload to Salesforce**:
|
|
184
|
+
- Setup > Certificate and Key Management > Create Self-Signed Certificate
|
|
185
|
+
- Or use the certificate from step 1
|
|
186
|
+
|
|
187
|
+
### Connected App Configuration
|
|
188
|
+
|
|
189
|
+
```xml
|
|
190
|
+
<oauthConfig>
|
|
191
|
+
<certificate>JWTAuthCertificate</certificate>
|
|
192
|
+
<consumerKey>AUTO_GENERATED</consumerKey>
|
|
193
|
+
<scopes>Api</scopes>
|
|
194
|
+
<scopes>Web</scopes>
|
|
195
|
+
<isAdminApproved>true</isAdminApproved>
|
|
196
|
+
</oauthConfig>
|
|
197
|
+
|
|
198
|
+
<oauthPolicy>
|
|
199
|
+
<ipRelaxation>ENFORCE</ipRelaxation>
|
|
200
|
+
</oauthPolicy>
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
**Important**: No `callbackUrl` needed for JWT Bearer flow.
|
|
204
|
+
|
|
205
|
+
### Pre-Authorization
|
|
206
|
+
|
|
207
|
+
**Option 1: Permission Set**
|
|
208
|
+
```xml
|
|
209
|
+
<!-- permissionsets/IntegrationUser.permissionset-meta.xml -->
|
|
210
|
+
<PermissionSet xmlns="http://soap.sforce.com/2006/04/metadata">
|
|
211
|
+
<label>API Integration User</label>
|
|
212
|
+
<connectedAppSettings>
|
|
213
|
+
<connectedApp>MyJWTApp</connectedApp>
|
|
214
|
+
<enabled>true</enabled>
|
|
215
|
+
</connectedAppSettings>
|
|
216
|
+
<hasActivationRequired>false</hasActivationRequired>
|
|
217
|
+
</PermissionSet>
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Assign to integration user: Setup > Users > [User] > Permission Set Assignments
|
|
221
|
+
|
|
222
|
+
**Option 2: Profile**
|
|
223
|
+
Setup > Manage Connected Apps > [App] > Edit Policies > Permitted Users = "Admin approved users are pre-authorized"
|
|
224
|
+
|
|
225
|
+
### Implementation Pattern (Node.js)
|
|
226
|
+
|
|
227
|
+
```javascript
|
|
228
|
+
const jwt = require('jsonwebtoken');
|
|
229
|
+
const axios = require('axios');
|
|
230
|
+
const fs = require('fs');
|
|
231
|
+
|
|
232
|
+
async function getAccessToken() {
|
|
233
|
+
const privateKey = fs.readFileSync('server.key', 'utf8');
|
|
234
|
+
|
|
235
|
+
const claims = {
|
|
236
|
+
iss: process.env.CONSUMER_KEY,
|
|
237
|
+
sub: 'integration@company.com', // Pre-authorized user
|
|
238
|
+
aud: 'https://login.salesforce.com',
|
|
239
|
+
exp: Math.floor(Date.now() / 1000) + 300 // 5 min
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
const assertion = jwt.sign(claims, privateKey, { algorithm: 'RS256' });
|
|
243
|
+
|
|
244
|
+
const response = await axios.post('https://login.salesforce.com/services/oauth2/token',
|
|
245
|
+
new URLSearchParams({
|
|
246
|
+
grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
|
|
247
|
+
assertion: assertion
|
|
248
|
+
})
|
|
249
|
+
);
|
|
250
|
+
|
|
251
|
+
return response.data.access_token;
|
|
252
|
+
}
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### Security Checklist
|
|
256
|
+
- [ ] Private key stored securely (secrets manager, not in repo)
|
|
257
|
+
- [ ] Certificate uploaded to Salesforce
|
|
258
|
+
- [ ] User pre-authorized via Permission Set
|
|
259
|
+
- [ ] IP restrictions configured
|
|
260
|
+
- [ ] Token expiration set (exp claim)
|
|
261
|
+
- [ ] Audience (aud) set correctly (login vs test.salesforce.com)
|
|
262
|
+
|
|
263
|
+
### Common Issues
|
|
264
|
+
|
|
265
|
+
**Problem**: "user hasn't approved this consumer" error
|
|
266
|
+
- **Cause**: User not pre-authorized
|
|
267
|
+
- **Fix**: Assign Permission Set or configure admin pre-approval
|
|
268
|
+
|
|
269
|
+
**Problem**: "invalid_grant" error
|
|
270
|
+
- **Cause**: Certificate mismatch or expired token
|
|
271
|
+
- **Fix**: Verify certificate name matches `<certificate>` tag, check exp claim
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## Device Authorization Flow
|
|
276
|
+
|
|
277
|
+
### When to Use
|
|
278
|
+
- CLI tools (sf CLI, custom CLIs)
|
|
279
|
+
- Smart TVs, Set-top boxes
|
|
280
|
+
- IoT devices without keyboard
|
|
281
|
+
- Any device with limited input capability
|
|
282
|
+
|
|
283
|
+
### Connected App Configuration
|
|
284
|
+
|
|
285
|
+
```xml
|
|
286
|
+
<oauthConfig>
|
|
287
|
+
<callbackUrl>http://localhost:8080</callbackUrl>
|
|
288
|
+
<scopes>Api</scopes>
|
|
289
|
+
<scopes>RefreshToken</scopes>
|
|
290
|
+
<isConsumerSecretOptional>true</isConsumerSecretOptional>
|
|
291
|
+
</oauthConfig>
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
### Implementation Pattern (Python)
|
|
295
|
+
|
|
296
|
+
```python
|
|
297
|
+
import requests
|
|
298
|
+
import time
|
|
299
|
+
|
|
300
|
+
CLIENT_ID = 'your_consumer_key'
|
|
301
|
+
DEVICE_CODE_URL = 'https://login.salesforce.com/services/oauth2/device/code'
|
|
302
|
+
TOKEN_URL = 'https://login.salesforce.com/services/oauth2/token'
|
|
303
|
+
|
|
304
|
+
# Step 1: Request device code
|
|
305
|
+
response = requests.post(DEVICE_CODE_URL, data={
|
|
306
|
+
'client_id': CLIENT_ID,
|
|
307
|
+
'scope': 'api refresh_token'
|
|
308
|
+
})
|
|
309
|
+
data = response.json()
|
|
310
|
+
|
|
311
|
+
# Step 2: Display user code
|
|
312
|
+
print(f"Visit: {data['verification_uri']}")
|
|
313
|
+
print(f"Enter code: {data['user_code']}")
|
|
314
|
+
|
|
315
|
+
# Step 3: Poll for token
|
|
316
|
+
device_code = data['device_code']
|
|
317
|
+
interval = data['interval'] # Polling interval in seconds
|
|
318
|
+
|
|
319
|
+
while True:
|
|
320
|
+
time.sleep(interval)
|
|
321
|
+
|
|
322
|
+
token_response = requests.post(TOKEN_URL, data={
|
|
323
|
+
'grant_type': 'urn:ietf:params:oauth:grant-type:device_code',
|
|
324
|
+
'client_id': CLIENT_ID,
|
|
325
|
+
'code': device_code
|
|
326
|
+
})
|
|
327
|
+
|
|
328
|
+
if token_response.status_code == 200:
|
|
329
|
+
tokens = token_response.json()
|
|
330
|
+
print(f"Access Token: {tokens['access_token']}")
|
|
331
|
+
break
|
|
332
|
+
elif token_response.json().get('error') == 'authorization_pending':
|
|
333
|
+
continue # User hasn't authorized yet
|
|
334
|
+
else:
|
|
335
|
+
print(f"Error: {token_response.json()}")
|
|
336
|
+
break
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
### Security Checklist
|
|
340
|
+
- [ ] Consumer secret optional
|
|
341
|
+
- [ ] Polling interval respected (don't spam)
|
|
342
|
+
- [ ] Device code expires after timeout
|
|
343
|
+
- [ ] Refresh token stored securely
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
## Client Credentials Flow (ECA Only)
|
|
348
|
+
|
|
349
|
+
### When to Use
|
|
350
|
+
- Service accounts (not tied to specific user)
|
|
351
|
+
- Background processes
|
|
352
|
+
- Microservices
|
|
353
|
+
- Requires External Client App (not available in Connected Apps)
|
|
354
|
+
|
|
355
|
+
### External Client App Configuration
|
|
356
|
+
|
|
357
|
+
```xml
|
|
358
|
+
<!-- extlClntAppOauthSettings/MyServiceApp.ecaOauth-meta.xml -->
|
|
359
|
+
<ExtlClntAppOauthSettings xmlns="http://soap.sforce.com/2006/04/metadata">
|
|
360
|
+
<commaSeparatedOauthScopes>Api</commaSeparatedOauthScopes>
|
|
361
|
+
<externalClientApplication>MyServiceApp</externalClientApplication>
|
|
362
|
+
<label>Service OAuth Settings</label>
|
|
363
|
+
</ExtlClntAppOauthSettings>
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
**Source-control note:** if you also need to manage client-credentials security settings in source, retrieve `ExtlClntAppOauthSecuritySettings:MyServiceApp` from an org first and commit the retrieved `.ecaOauthSecurity-meta.xml` file as your starting point.
|
|
367
|
+
|
|
368
|
+
### Implementation Pattern
|
|
369
|
+
|
|
370
|
+
```bash
|
|
371
|
+
curl -X POST https://login.salesforce.com/services/oauth2/token \
|
|
372
|
+
-d "grant_type=client_credentials" \
|
|
373
|
+
-d "client_id=<CONSUMER_KEY>" \
|
|
374
|
+
-d "client_secret=<CONSUMER_SECRET>"
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
### Security Checklist
|
|
378
|
+
- [ ] Execution user configured
|
|
379
|
+
- [ ] Consumer secret rotated regularly
|
|
380
|
+
- [ ] Scopes minimal (least privilege)
|
|
381
|
+
- [ ] IP restrictions enabled
|
|
382
|
+
|
|
383
|
+
---
|
|
384
|
+
|
|
385
|
+
## Refresh Token Patterns
|
|
386
|
+
|
|
387
|
+
### Standard Refresh
|
|
388
|
+
|
|
389
|
+
```javascript
|
|
390
|
+
async function refreshAccessToken(refreshToken) {
|
|
391
|
+
const response = await axios.post('https://login.salesforce.com/services/oauth2/token',
|
|
392
|
+
new URLSearchParams({
|
|
393
|
+
grant_type: 'refresh_token',
|
|
394
|
+
client_id: CLIENT_ID,
|
|
395
|
+
client_secret: CLIENT_SECRET,
|
|
396
|
+
refresh_token: refreshToken
|
|
397
|
+
})
|
|
398
|
+
);
|
|
399
|
+
|
|
400
|
+
return response.data;
|
|
401
|
+
}
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
### With Token Rotation (Recommended)
|
|
405
|
+
|
|
406
|
+
When `isRefreshTokenRotationEnabled=true`, each refresh returns a NEW refresh token:
|
|
407
|
+
|
|
408
|
+
```javascript
|
|
409
|
+
async function refreshWithRotation(refreshToken) {
|
|
410
|
+
const response = await refreshAccessToken(refreshToken);
|
|
411
|
+
|
|
412
|
+
// Store NEW refresh token (old one is now invalid)
|
|
413
|
+
await secureStorage.set('refresh_token', response.refresh_token);
|
|
414
|
+
await secureStorage.set('access_token', response.access_token);
|
|
415
|
+
|
|
416
|
+
return response;
|
|
417
|
+
}
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
### Refresh Token Policies
|
|
421
|
+
|
|
422
|
+
| Policy | Description | Use Case |
|
|
423
|
+
|--------|-------------|----------|
|
|
424
|
+
| `infinite` | Never expires | Trusted integrations |
|
|
425
|
+
| `immediately` | Expires on use | Maximum security |
|
|
426
|
+
| `zero` | Not issued | Access token only |
|
|
427
|
+
|
|
428
|
+
**Configuration**:
|
|
429
|
+
```xml
|
|
430
|
+
<oauthPolicy>
|
|
431
|
+
<refreshTokenPolicy>infinite</refreshTokenPolicy>
|
|
432
|
+
<isRefreshTokenRotationEnabled>true</isRefreshTokenRotationEnabled>
|
|
433
|
+
</oauthPolicy>
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
---
|
|
437
|
+
|
|
438
|
+
## Named Credentials Integration
|
|
439
|
+
|
|
440
|
+
### Why Use Named Credentials
|
|
441
|
+
- Secrets managed by Salesforce (not in code)
|
|
442
|
+
- Automatic token refresh
|
|
443
|
+
- Per-user or per-org authentication
|
|
444
|
+
- Audit trail in Setup Audit Trail
|
|
445
|
+
|
|
446
|
+
### Create Named Credential for JWT Flow
|
|
447
|
+
|
|
448
|
+
```xml
|
|
449
|
+
<!-- namedCredentials/SalesforceAPI.namedCredential-meta.xml -->
|
|
450
|
+
<NamedCredential xmlns="http://soap.sforce.com/2006/04/metadata">
|
|
451
|
+
<label>Salesforce API</label>
|
|
452
|
+
<endpoint>https://yourinstance.salesforce.com</endpoint>
|
|
453
|
+
<protocol>NoAuthentication</protocol>
|
|
454
|
+
<principalType>NamedUser</principalType>
|
|
455
|
+
<oauthConfig>
|
|
456
|
+
<certificate>JWTAuthCertificate</certificate>
|
|
457
|
+
<consumerKey>YOUR_CONSUMER_KEY</consumerKey>
|
|
458
|
+
<oauthFlows>JwtBearer</oauthFlows>
|
|
459
|
+
<username>integration@company.com</username>
|
|
460
|
+
</oauthConfig>
|
|
461
|
+
</NamedCredential>
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
### Use in Apex
|
|
465
|
+
|
|
466
|
+
```apex
|
|
467
|
+
HttpRequest req = new HttpRequest();
|
|
468
|
+
req.setEndpoint('callout:SalesforceAPI/services/data/v66.0/query?q=SELECT+Id+FROM+Account');
|
|
469
|
+
req.setMethod('GET');
|
|
470
|
+
|
|
471
|
+
Http http = new Http();
|
|
472
|
+
HttpResponse res = http.send(req);
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
---
|
|
476
|
+
|
|
477
|
+
## Token Introspection
|
|
478
|
+
|
|
479
|
+
**Use**: Validate token status and metadata
|
|
480
|
+
|
|
481
|
+
```bash
|
|
482
|
+
curl -X POST https://login.salesforce.com/services/oauth2/introspect \
|
|
483
|
+
-d "token=<ACCESS_TOKEN>" \
|
|
484
|
+
-d "client_id=<CONSUMER_KEY>" \
|
|
485
|
+
-d "client_secret=<CONSUMER_SECRET>" \
|
|
486
|
+
-d "token_type_hint=access_token"
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
---
|
|
490
|
+
|
|
491
|
+
## Token Revocation
|
|
492
|
+
|
|
493
|
+
**Use**: Invalidate tokens on logout
|
|
494
|
+
|
|
495
|
+
```bash
|
|
496
|
+
curl -X POST https://login.salesforce.com/services/oauth2/revoke \
|
|
497
|
+
-d "token=<TOKEN>"
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
---
|
|
501
|
+
|
|
502
|
+
## Error Handling Patterns
|
|
503
|
+
|
|
504
|
+
### OAuth Error Response Structure
|
|
505
|
+
|
|
506
|
+
```json
|
|
507
|
+
{
|
|
508
|
+
"error": "invalid_grant",
|
|
509
|
+
"error_description": "authentication failure"
|
|
510
|
+
}
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
### Common Errors
|
|
514
|
+
|
|
515
|
+
| Error Code | Meaning | Resolution |
|
|
516
|
+
|------------|---------|------------|
|
|
517
|
+
| `invalid_client_id` | Consumer key invalid | Verify key from Setup |
|
|
518
|
+
| `invalid_client` | Secret incorrect | Check consumer secret |
|
|
519
|
+
| `redirect_uri_mismatch` | Callback URL mismatch | Match exactly with config |
|
|
520
|
+
| `invalid_grant` | Auth code expired/used | Request new authorization |
|
|
521
|
+
| `unsupported_grant_type` | Flow not enabled | Enable in Connected App |
|
|
522
|
+
| `invalid_scope` | Scope not allowed | Check available scopes |
|
|
523
|
+
| `access_denied` | User declined | User must approve |
|
|
524
|
+
|
|
525
|
+
### Retry Logic Example
|
|
526
|
+
|
|
527
|
+
```javascript
|
|
528
|
+
async function callSalesforceAPI(accessToken, retries = 1) {
|
|
529
|
+
try {
|
|
530
|
+
return await axios.get('https://instance.salesforce.com/services/data/v66.0/query', {
|
|
531
|
+
headers: { 'Authorization': `Bearer ${accessToken}` }
|
|
532
|
+
});
|
|
533
|
+
} catch (error) {
|
|
534
|
+
if (error.response?.status === 401 && retries > 0) {
|
|
535
|
+
// Token expired, refresh and retry
|
|
536
|
+
const newToken = await refreshAccessToken();
|
|
537
|
+
return callSalesforceAPI(newToken, retries - 1);
|
|
538
|
+
}
|
|
539
|
+
throw error;
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
---
|
|
545
|
+
|
|
546
|
+
## Scoring Impact by Flow
|
|
547
|
+
|
|
548
|
+
| Flow | Security Score Impact | Best Practices Score |
|
|
549
|
+
|------|----------------------|---------------------|
|
|
550
|
+
| Authorization Code + PKCE | +10 (PKCE enabled) | +10 (modern flow) |
|
|
551
|
+
| JWT Bearer | +5 (certificate) | +15 (server-to-server best practice) |
|
|
552
|
+
| Device Authorization | +5 (secret optional) | +10 (appropriate for CLI) |
|
|
553
|
+
| Username-Password | -10 (deprecated) | -10 (anti-pattern) |
|
|
554
|
+
|
|
555
|
+
**Recommendation**: JWT Bearer or Authorization Code + PKCE score highest (90-100/120).
|
|
556
|
+
|
|
557
|
+
---
|
|
558
|
+
|
|
559
|
+
## Testing OAuth Flows
|
|
560
|
+
|
|
561
|
+
### Postman Collection Variables
|
|
562
|
+
|
|
563
|
+
```json
|
|
564
|
+
{
|
|
565
|
+
"login_url": "https://login.salesforce.com",
|
|
566
|
+
"client_id": "{{CONSUMER_KEY}}",
|
|
567
|
+
"client_secret": "{{CONSUMER_SECRET}}",
|
|
568
|
+
"redirect_uri": "https://localhost/oauth/callback",
|
|
569
|
+
"username": "test@company.com",
|
|
570
|
+
"password": "password123"
|
|
571
|
+
}
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
### Quick Test: JWT Bearer
|
|
575
|
+
|
|
576
|
+
```bash
|
|
577
|
+
# Generate JWT (requires jq)
|
|
578
|
+
JWT=$(python3 -c "
|
|
579
|
+
import jwt, time, os
|
|
580
|
+
claims = {
|
|
581
|
+
'iss': os.getenv('CONSUMER_KEY'),
|
|
582
|
+
'sub': 'integration@company.com',
|
|
583
|
+
'aud': 'https://login.salesforce.com',
|
|
584
|
+
'exp': int(time.time()) + 300
|
|
585
|
+
}
|
|
586
|
+
with open('server.key') as f:
|
|
587
|
+
print(jwt.encode(claims, f.read(), algorithm='RS256'))
|
|
588
|
+
")
|
|
589
|
+
|
|
590
|
+
# Get token
|
|
591
|
+
curl -X POST https://login.salesforce.com/services/oauth2/token \
|
|
592
|
+
-d "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer" \
|
|
593
|
+
-d "assertion=$JWT" | jq
|
|
594
|
+
```
|
|
595
|
+
|
|
596
|
+
---
|
|
597
|
+
|
|
598
|
+
## Migration Strategies
|
|
599
|
+
|
|
600
|
+
### Connected App → External Client App
|
|
601
|
+
|
|
602
|
+
**Step 1**: Create equivalent ECA
|
|
603
|
+
```bash
|
|
604
|
+
# Read existing Connected App
|
|
605
|
+
Grep: pattern="<oauthConfig>" path="force-app/main/default/connectedApps/"
|
|
606
|
+
|
|
607
|
+
# Create new ECA with same scopes
|
|
608
|
+
# Use templates: external-client-app.xml, eca-global-oauth.xml
|
|
609
|
+
```
|
|
610
|
+
|
|
611
|
+
**Step 2**: Parallel operation
|
|
612
|
+
- Deploy ECA alongside Connected App
|
|
613
|
+
- Update one integration at a time
|
|
614
|
+
- Monitor both apps
|
|
615
|
+
|
|
616
|
+
**Step 3**: Cutover
|
|
617
|
+
- Update all integrations to use new Consumer Key
|
|
618
|
+
- Disable old Connected App
|
|
619
|
+
- Archive after 30 days
|
|
620
|
+
|
|
621
|
+
**Scoring benefit**: ECA typically scores 15-20 points higher due to modern security model.
|
|
622
|
+
|
|
623
|
+
---
|
|
624
|
+
|
|
625
|
+
## Quick Reference
|
|
626
|
+
|
|
627
|
+
### Template Selection by Flow
|
|
628
|
+
|
|
629
|
+
| Flow | Template File |
|
|
630
|
+
|------|---------------|
|
|
631
|
+
| Authorization Code (basic) | `connected-app-oauth.xml` |
|
|
632
|
+
| JWT Bearer | `connected-app-jwt.xml` |
|
|
633
|
+
| Mobile/SPA (PKCE) | `external-client-app.xml` + `eca-global-oauth.xml` |
|
|
634
|
+
| Device Authorization | `connected-app-basic.xml` (secret optional) |
|
|
635
|
+
| Client Credentials | `eca-oauth-settings.xml` + optional retrieve-first `ecaOauthSecurity` metadata (ECA only) |
|
|
636
|
+
|
|
637
|
+
### Salesforce OAuth Endpoints
|
|
638
|
+
|
|
639
|
+
| Environment | Base URL |
|
|
640
|
+
|-------------|----------|
|
|
641
|
+
| Production | `https://login.salesforce.com` |
|
|
642
|
+
| Sandbox | `https://test.salesforce.com` |
|
|
643
|
+
| Custom Domain | `https://yourdomain.my.salesforce.com` |
|
|
644
|
+
|
|
645
|
+
### Key Endpoints
|
|
646
|
+
- Authorize: `/services/oauth2/authorize`
|
|
647
|
+
- Token: `/services/oauth2/token`
|
|
648
|
+
- Revoke: `/services/oauth2/revoke`
|
|
649
|
+
- Introspect: `/services/oauth2/introspect`
|
|
650
|
+
- Device Code: `/services/oauth2/device/code`
|
|
651
|
+
- UserInfo (OpenID): `/services/oauth2/userinfo`
|
|
652
|
+
|
|
653
|
+
---
|
|
654
|
+
|
|
655
|
+
## Related Resources
|
|
656
|
+
|
|
657
|
+
- **Flow Diagrams**: Included above (Authorization Code, JWT Bearer, Device Authorization)
|
|
658
|
+
- **Security Checklist**: [references/security-checklist.md](../references/security-checklist.md)
|
|
659
|
+
- **Migration Guide**: [references/migration-guide.md](../references/migration-guide.md)
|
|
660
|
+
- **Main Skill**: [SKILL.md](../SKILL.md)
|