# JWT For Kali

To create a JSON Web Token (JWT) for Salesforce on **Kali Linux**, you can follow the steps below. Kali Linux is a Debian-based Linux distribution, so the process is similar to other Linux environments. You will use tools like **OpenSSL** for key generation and a programming language (e.g., Python) to generate the JWT.

---

### Step 1: Install Required Tools

Ensure you have the necessary tools installed on Kali Linux:

1. **OpenSSL**:
    
    
    - OpenSSL is pre-installed on Kali Linux. Verify by running: ```
        ✄𐘗```
        openssl version
        ```
        ```
        
        <div class="euiMarkdownFormat__codeblockWrapper"><div class="euiCodeBlock prismjs language-bash remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="euiCodeBlock__controls css-1wtdjjj-euiCodeBlock__controls-s"><div class="euiCodeBlock__copyButton"><span class="euiToolTipAnchor css-jcaat8-euiToolTipAnchor-inlineBlock"><button aria-label="Copy" class="euiButtonIcon css-sfdbbx-euiButtonIcon-xs-empty-text" data-test-subj="euiCodeBlockCopy" type="button"><svg aria-hidden="true" class="euiIcon euiButtonIcon__icon css-1kvegpu-euiIcon-m-inherit" height="16" role="img" viewbox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M2 2.729V2a1 1 0 0 1 1-1h2v1H3v12h4v1H3a1 1 0 0 1-1-1V2.729zM14 5V2a1 1 0 0 0-1-1h-2v1h2v3h1zm-1 1h2v9H8V6h5V5H8a1 1 0 0 0-1 1v9a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2v1z"></path><path d="M9 10h5V9H9v1zm0-2h5V7H9v1zm0 4h5v-1H9v1zm0 2h5v-1H9v1zm2-12V1a1 1 0 0 0-1-1H6a1 1 0 0 0-1 1v1h1V1h4v1h1zM5 3h6V2H5v1z"></path></svg></button></span></div></div></div></div>
    - If not installed, use: <div class="euiMarkdownFormat__codeblockWrapper"><div class="euiCodeBlock prismjs language-bash remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="css-gb1zbv-euiScreenReaderOnly">  
        </div></div></div>```
        ✄𐘗```
        sudo apt update
        sudo apt install openssl
        ```
        ```
        
        <div class="euiMarkdownFormat__codeblockWrapper"><div class="euiCodeBlock prismjs language-bash remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="euiCodeBlock__controls css-1wtdjjj-euiCodeBlock__controls-s"><div class="euiCodeBlock__copyButton"><span class="euiToolTipAnchor css-jcaat8-euiToolTipAnchor-inlineBlock"><button aria-label="Copy" class="euiButtonIcon css-sfdbbx-euiButtonIcon-xs-empty-text" data-test-subj="euiCodeBlockCopy" type="button"><svg aria-hidden="true" class="euiIcon euiButtonIcon__icon css-1kvegpu-euiIcon-m-inherit" height="16" role="img" viewbox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M2 2.729V2a1 1 0 0 1 1-1h2v1H3v12h4v1H3a1 1 0 0 1-1-1V2.729zM14 5V2a1 1 0 0 0-1-1h-2v1h2v3h1zm-1 1h2v9H8V6h5V5H8a1 1 0 0 0-1 1v9a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2v1z"></path><path d="M9 10h5V9H9v1zm0-2h5V7H9v1zm0 4h5v-1H9v1zm0 2h5v-1H9v1zm2-12V1a1 1 0 0 0-1-1H6a1 1 0 0 0-1 1v1h1V1h4v1h1zM5 3h6V2H5v1z"></path></svg></button></span></div></div></div></div>
2. **Python**:
    
    
    - Python is pre-installed on Kali Linux. Verify by running: <div class="euiMarkdownFormat__codeblockWrapper"><div class="euiCodeBlock prismjs language-bash remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="css-gb1zbv-euiScreenReaderOnly">  
        </div></div></div>```
        ✄𐘗```
        python3 --version
        ```
        ```
        
        <div class="euiMarkdownFormat__codeblockWrapper"><div class="euiCodeBlock prismjs language-bash remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="euiCodeBlock__controls css-1wtdjjj-euiCodeBlock__controls-s"><div class="euiCodeBlock__copyButton"><span class="euiToolTipAnchor css-jcaat8-euiToolTipAnchor-inlineBlock"><button aria-label="Copy" class="euiButtonIcon css-sfdbbx-euiButtonIcon-xs-empty-text" data-test-subj="euiCodeBlockCopy" type="button"><svg aria-hidden="true" class="euiIcon euiButtonIcon__icon css-1kvegpu-euiIcon-m-inherit" height="16" role="img" viewbox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M2 2.729V2a1 1 0 0 1 1-1h2v1H3v12h4v1H3a1 1 0 0 1-1-1V2.729zM14 5V2a1 1 0 0 0-1-1h-2v1h2v3h1zm-1 1h2v9H8V6h5V5H8a1 1 0 0 0-1 1v9a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2v1z"></path><path d="M9 10h5V9H9v1zm0-2h5V7H9v1zm0 4h5v-1H9v1zm0 2h5v-1H9v1zm2-12V1a1 1 0 0 0-1-1H6a1 1 0 0 0-1 1v1h1V1h4v1h1zM5 3h6V2H5v1z"></path></svg></button></span></div></div></div></div>
    - If not installed, use: <div class="euiMarkdownFormat__codeblockWrapper"><div class="euiCodeBlock prismjs language-bash remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="css-gb1zbv-euiScreenReaderOnly">  
        </div></div></div>```
        ✄𐘗```
        sudo apt update
        sudo apt install python3
        ```
        ```
        
        <div class="euiMarkdownFormat__codeblockWrapper"><div class="euiCodeBlock prismjs language-bash remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="euiCodeBlock__controls css-1wtdjjj-euiCodeBlock__controls-s"><div class="euiCodeBlock__copyButton"><span class="euiToolTipAnchor css-jcaat8-euiToolTipAnchor-inlineBlock"><button aria-label="Copy" class="euiButtonIcon css-sfdbbx-euiButtonIcon-xs-empty-text" data-test-subj="euiCodeBlockCopy" type="button"><svg aria-hidden="true" class="euiIcon euiButtonIcon__icon css-1kvegpu-euiIcon-m-inherit" height="16" role="img" viewbox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M2 2.729V2a1 1 0 0 1 1-1h2v1H3v12h4v1H3a1 1 0 0 1-1-1V2.729zM14 5V2a1 1 0 0 0-1-1h-2v1h2v3h1zm-1 1h2v9H8V6h5V5H8a1 1 0 0 0-1 1v9a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2v1z"></path><path d="M9 10h5V9H9v1zm0-2h5V7H9v1zm0 4h5v-1H9v1zm0 2h5v-1H9v1zm2-12V1a1 1 0 0 0-1-1H6a1 1 0 0 0-1 1v1h1V1h4v1h1zM5 3h6V2H5v1z"></path></svg></button></span></div></div></div></div>
3. **Python Libraries**:
    
    
    - Install the `PyJWT` library for generating JWTs: <div class="euiMarkdownFormat__codeblockWrapper"><div class="euiCodeBlock prismjs language-bash remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="css-gb1zbv-euiScreenReaderOnly">  
        </div></div></div>```
        ✄𐘗```
        pip3 install pyjwt
        ```
        ```
        
        <div class="euiMarkdownFormat__codeblockWrapper"><div class="euiCodeBlock prismjs language-bash remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="euiCodeBlock__controls css-1wtdjjj-euiCodeBlock__controls-s"><div class="euiCodeBlock__copyButton"><span class="euiToolTipAnchor css-jcaat8-euiToolTipAnchor-inlineBlock"><button aria-label="Copy" class="euiButtonIcon css-sfdbbx-euiButtonIcon-xs-empty-text" data-test-subj="euiCodeBlockCopy" type="button"><svg aria-hidden="true" class="euiIcon euiButtonIcon__icon css-1kvegpu-euiIcon-m-inherit" height="16" role="img" viewbox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M2 2.729V2a1 1 0 0 1 1-1h2v1H3v12h4v1H3a1 1 0 0 1-1-1V2.729zM14 5V2a1 1 0 0 0-1-1h-2v1h2v3h1zm-1 1h2v9H8V6h5V5H8a1 1 0 0 0-1 1v9a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2v1z"></path><path d="M9 10h5V9H9v1zm0-2h5V7H9v1zm0 4h5v-1H9v1zm0 2h5v-1H9v1zm2-12V1a1 1 0 0 0-1-1H6a1 1 0 0 0-1 1v1h1V1h4v1h1zM5 3h6V2H5v1z"></path></svg></button></span></div></div></div></div>

---

### Step 2: Generate a Private-Public Key Pair

Use OpenSSL to generate the private and public keys:

1. **Generate Private Key**:
    
    <div class="euiMarkdownFormat__codeblockWrapper"><div class="euiCodeBlock prismjs language-bash remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="css-gb1zbv-euiScreenReaderOnly">  
    </div></div></div>```
    ✄𐘗```
    openssl genrsa -out private.key 2048
    ```
    ```
    
    <div class="euiMarkdownFormat__codeblockWrapper"><div class="euiCodeBlock prismjs language-bash remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="euiCodeBlock__controls css-1wtdjjj-euiCodeBlock__controls-s"><div class="euiCodeBlock__copyButton"><span class="euiToolTipAnchor css-jcaat8-euiToolTipAnchor-inlineBlock"><button aria-label="Copy" class="euiButtonIcon css-sfdbbx-euiButtonIcon-xs-empty-text" data-test-subj="euiCodeBlockCopy" type="button"><svg aria-hidden="true" class="euiIcon euiButtonIcon__icon css-1kvegpu-euiIcon-m-inherit" height="16" role="img" viewbox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M2 2.729V2a1 1 0 0 1 1-1h2v1H3v12h4v1H3a1 1 0 0 1-1-1V2.729zM14 5V2a1 1 0 0 0-1-1h-2v1h2v3h1zm-1 1h2v9H8V6h5V5H8a1 1 0 0 0-1 1v9a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2v1z"></path><path d="M9 10h5V9H9v1zm0-2h5V7H9v1zm0 4h5v-1H9v1zm0 2h5v-1H9v1zm2-12V1a1 1 0 0 0-1-1H6a1 1 0 0 0-1 1v1h1V1h4v1h1zM5 3h6V2H5v1z"></path></svg></button></span></div></div></div></div>
2. **Generate Public Key**:
    
    <div class="euiMarkdownFormat__codeblockWrapper"><div class="euiCodeBlock prismjs language-bash remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="css-gb1zbv-euiScreenReaderOnly">  
    </div></div></div>```
    ✄𐘗```
    openssl rsa -in private.key -pubout -out public.key
    ```
    ```
    
    <div class="euiMarkdownFormat__codeblockWrapper"><div class="euiCodeBlock prismjs language-bash remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="euiCodeBlock__controls css-1wtdjjj-euiCodeBlock__controls-s"><div class="euiCodeBlock__copyButton"><span class="euiToolTipAnchor css-jcaat8-euiToolTipAnchor-inlineBlock"><button aria-label="Copy" class="euiButtonIcon css-sfdbbx-euiButtonIcon-xs-empty-text" data-test-subj="euiCodeBlockCopy" type="button"><svg aria-hidden="true" class="euiIcon euiButtonIcon__icon css-1kvegpu-euiIcon-m-inherit" height="16" role="img" viewbox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M2 2.729V2a1 1 0 0 1 1-1h2v1H3v12h4v1H3a1 1 0 0 1-1-1V2.729zM14 5V2a1 1 0 0 0-1-1h-2v1h2v3h1zm-1 1h2v9H8V6h5V5H8a1 1 0 0 0-1 1v9a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2v1z"></path><path d="M9 10h5V9H9v1zm0-2h5V7H9v1zm0 4h5v-1H9v1zm0 2h5v-1H9v1zm2-12V1a1 1 0 0 0-1-1H6a1 1 0 0 0-1 1v1h1V1h4v1h1zM5 3h6V2H5v1z"></path></svg></button></span></div></div></div></div>
3. **Verify Keys**:
    
    
    - View the private key: <div class="euiMarkdownFormat__codeblockWrapper"><div class="euiCodeBlock prismjs language-bash remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="css-gb1zbv-euiScreenReaderOnly">  
        </div></div></div>```
        ✄𐘗```
        cat private.key
        ```
        ```
        
        <div class="euiMarkdownFormat__codeblockWrapper"><div class="euiCodeBlock prismjs language-bash remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="euiCodeBlock__controls css-1wtdjjj-euiCodeBlock__controls-s"><div class="euiCodeBlock__copyButton"><span class="euiToolTipAnchor css-jcaat8-euiToolTipAnchor-inlineBlock"><button aria-label="Copy" class="euiButtonIcon css-sfdbbx-euiButtonIcon-xs-empty-text" data-test-subj="euiCodeBlockCopy" type="button"><svg aria-hidden="true" class="euiIcon euiButtonIcon__icon css-1kvegpu-euiIcon-m-inherit" height="16" role="img" viewbox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M2 2.729V2a1 1 0 0 1 1-1h2v1H3v12h4v1H3a1 1 0 0 1-1-1V2.729zM14 5V2a1 1 0 0 0-1-1h-2v1h2v3h1zm-1 1h2v9H8V6h5V5H8a1 1 0 0 0-1 1v9a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2v1z"></path><path d="M9 10h5V9H9v1zm0-2h5V7H9v1zm0 4h5v-1H9v1zm0 2h5v-1H9v1zm2-12V1a1 1 0 0 0-1-1H6a1 1 0 0 0-1 1v1h1V1h4v1h1zM5 3h6V2H5v1z"></path></svg></button></span></div></div></div></div>
    - View the public key: <div class="euiMarkdownFormat__codeblockWrapper"><div class="euiCodeBlock prismjs language-bash remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="css-gb1zbv-euiScreenReaderOnly">  
        </div></div></div>```
        ✄𐘗```
        cat public.key
        ```
        ```
        
        <div class="euiMarkdownFormat__codeblockWrapper"><div class="euiCodeBlock prismjs language-bash remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="euiCodeBlock__controls css-1wtdjjj-euiCodeBlock__controls-s"><div class="euiCodeBlock__copyButton"><span class="euiToolTipAnchor css-jcaat8-euiToolTipAnchor-inlineBlock"><button aria-label="Copy" class="euiButtonIcon css-sfdbbx-euiButtonIcon-xs-empty-text" data-test-subj="euiCodeBlockCopy" type="button"><svg aria-hidden="true" class="euiIcon euiButtonIcon__icon css-1kvegpu-euiIcon-m-inherit" height="16" role="img" viewbox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M2 2.729V2a1 1 0 0 1 1-1h2v1H3v12h4v1H3a1 1 0 0 1-1-1V2.729zM14 5V2a1 1 0 0 0-1-1h-2v1h2v3h1zm-1 1h2v9H8V6h5V5H8a1 1 0 0 0-1 1v9a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2v1z"></path><path d="M9 10h5V9H9v1zm0-2h5V7H9v1zm0 4h5v-1H9v1zm0 2h5v-1H9v1zm2-12V1a1 1 0 0 0-1-1H6a1 1 0 0 0-1 1v1h1V1h4v1h1zM5 3h6V2H5v1z"></path></svg></button></span></div></div></div></div>
4. **Upload Public Key to Salesforce**:
    
    
    - Log in to Salesforce and navigate to **Setup** &gt; **App Manager** &gt; Select your Connected App &gt; **Edit Policies** &gt; Upload the public key under **Certificate and Key Management**.

---

### Step 3: Create the JWT Using Python

Use Python to generate the JWT. Below is the Python script:

#### Python Script (`generate_jwt.py`)

<div class="euiMarkdownFormat__codeblockWrapper" id="bkmrk-python-code-block%3A"><div class="euiCodeBlock prismjs language-python remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="css-gb1zbv-euiScreenReaderOnly">python code block:</div></div></div>```
✄𐘗```
import jwt
import time

# Define the private key
private_key = """
-----BEGIN RSA PRIVATE KEY-----
YOUR_PRIVATE_KEY_HERE
-----END RSA PRIVATE KEY-----
"""

# Define the JWT payload
payload = {
    "iss": "YOUR_CONSUMER_KEY",  # Consumer Key from Salesforce Connected App
    "sub": "YOUR_SALESFORCE_USERNAME",  # Salesforce username
    "aud": "https://login.salesforce.com",  # Use https://test.salesforce.com for sandbox
    "exp": int(time.time()) + 300  # Token expiration time (5 minutes from now)
}

# Generate the JWT
token = jwt.encode(payload, private_key, algorithm="RS256")
print("Generated JWT:")
print(token)
```
```

<div class="euiMarkdownFormat__codeblockWrapper" id="bkmrk--3"><div class="euiCodeBlock prismjs language-python remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="euiCodeBlock__controls css-1wtdjjj-euiCodeBlock__controls-s"><div class="euiCodeBlock__copyButton"><span class="euiToolTipAnchor css-jcaat8-euiToolTipAnchor-inlineBlock"><button aria-label="Copy" class="euiButtonIcon css-sfdbbx-euiButtonIcon-xs-empty-text" data-test-subj="euiCodeBlockCopy" type="button"><svg aria-hidden="true" class="euiIcon euiButtonIcon__icon css-1kvegpu-euiIcon-m-inherit" height="16" role="img" viewbox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M2 2.729V2a1 1 0 0 1 1-1h2v1H3v12h4v1H3a1 1 0 0 1-1-1V2.729zM14 5V2a1 1 0 0 0-1-1h-2v1h2v3h1zm-1 1h2v9H8V6h5V5H8a1 1 0 0 0-1 1v9a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2v1z"></path><path d="M9 10h5V9H9v1zm0-2h5V7H9v1zm0 4h5v-1H9v1zm0 2h5v-1H9v1zm2-12V1a1 1 0 0 0-1-1H6a1 1 0 0 0-1 1v1h1V1h4v1h1zM5 3h6V2H5v1z"></path></svg></button></span></div></div></div></div>#### Steps to Run the Script

1. Save the script as `generate_jwt.py`.
2. Run the script: <div class="euiMarkdownFormat__codeblockWrapper"><div class="euiCodeBlock prismjs language-bash remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="css-gb1zbv-euiScreenReaderOnly">  
    </div></div></div>```
    ✄𐘗```
    python3 generate_jwt.py
    ```
    ```
    
    <div class="euiMarkdownFormat__codeblockWrapper"><div class="euiCodeBlock prismjs language-bash remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="euiCodeBlock__controls css-1wtdjjj-euiCodeBlock__controls-s"><div class="euiCodeBlock__copyButton"><span class="euiToolTipAnchor css-jcaat8-euiToolTipAnchor-inlineBlock"><button aria-label="Copy" class="euiButtonIcon css-sfdbbx-euiButtonIcon-xs-empty-text" data-test-subj="euiCodeBlockCopy" type="button"><svg aria-hidden="true" class="euiIcon euiButtonIcon__icon css-1kvegpu-euiIcon-m-inherit" height="16" role="img" viewbox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M2 2.729V2a1 1 0 0 1 1-1h2v1H3v12h4v1H3a1 1 0 0 1-1-1V2.729zM14 5V2a1 1 0 0 0-1-1h-2v1h2v3h1zm-1 1h2v9H8V6h5V5H8a1 1 0 0 0-1 1v9a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2v1z"></path><path d="M9 10h5V9H9v1zm0-2h5V7H9v1zm0 4h5v-1H9v1zm0 2h5v-1H9v1zm2-12V1a1 1 0 0 0-1-1H6a1 1 0 0 0-1 1v1h1V1h4v1h1zM5 3h6V2H5v1z"></path></svg></button></span></div></div></div></div>
3. The script will output the JWT token.

---

### Step 4: Use the JWT to Obtain an Access Token

Send the JWT to Salesforce using `curl` to obtain an access token.

#### Example Command

<div class="euiMarkdownFormat__codeblockWrapper" id="bkmrk--5"><div class="euiCodeBlock prismjs language-bash remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="css-gb1zbv-euiScreenReaderOnly">  
</div></div></div>```
✄𐘗```
curl -X POST https://login.salesforce.com/services/oauth2/token \
  -d "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer" \
  -d "assertion=YOUR_JWT"
```
```

<div class="euiMarkdownFormat__codeblockWrapper" id="bkmrk--6"><div class="euiCodeBlock prismjs language-bash remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="euiCodeBlock__controls css-1wtdjjj-euiCodeBlock__controls-s"><div class="euiCodeBlock__copyButton"><span class="euiToolTipAnchor css-jcaat8-euiToolTipAnchor-inlineBlock"><button aria-label="Copy" class="euiButtonIcon css-sfdbbx-euiButtonIcon-xs-empty-text" data-test-subj="euiCodeBlockCopy" type="button"><svg aria-hidden="true" class="euiIcon euiButtonIcon__icon css-1kvegpu-euiIcon-m-inherit" height="16" role="img" viewbox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M2 2.729V2a1 1 0 0 1 1-1h2v1H3v12h4v1H3a1 1 0 0 1-1-1V2.729zM14 5V2a1 1 0 0 0-1-1h-2v1h2v3h1zm-1 1h2v9H8V6h5V5H8a1 1 0 0 0-1 1v9a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2v1z"></path><path d="M9 10h5V9H9v1zm0-2h5V7H9v1zm0 4h5v-1H9v1zm0 2h5v-1H9v1zm2-12V1a1 1 0 0 0-1-1H6a1 1 0 0 0-1 1v1h1V1h4v1h1zM5 3h6V2H5v1z"></path></svg></button></span></div></div></div></div>Replace `YOUR_JWT` with the JWT generated in the previous step.

#### Example Response

<div class="euiMarkdownFormat__codeblockWrapper" id="bkmrk-json-code-block%3A"><div class="euiCodeBlock prismjs language-json remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="css-gb1zbv-euiScreenReaderOnly">json code block:</div></div></div>```
✄𐘗```
{
  "access_token": "00Dxx0000000000!AQEAQI...",
  "instance_url": "https://yourInstance.salesforce.com",
  "id": "https://login.salesforce.com/id/00Dxx0000000000/005xx000001Sv6e",
  "token_type": "Bearer",
  "issued_at": "1693142400",
  "signature": "abcdef123456..."
}
```
```

<div class="euiMarkdownFormat__codeblockWrapper" id="bkmrk--7"><div class="euiCodeBlock prismjs language-json remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="euiCodeBlock__controls css-1wtdjjj-euiCodeBlock__controls-s"><div class="euiCodeBlock__copyButton"><span class="euiToolTipAnchor css-jcaat8-euiToolTipAnchor-inlineBlock"><button aria-label="Copy" class="euiButtonIcon css-sfdbbx-euiButtonIcon-xs-empty-text" data-test-subj="euiCodeBlockCopy" type="button"><svg aria-hidden="true" class="euiIcon euiButtonIcon__icon css-1kvegpu-euiIcon-m-inherit" height="16" role="img" viewbox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M2 2.729V2a1 1 0 0 1 1-1h2v1H3v12h4v1H3a1 1 0 0 1-1-1V2.729zM14 5V2a1 1 0 0 0-1-1h-2v1h2v3h1zm-1 1h2v9H8V6h5V5H8a1 1 0 0 0-1 1v9a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2v1z"></path><path d="M9 10h5V9H9v1zm0-2h5V7H9v1zm0 4h5v-1H9v1zm0 2h5v-1H9v1zm2-12V1a1 1 0 0 0-1-1H6a1 1 0 0 0-1 1v1h1V1h4v1h1zM5 3h6V2H5v1z"></path></svg></button></span></div></div></div></div>---

### Step 5: Use the Access Token

Use the `access_token` to make authenticated API requests to Salesforce.

#### Example API Request

<div class="euiMarkdownFormat__codeblockWrapper" id="bkmrk--9"><div class="euiCodeBlock prismjs language-bash remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="css-gb1zbv-euiScreenReaderOnly">  
</div></div></div>```
✄𐘗```
curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
     https://yourInstance.salesforce.com/services/data/v57.0/sobjects/Account
```
```

<div class="euiMarkdownFormat__codeblockWrapper" id="bkmrk--10"><div class="euiCodeBlock prismjs language-bash remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="euiCodeBlock__controls css-1wtdjjj-euiCodeBlock__controls-s"><div class="euiCodeBlock__copyButton"><span class="euiToolTipAnchor css-jcaat8-euiToolTipAnchor-inlineBlock"><button aria-label="Copy" class="euiButtonIcon css-sfdbbx-euiButtonIcon-xs-empty-text" data-test-subj="euiCodeBlockCopy" type="button"><svg aria-hidden="true" class="euiIcon euiButtonIcon__icon css-1kvegpu-euiIcon-m-inherit" height="16" role="img" viewbox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M2 2.729V2a1 1 0 0 1 1-1h2v1H3v12h4v1H3a1 1 0 0 1-1-1V2.729zM14 5V2a1 1 0 0 0-1-1h-2v1h2v3h1zm-1 1h2v9H8V6h5V5H8a1 1 0 0 0-1 1v9a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2v1z"></path><path d="M9 10h5V9H9v1zm0-2h5V7H9v1zm0 4h5v-1H9v1zm0 2h5v-1H9v1zm2-12V1a1 1 0 0 0-1-1H6a1 1 0 0 0-1 1v1h1V1h4v1h1zM5 3h6V2H5v1z"></path></svg></button></span></div></div></div></div>---

### Troubleshooting

1. **Invalid Grant Error**:
    
    
    - Ensure the `sub` field matches the Salesforce username.
    - Ensure the `aud` field matches the correct Salesforce environment (`login.salesforce.com` or `test.salesforce.com`).
2. **Expired Token**:
    
    
    - Ensure the `exp` field is set to a future time (e.g., 5 minutes from now).
3. **Invalid Signature**:
    
    
    - Ensure the private key matches the public key uploaded to Salesforce.
4. **Debugging**:
    
    
    - Use verbose mode in `curl` to debug: <div class="euiMarkdownFormat__codeblockWrapper"><div class="euiCodeBlock prismjs language-bash remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="css-gb1zbv-euiScreenReaderOnly">  
        </div></div></div>```
        ✄𐘗```
        curl -v -X POST https://login.salesforce.com/services/oauth2/token \
          -d "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer" \
          -d "assertion=YOUR_JWT"
        ```
        ```
        
        <div class="euiMarkdownFormat__codeblockWrapper"><div class="euiCodeBlock prismjs language-bash remark-prismjs--fenced css-1lecq5a-euiCodeBlock-m-hasControls"><div class="euiCodeBlock__controls css-1wtdjjj-euiCodeBlock__controls-s"><div class="euiCodeBlock__copyButton"><span class="euiToolTipAnchor css-jcaat8-euiToolTipAnchor-inlineBlock"><button aria-label="Copy" class="euiButtonIcon css-sfdbbx-euiButtonIcon-xs-empty-text" data-test-subj="euiCodeBlockCopy" type="button"><svg aria-hidden="true" class="euiIcon euiButtonIcon__icon css-1kvegpu-euiIcon-m-inherit" height="16" role="img" viewbox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M2 2.729V2a1 1 0 0 1 1-1h2v1H3v12h4v1H3a1 1 0 0 1-1-1V2.729zM14 5V2a1 1 0 0 0-1-1h-2v1h2v3h1zm-1 1h2v9H8V6h5V5H8a1 1 0 0 0-1 1v9a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2v1z"></path><path d="M9 10h5V9H9v1zm0-2h5V7H9v1zm0 4h5v-1H9v1zm0 2h5v-1H9v1zm2-12V1a1 1 0 0 0-1-1H6a1 1 0 0 0-1 1v1h1V1h4v1h1zM5 3h6V2H5v1z"></path></svg></button></span></div></div></div></div>

---

### Additional Resources

- [Salesforce JWT Bearer Token Flow<svg aria-hidden="true" class="euiIcon css-1mv5qmp-euiIcon-s" height="16" role="presentation" viewbox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M11 2h2.293L6.646 8.646l.708.708L14 2.707V5h1V1h-4v1Z"></path><path d="M3 2a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V7h-1v6H3V3h6V2H3Z"></path></svg><span class="css-gb1zbv-euiScreenReaderOnly">(external, opens in a new tab or window)</span>](https://help.salesforce.com/s/articleView?id=sf.remoteaccess_oauth_jwt_flow.htm&type=5)
- [PyJWT Documentation<svg aria-hidden="true" class="euiIcon css-1mv5qmp-euiIcon-s" height="16" role="presentation" viewbox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M11 2h2.293L6.646 8.646l.708.708L14 2.707V5h1V1h-4v1Z"></path><path d="M3 2a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V7h-1v6H3V3h6V2H3Z"></path></svg><span class="css-gb1zbv-euiScreenReaderOnly">(external, opens in a new tab or window)</span>](https://pyjwt.readthedocs.io/)
- [OpenSSL Documentation<svg aria-hidden="true" class="euiIcon css-1mv5qmp-euiIcon-s" height="16" role="presentation" viewbox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M11 2h2.293L6.646 8.646l.708.708L14 2.707V5h1V1h-4v1Z"></path><path d="M3 2a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V7h-1v6H3V3h6V2H3Z"></path></svg><span class="css-gb1zbv-euiScreenReaderOnly">(external, opens in a new tab or window)</span>](https://www.openssl.org/docs/)

Let me know if you need further assistance!