Skip to content
Back to skills

133 Explains 09908d02

ASecurity

This guide explains how to automate Named Credential configuration using the sf-integration helper scripts. > **Key Insight:** Enhanced Named Credentials (API 60+) can be configured programmatically using `ConnectApi.NamedCredentials` - no UI required! ---

  • 9 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 11, 2026
securityrustbashapici/cdsecuritydocumentation

Works with

  • api

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned October 11, 2026

npx -y skills add tools-only/X-Skills --skill 133-explains_09908d02 --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of 133 Explains 09908d02?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for 133 Explains 09908d02
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tools-only-133-explains-09908d02/badge)](https://www.skillsdirectory.com/skills/tools-only-133-explains-09908d02)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
# Named Credentials Automation Guide

This guide explains how to automate Named Credential configuration using the sf-integration helper scripts.

> **Key Insight:** Enhanced Named Credentials (API 60+) can be configured programmatically using `ConnectApi.NamedCredentials` - no UI required!

---

## Overview

Enhanced Named Credentials = **External Credential** + **Named Credential** + **Endpoint Security**

```
External Credential (stores the API key securely)
         ↓
Named Credential (references the External Credential)
         ↓
Your HTTP Callout (uses callout:NamedCredentialName)
```

### Why Enhanced Named Credentials?

| Benefit | Description |
|---------|-------------|
| **Security** | AES-256 encryption by Salesforce platform |
| **Flexibility** | Supports Custom, Basic, OAuth, JWT protocols |
| **Portability** | Easier to manage across multiple orgs |
| **Automation** | Configurable via ConnectApi (no UI required) |
| **Compliance** | Passes PCI-DSS, SOC 2 audits |

---

## Deployment Order

**CRITICAL:** Deploy components in this exact order:

```bash
# 1. Deploy External Credential (defines the credential structure)
sf project deploy start \
  --source-dir force-app/main/default/externalCredentials/YourAPI.externalCredential-meta.xml \
  --target-org YourOrg

# 2. Deploy Named Credential (references the External Credential)
sf project deploy start \
  --source-dir force-app/main/default/namedCredentials/YourAPI.namedCredential-meta.xml \
  --target-org YourOrg

# 3. Deploy endpoint security (allows outbound HTTP calls)
sf project deploy start \
  --source-dir force-app/main/default/cspTrustedSites/YourAPI.cspTrustedSite-meta.xml \
  --target-org YourOrg

# 4. Set the API key using our automation script
./scripts/configure-named-credential.sh YourOrg
```

---

## Automation Scripts

### `configure-named-credential.sh`

**Purpose:** Sets API keys for Enhanced Named Credentials using ConnectApi

**Usage:**
```bash
./scripts/configure-named-credential.sh <org-alias>
```

**What it does:**
1. Validates org connection via `sf org display`
2. Checks External Credential exists via SOQL
3. Prompts for API key securely (input hidden)
4. Generates Apex using `ConnectApi.NamedCredentials.createCredential()`
5. Handles create vs. patch automatically

**Under the hood:**
```apex
ConnectApi.CredentialInput creds = new ConnectApi.CredentialInput();
creds.externalCredential = 'YourExternalCredential';
creds.principalName = 'yourPrincipalName';
creds.authenticationProtocol = ConnectApi.CredentialAuthenticationProtocol.Custom;

Map<String, ConnectApi.CredentialValueInput> params = new Map<String, ConnectApi.CredentialValueInput>();
ConnectApi.CredentialValueInput apiKey = new ConnectApi.CredentialValueInput();
apiKey.encrypted = true;
apiKey.value = 'YOUR_API_KEY';
params.put('apiKey', apiKey);

creds.credentials = params;
ConnectApi.NamedCredentials.createCredential(creds);
```

### `set-api-credential.sh`

**Purpose:** Stores API keys in Custom Settings (legacy/dev approach)

**Usage:**
```bash
# Secure input (recommended)
./scripts/set-api-credential.sh <setting-name> - <org-alias>

# Direct input
./scripts/set-api-credential.sh <setting-name> <api-key> <org-alias>
```

**When to use:**
- Dev/test environments
- CI/CD pipelines (no Apex execution)
- Simple API key auth via query parameters

**Not recommended for production** - use Enhanced Named Credentials instead.

---

## Complete Example: Weather API

### Step 1: Create Metadata

**External Credential:**
```xml
<?xml version="1.0" encoding="UTF-8"?>
<ExternalCredential xmlns="http://soap.sforce.com/2006/04/metadata">
    <authenticationProtocol>Custom</authenticationProtocol>
    <externalCredentialParameters>
        <parameterGroup>weatherAPIKey</parameterGroup>
        <parameterName>weatherAPIKey</parameterName>
        <parameterType>NamedPrincipal</parameterType>
        <sequenceNumber>1</sequenceNumber>
    </externalCredentialParameters>
    <label>Weather API</label>
</ExternalCredential>
```

**Named Credential:**
```xml
<?xml version="1.0" encoding="UTF-8"?>
<NamedCredential xmlns="http://soap.sforce.com/2006/04/metadata">
    <allowMergeFieldsInBody>false</allowMergeFieldsInBody>
    <allowMergeFieldsInHeader>true</allowMergeFieldsInHeader>
    <calloutStatus>Enabled</calloutStatus>
    <label>Weather API</label>
    <namedCredentialParameters>
        <parameterName>Url</parameterName>
        <parameterType>Url</parameterType>
        <parameterValue>https://api.weather.com</parameterValue>
    </namedCredentialParameters>
    <namedCredentialParameters>
        <externalCredential>WeatherAPI</externalCredential>
        <parameterName>ExternalCredential</parameterName>
        <parameterType>Authentication</parameterType>
    </namedCredentialParameters>
    <namedCredentialType>SecuredEndpoint</namedCredentialType>
</NamedCredential>
```

### Step 2: Deploy and Configure

```bash
# Deploy all metadata
sf project deploy start --metadata ExternalCredential:WeatherAPI \
  --metadata NamedCredential:WeatherAPI \
  --metadata CspTrustedSite:WeatherAPI \
  --target-org MyOrg

# Configure API key
./scripts/configure-named-credential.sh MyOrg
```

### Step 3: Use in Apex

```apex
HttpRequest req = new HttpRequest();
req.setEndpoint('callout:WeatherAPI/forecast?city=London');
req.setMethod('GET');

HttpResponse res = new Http().send(req);
System.debug(res.getBody());
```

The API key is automatically included - no manual credential handling!

---

## Troubleshooting

| Error | Cause | Fix |
|-------|-------|-----|
| "External Credential not found" | Not deployed or wrong name | Deploy first, check spelling |
| "Named Credential not found" | Not deployed | Deploy after External Credential |
| "No existing credentials to update" | Using patch instead of create | Script handles automatically |
| "Unable to connect" | Missing endpoint security | Deploy CSP Trusted Site |

---

## Related Documentation

- [named-credentials-guide.md](./named-credentials-guide.md) - Template reference
- [external-services-guide.md](./external-services-guide.md) - OpenAPI integration
- [security-best-practices.md](./security-best-practices.md) - Security patterns

Files in this skill

  • README.md924 B
  • skill.md6.1 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.