Skip to content

Salesforce Setup Guide - Complete Walkthrough

Step-by-step guide to configure Salesforce access for the Salesforce Toolkit

This guide will walk you through every single step to set up authentication with Salesforce, from creating a Connected App to testing your first API call.


Table of Contents

  1. Prerequisites
  2. Method 1: JWT Bearer Flow (Recommended)
  3. Method 2: OAuth Password Flow
  4. Testing Your Setup
  5. Troubleshooting
  6. Security Best Practices

Prerequisites

Before starting, make sure you have:

  • ✅ Salesforce Account with admin access (or API permissions)
  • ✅ Python 3.8+ installed
  • ✅ OpenSSL installed (for JWT method)
  • Windows: Download from slproweb.com
  • macOS: Pre-installed
  • Linux: Pre-installed (or sudo apt-get install openssl)
  • ✅ Salesforce Toolkit installed (pip install salesforce-toolkit)

Why JWT? - ✅ More secure (no passwords stored) - ✅ No security token needed - ✅ Recommended for production - ✅ Supports server-to-server integration

Step 1: Generate RSA Key Pair

Open your terminal and run:

# Navigate to your project directory
cd /path/to/your/project

# Create a directory for certificates (optional but recommended)
mkdir certs
cd certs

# Generate private key (2048-bit RSA)
openssl genrsa -out server.key 2048

# Generate self-signed certificate (valid for 365 days)
openssl req -new -x509 -key server.key -out server.crt -days 365

When prompted, enter:

Country Name (2 letter code): IT
State or Province Name: Lombardia
Locality Name: Milan
Organization Name: Your Company
Organizational Unit Name: IT
Common Name: localhost
Email Address: your@email.com

Result: You'll have two files: - server.key - Private key (NEVER share this!) - server.crt - Certificate (upload to Salesforce)

Important: Note the absolute path to server.key. You'll need it later.


Step 2: Create Connected App in Salesforce

2.1 Navigate to App Manager

  1. Login to your Salesforce org
  2. Click the ⚙️ gear icon (top right) → Setup
  3. In the Quick Find box (left sidebar), type: "App Manager"
  4. Click "App Manager" under Platform Tools → Apps
  5. Click "New Connected App" button (top right)

2.2 Fill Basic Information

In the Basic Information section:

Connected App Name: My Salesforce Integration
API Name: My_Salesforce_Integration (auto-generated, leave as is)
Contact Email: your@email.com
Description: Integration for Salesforce Toolkit (optional)

2.3 Configure API (Enable OAuth Settings)

Scroll down to API (Enable OAuth Settings):

  1. ✅ Check "Enable OAuth Settings"

  2. Callback URL: Enter https://localhost

  3. Note: For JWT, the callback URL doesn't matter, but it's required

  4. Selected OAuth Scopes: Click "Add" to move these from Available to Selected:

  5. Access the identity URL service (id, profile, email, address, phone)
  6. Full access (full)
  7. Perform requests at any time (refresh_token, offline_access)

  8. ✅ Check "Use digital signatures"

  9. Upload Certificate:

  10. Click "Choose File"
  11. Select server.crt (the certificate, NOT server.key!)
  12. The file will upload

  13. ✅ Check "Require Proof Key for Code Exchange (PKCE)" (optional, for extra security)

2.4 Save and Wait

  1. Click "Save" at the bottom
  2. Click "Continue" on the confirmation screen
  3. ⏰ IMPORTANT: Wait 2-10 minutes for Salesforce to process your Connected App

Step 3: Copy Consumer Key

After waiting 2-10 minutes:

  1. Go back to Setup → App Manager
  2. Find your Connected App in the list
  3. Click the ▼ dropdown at the right → "View"
  4. You'll see the API (Enable OAuth Settings) section
  5. Copy the "Consumer Key"
  6. It's a long string like: 3MVG9XPlQYHF2jxAtyNlZrULLGJ06jOs...
  7. Keep this safe! You'll need it in your .env file

Tip: Click the copy icon (📋) next to Consumer Key to copy it.


Step 4: Pre-Authorize Users (CRITICAL!)

This is the most commonly missed step!

Without pre-authorization, you'll get an invalid_grant error.

4.1 Edit Policies

  1. In the Connected App view, click "Manage" (top of page)
  2. Click "Edit Policies"
  3. Scroll to "OAuth Policies" section
  4. Permitted Users: Change from "All users may self-authorize" to:
  5. "Admin approved users are pre-authorized"
  6. Click "Save"

4.2 Add User Profiles/Permission Sets

  1. Scroll down on the same page
  2. You'll see two sections:
  3. Profiles (Manage Profiles)
  4. Permission Sets (Manage Permission Sets)

  5. Click "Manage Profiles"

  6. Add your user's profile:
  7. For admin users: Select "System Administrator"
  8. For regular users: Select their profile (e.g., "Standard User")
  9. Click "Save"

Alternative: If using Permission Sets: 1. Click "Manage Permission Sets" 2. Select the appropriate permission set 3. Click "Save"


Step 5: Configure Environment Variables

Create a .env file in your project root:

# Salesforce JWT Authentication
SF_CLIENT_ID=3MVG9XPlQYHF2jxAtyNlZrULLGJ...YOUR_CONSUMER_KEY_HERE
SF_USERNAME=your.username@company.com.sandbox
SF_PRIVATE_KEY_PATH=/absolute/path/to/certs/server.key
SF_LOGIN_URL=https://test.salesforce.com

# API Version
SF_API_VERSION=v60.0

# Logging
LOG_DIR=./logs
LOG_LEVEL=INFO
LOG_CONSOLE_OUTPUT=true
LOG_CONSOLE_COLORS=true

Replace with your values:

Variable Value Example
SF_CLIENT_ID Consumer Key from Step 3 3MVG9XPlQYHF2jx...
SF_USERNAME Your Salesforce username admin@vuscom.com.dev1
SF_PRIVATE_KEY_PATH ABSOLUTE path to server.key /Users/antonio/project/certs/server.key
SF_LOGIN_URL Sandbox: https://test.salesforce.com
Production: https://login.salesforce.com
https://test.salesforce.com

Critical: SF_PRIVATE_KEY_PATH must be an absolute path, not relative!

How to get absolute path: - Windows: C:\Users\YourName\project\certs\server.key - macOS/Linux: Run pwd in the certs folder, then append /server.key


Step 6: Test Authentication

Create a test script test_auth.py:

from salesforce_toolkit import JWTAuthenticator

print("Testing JWT authentication...")

try:
    # Authenticate using .env configuration
    auth = JWTAuthenticator.from_env()
    session = auth.authenticate()

    print("\n✅ SUCCESS! Authentication successful!")
    print(f"📍 Instance URL: {session.instance_url}")
    print(f"🔧 API Version: {session.api_version}")
    print(f"👤 Username: {session.username}")
    print(f"🔑 Access Token: {session.access_token[:20]}...")

except FileNotFoundError as e:
    print(f"\n❌ ERROR: Private key file not found")
    print(f"   Make sure SF_PRIVATE_KEY_PATH in .env is an absolute path")
    print(f"   Current value causes error: {e}")

except Exception as e:
    print(f"\n❌ ERROR: Authentication failed")
    print(f"   Error: {e}")
    print("\n💡 Common issues:")
    print("   1. Consumer Key is incorrect")
    print("   2. User is not pre-authorized (Step 4)")
    print("   3. Wrong login URL (sandbox vs production)")
    print("   4. Connected App not fully processed (wait 10 minutes)")

Run the test:

python test_auth.py

Expected output:

Testing JWT authentication...

✅ SUCCESS! Authentication successful!
📍 Instance URL: https://vuscom--dev1.sandbox.my.salesforce.com
🔧 API Version: v60.0
👤 Username: admin@vuscom.com.dev1
🔑 Access Token: 00D5e000000abcd!AR...


Method 2: OAuth Password Flow

When to use: Development/testing only (not recommended for production)

Step 1: Create Connected App

Follow Steps 2.1 and 2.2 from JWT method above, BUT:

In Step 2.3 (OAuth Settings): - ✅ Enable OAuth Settings - Callback URL: https://localhost - Selected OAuth Scopes: Same as JWT - ❌ DO NOT check "Use digital signatures"

Click "Save" and wait 2-10 minutes.


Step 2: Get Consumer Key and Secret

  1. Go to Setup → App Manager → Your Connected App → View
  2. In the API (Enable OAuth Settings) section:
  3. Copy "Consumer Key"
  4. Click "Click to reveal" next to "Consumer Secret"
  5. Or click "Manage Consumer Details"
  6. Verify your identity (code via email)
  7. Copy "Consumer Secret"

Step 3: Get Security Token

  1. Click your profile picture (top right) → "Settings"
  2. In the left menu, search for "Reset My Security Token"
  3. Or navigate: My Personal Information → Reset My Security Token
  4. Click "Reset Security Token"
  5. Check your email - you'll receive the new Security Token
  6. Copy the Security Token

Note: The Security Token is appended to your password when authenticating.


Step 4: Configure .env

# Salesforce OAuth Password Flow
SF_CLIENT_ID=3MVG9XPlQYHF2jx...CONSUMER_KEY
SF_CLIENT_SECRET=1234567890ABCDEF...CONSUMER_SECRET
SF_USERNAME=your.username@company.com.sandbox
SF_PASSWORD=YourPassword
SF_SECURITY_TOKEN=ABC123XYZ...TOKEN_FROM_EMAIL
SF_LOGIN_URL=https://test.salesforce.com

# Logging
LOG_DIR=./logs
LOG_LEVEL=INFO

Important: - For sandbox, use https://test.salesforce.com - For production, use https://login.salesforce.com


Step 5: Test Authentication

from salesforce_toolkit import OAuthAuthenticator

print("Testing OAuth authentication...")

try:
    auth = OAuthAuthenticator.from_env()
    session = auth.authenticate()

    print("\n✅ SUCCESS! Authentication successful!")
    print(f"📍 Instance URL: {session.instance_url}")
    print(f"👤 Username: {session.username}")

except Exception as e:
    print(f"\n❌ ERROR: {e}")

Testing Your Setup

Once authenticated, test basic operations:

from salesforce_toolkit import JWTAuthenticator, SalesforceClient

# Authenticate
auth = JWTAuthenticator.from_env()
session = auth.authenticate()
client = SalesforceClient(session)

# Test 1: Query existing records
print("\n📊 Test 1: Querying Accounts...")
accounts = client.query("SELECT Id, Name FROM Account LIMIT 5")
print(f"✅ Found {len(accounts)} accounts")
for acc in accounts:
    print(f"  - {acc['Name']} ({acc['Id']})")

# Test 2: Create a test record
print("\n➕ Test 2: Creating test Account...")
account_id = client.create("Account", {
    "Name": "Test Account - DELETE ME",
    "Phone": "555-0100"
})
print(f"✅ Created Account: {account_id}")

# Test 3: Update the record
print("\n✏️ Test 3: Updating Account...")
client.update("Account", account_id, {"Phone": "555-9999"})
print(f"✅ Updated Account")

# Test 4: Delete the record
print("\n🗑️ Test 4: Deleting Account...")
client.delete("Account", account_id)
print(f"✅ Deleted Account")

print("\n🎉 All tests passed!")

Troubleshooting

Error: "invalid_grant"

Symptoms: Authentication failed: invalid_grant

Causes & Solutions:

  1. User not pre-authorized (most common)
  2. ✅ Go to Connected App → Manage → Edit Policies
  3. ✅ Set "Permitted Users" to "Admin approved users are pre-authorized"
  4. ✅ Add user profile via "Manage Profiles"

  5. Consumer Key is incorrect

  6. ✅ Double-check SF_CLIENT_ID in .env
  7. ✅ Make sure you copied the entire key

  8. Certificate mismatch (JWT only)

  9. ✅ Regenerate certificate and re-upload to Salesforce
  10. ✅ Make sure server.crt and server.key are from the same generation

  11. Wrong login URL

  12. ✅ Sandbox: https://test.salesforce.com
  13. ✅ Production: https://login.salesforce.com

  14. Connected App not ready

  15. ✅ Wait 2-10 minutes after creating/editing the Connected App

Error: "FileNotFoundError: Private key file not found"

Cause: SF_PRIVATE_KEY_PATH is incorrect or relative

Solutions:

# Get absolute path (macOS/Linux)
cd /path/to/certs
pwd  # Copy this path
# Then in .env: SF_PRIVATE_KEY_PATH=/absolute/path/to/certs/server.key

# Get absolute path (Windows)
cd C:\path\to\certs
cd  # Shows current directory
# Then in .env: SF_PRIVATE_KEY_PATH=C:\path\to\certs\server.key


Error: "invalid_client_id"

Cause: Consumer Key is incorrect

Solution: 1. Go to Setup → App Manager → Your App → View 2. Copy "Consumer Key" again 3. Update SF_CLIENT_ID in .env


Error: "invalid_client_credentials" (OAuth only)

Cause: Consumer Secret is incorrect

Solution: 1. Go to Setup → App Manager → Your App → View 2. Click "Manage Consumer Details" 3. Verify identity 4. Copy "Consumer Secret" 5. Update SF_CLIENT_SECRET in .env


Error: "authentication failure" (OAuth only)

Cause: Incorrect password or security token

Solution: 1. Verify SF_PASSWORD is correct 2. Reset Security Token (Settings → Reset My Security Token) 3. Update SF_SECURITY_TOKEN in .env


Security Best Practices

DO ✅

  1. Store keys securely

    chmod 600 certs/server.key  # Restrict access
    

  2. Use .gitignore

    .env
    certs/server.key
    *.key
    *.pem
    

  3. Rotate certificates regularly

  4. Regenerate every 6-12 months

  5. Use separate Connected Apps

  6. One for development
  7. One for production

  8. Restrict IP ranges (if possible)

  9. Connected App → Manage → Edit Policies → IP Relaxation

  10. Monitor API usage

  11. Setup → System Overview → API Usage

DON'T ❌

  1. ❌ Commit .env or server.key to git
  2. ❌ Share Consumer Secret publicly
  3. ❌ Use OAuth password flow in production
  4. ❌ Use same credentials for dev and prod
  5. ❌ Give "Full Access" to users who don't need it

Quick Reference

File Locations

your-project/
├── .env                    # Configuration (NEVER commit!)
├── certs/
│   ├── server.key          # Private key (NEVER commit!)
│   └── server.crt          # Certificate (upload to Salesforce)
└── your_script.py

Environment Variables (JWT)

SF_CLIENT_ID=3MVG9...       # From Salesforce Connected App
SF_USERNAME=user@domain     # Your Salesforce username
SF_PRIVATE_KEY_PATH=/abs/path/server.key  # ABSOLUTE path
SF_LOGIN_URL=https://test.salesforce.com  # or login.salesforce.com

Environment Variables (OAuth)

SF_CLIENT_ID=3MVG9...       # Consumer Key
SF_CLIENT_SECRET=12345...   # Consumer Secret
SF_USERNAME=user@domain
SF_PASSWORD=yourpassword
SF_SECURITY_TOKEN=ABC123... # From email
SF_LOGIN_URL=https://test.salesforce.com

Next Steps

After successful authentication:

  1. ✅ Try the Quick Start Guide
  2. ✅ Run the Examples
  3. ✅ Read the README
  4. ✅ Build your first pipeline

Need help? - Check INSTALLATION.md for more details - Open an issue on GitHub - Read the Troubleshooting section above


✨ You're all set! Happy coding!