Bearer token authentication
Bearer token authentication is the most common auth method for REST APIs. The token is sent in the Authorization header with each request.
Configuration
Mission file
source API {
auth: bearer,
base: "https://api.example.com"
}
Credentials file
{
"API": {
"type": "bearer",
"token": "your-api-token"
}
}
How it works
Reqon adds the token to every request:
GET /api/users HTTP/1.1
Host: api.example.com
Authorization: Bearer your-api-token
Credential options
| Field | Required | Description |
|---|---|---|
type | Yes | Must be "bearer" |
token | Yes | The bearer token |
Environment variables
In credentials file
{
"API": {
"type": "bearer",
"token": "${API_TOKEN}"
}
}
Then set the environment variable:
export API_TOKEN="your-token"
reqon mission.vague --auth credentials.json
The source block only declares the auth type. The token never goes inline in the source block; it always comes from the credentials file or an environment variable.
Auto-discovered environment variables
You can skip the credentials file entirely. Reqon reads REQON_{SOURCE}_{FIELD}, where {SOURCE} is the uppercased source name. For a source named API:
export REQON_API_TOKEN="your-token"
reqon mission.vague
A token with no explicit type defaults to bearer.
Common use cases
GitHub API
source GitHub {
auth: bearer,
base: "https://api.github.com"
}
{
"GitHub": {
"type": "bearer",
"token": "ghp_xxxxxxxxxxxxxxxxxxxx"
}
}
Stripe API
source Stripe {
auth: bearer,
base: "https://api.stripe.com/v1"
}
{
"Stripe": {
"type": "bearer",
"token": "sk_live_xxxxxxxxxxxxxxxxxxxx"
}
}
Custom API
source CustomAPI {
auth: bearer,
base: "https://api.mycompany.com/v1"
}
{
"CustomAPI": {
"type": "bearer",
"token": "your-custom-token"
}
}
Token rotation
Manual rotation
- Generate new token in API provider
- Update credentials file
- Run mission
Programmatic rotation
import { execute } from 'reqon-dsl';
const token = await fetchNewToken(); // Your logic
await execute(source, {
auth: {
API: {
type: 'bearer',
token
}
}
});
Handling expiration
Bearer tokens are sent as-is and are not refreshed. If a bearer token expires, the request fails with a 401 and the mission stops. To recover, update the token in your credentials file or environment variable and run again. If you need automatic refresh on 401, use OAuth 2.0 instead.
Multiple tokens
For APIs requiring different tokens per endpoint:
source ReadAPI {
auth: bearer,
base: "https://api.example.com"
}
source WriteAPI {
auth: bearer,
base: "https://api.example.com"
}
{
"ReadAPI": {
"type": "bearer",
"token": "read-only-token"
},
"WriteAPI": {
"type": "bearer",
"token": "write-token"
}
}
Security best practices
Store tokens securely
# Never commit tokens
echo "credentials.json" >> .gitignore
Use environment variables
export API_TOKEN=$(cat ~/.secrets/api-token)
Rotate regularly
Set up periodic token rotation in your CI/CD pipeline.
Use minimal scopes
If the API supports scoped tokens, use the minimum required permissions.
Troubleshooting
"401 Unauthorized"
- Check token is correct
- Check token hasn't expired
- Verify token has required permissions
"Invalid token format"
Ensure token doesn't have extra whitespace:
{
"API": {
"type": "bearer",
"token": "your-token" // No leading/trailing spaces
}
}
Token not being sent
Verify source name matches:
source MyAPI { auth: bearer } // Name: MyAPI
{
"MyAPI": { // Must match exactly
"type": "bearer",
"token": "..."
}
}