OAuth Client Management
Creating OAuth Clients
Step-by-Step: Create an OAuth Client
Access Path:
Admin → Integrations → OAuth → Add client
OR
Menu → IT and Integrations → OAuth → Add client
Procedure:
1. Click "Add Client" Button
└─ "Add New Client" page appears
2. Enter Application Name (Required)
├─ Your application's display name
├─ Example: "Salesforce Integration Service"
├─ Visible in admin dashboard
└─ Visible in authorization screens
3. Enter Description (Optional)
├─ What the application does
├─ Example: "Syncs Salesforce contacts to Genesys every 30 minutes"
├─ Helpful for documentation
└─ Visible in admin UI
4. Select Grant Type(s)
├─ Choose one or more:
│ ├─ Client Credentials (service-to-service)
│ ├─ Code Authorization / PKCE (web/mobile apps)
│ ├─ Token Implicit Grant (DEPRECATED - don't use)
│ └─ SAML2 Bearer (enterprise SSO)
│
├─ Can select multiple grant types
├─ Each grant type has specific settings
└─ Note: Cannot select Implicit after March 2026
5. Click "Next" Button
└─ Proceed to grant-specific configuration
6. Grant-Specific Configuration:
For Client Credentials:
├─ Assign Roles (Required)
│ ├─ Select minimum roles needed
│ ├─ Available roles listed
│ ├─ Application will have these permissions
│ └─ Note: Must have roles in your profile to assign
│
├─ Assign Divisions
│ ├─ Required for role assignment
│ ├─ Roles scoped to divisions
│ ├─ Default: Home Division
│ └─ Update to appropriate divisions
│
└─ Token Duration
├─ Configurable: 300-172,800 seconds
├─ Default: 3600 seconds (1 hour)
├─ SCIM special: up to 450 days
└─ Your choice based on use case
For Authorization Code / PKCE:
├─ Token Duration
│ ├─ Configurable: 300-172,800 seconds
│ ├─ Default: 3600 seconds (1 hour)
│ └─ Recommended: 18 hours (64,800 seconds)
│
├─ Authorized Redirect URIs (Required)
│ ├─ Up to 125 URIs
│ ├─ One per line
│ ├─ Must use HTTPS
│ ├─ Example: https://yourapp.com/callback
│ ├─ Example: https://yourapps.com/auth
│ ├─ Example: http://localhost:3000/callback (dev)
│ ├─ Loopback: http://localhost/ (any port)
│ └─ MUST be exact match (case-sensitive)
│
└─ Scopes (Required)
├─ Click "Scope" button
├─ Select minimum scopes needed
├─ Space-separated in requests
├─ Example: "conversations:readonly users:readonly"
└─ Recommended: Least privilege principle
7. Click "Next" Button
└─ Review configuration
8. Review & Save
├─ Verify all settings
├─ Check OAuth name
├─ Confirm grant type(s)
├─ Verify scopes correct
└─ Click "Save"
9. Client Created Successfully
├─ System generates Client ID
├─ System generates Client Secret
├─ IMPORTANT: Copy secret immediately!
└─ Secret cannot be retrieved later
10. Display Confirmation
├─ Client Name: Your application name
├─ Client ID: Unique identifier (public)
├─ Grant Types: Selected methods
├─ Scopes: Requested permissions
├─ Created By: Your username
├─ Created Date: Timestamp
└─ Client Secret: (hidden after creation)
11. Finish
└─ Client ready to use
Typical Client Example:
Name: Salesforce Contact Sync
Grant Type: Client Credentials
Roles: External Contact Manager, Agent
Divisions: Home Division
Token Duration: 86400 (1 day)
Scopes: externalcontacts:manage
Created: 2026-03-13
Client Secret Management (Critical - March 2026 Change)
⚠️ IMPORTANT SECURITY UPDATE (March 2026)
Previous Behavior:
├─ Client secret visible in admin UI anytime
├─ Could view secret for existing clients
├─ Increased exposure risk
└─ Security concern
Current Behavior (March 2026):
├─ Client secret only shown at creation
├─ Cannot view secret after creation
├─ Must copy immediately when created
├─ Cannot retrieve via API
└─ Enhanced security
Action Required at Client Creation:
1. When Client Created:
├─ Page displays client secret
├─ Only time you see it
└─ Immediately copy and store
2. Copy Secret:
├─ Click "Copy" button
├─ OR manually select and copy
└─ Keep safe!
3. Store Secret Securely:
├─ Secure vault (recommended)
├─ Environment variables
├─ NOT in code
├─ NOT in git repository
├─ NOT in logs
└─ Encrypted storage
4. Acknowledge:
├─ Checkbox: "I have copied and stored the secret"
├─ Verify before checking
└─ Only way to proceed
5. If You Lose It:
├─ Cannot retrieve from UI
├─ Click "Generate new secret"
├─ New secret replaces old
├─ Old secret no longer works
└─ Update application immediately
Secure Storage Solutions:
HashiCorp Vault:
├─ Enterprise secret management
├─ Encryption, rotation, audit
├─ Recommended: Production environments
└─ Access via API
AWS Secrets Manager:
├─ AWS-native secret storage
├─ Encryption, rotation, audit
├─ Recommended: AWS environments
└─ IAM-based access control
Azure Key Vault:
├─ Azure-native solution
├─ Encryption, versioning
├─ Recommended: Azure environments
└─ RBAC access control
Environment Variables (Dev Only):
├─ .env file (development)
├─ Never commit to git
├─ NOT for production
├─ Simple for local development
└─ Use .gitignore
Docker Secrets:
├─ Container orchestration
├─ Swarm/Kubernetes
├─ Encrypted storage
└─ Recommended: Container deployments
Never Store:
❌ In application code
❌ In git repository
❌ In version control
❌ In logs
❌ In configuration files
❌ In plain text
❌ In comments
❌ In documentation
OAuth Client Security
Security Best Practices:
Secret Rotation:
Timeline:
├─ Rotate monthly minimum
├─ Before employee departures
├─ After any exposure
├─ If suspected compromise
└─ Automated via CI/CD
Process:
1. Generate New Secret:
├─ Click "Generate new secret"
├─ Confirm action
└─ New secret displayed once
2. Update Application:
├─ Update configuration
├─ Dual-use period: old + new both work
├─ Monitor for errors
└─ Verify new secret works
3. Verify Working:
├─ Test authentication
├─ Check logs for success
├─ No 401 errors
└─ All requests working
4. Remove Old Secret:
├─ Old automatically stops working
├─ After brief dual-use period
├─ No action needed
└─ Can't revert to old
Audit Logging:
Log These Events:
├─ OAuth client created
├─ Secret regenerated
├─ Scopes added/removed
├─ Roles assigned/removed
├─ Client deleted
├─ Access failures
└─ Unusual activity
What to Log:
├─ Timestamp
├─ Admin user
├─ Action taken
├─ Client affected
├─ Result (success/failure)
└─ NOT the secret itself
Monitoring:
Monitor For:
├─ Unexpected client creation
├─ Secret rotation outside schedule
├─ Failed authentication attempts
├─ Unusual scope usage
├─ Access pattern changes
├─ Clients not used regularly
└─ Suspicious activity
Permissions:
Who Can Create Clients?
├─ Admin users with "oauth:client:add" permission
├─ Typically: Super Admin, OAuth Admin role
└─ Verify in your organization
Who Can View Clients?
├─ Admin users
├─ Users with "oauth:client:view" permission
└─ Consider minimizing access
Who Can Delete Clients?
├─ Admin users
├─ OAuth Admin role
└─ Approval process recommended
Compliance Requirements:
HIPAA:
├─ Requires MFA for admin access
├─ 15-minute idle timeout enforced
├─ Audit logging required
└─ Client rotation documented
PCI-DSS:
├─ Secure secret storage required
├─ No hardcoded secrets
├─ Regular rotation required
└─ Access control required
SOC 2:
├─ Audit trails for all changes
├─ Access control enforcement
├─ Change management process
└─ Incident response documented
GDPR:
├─ Data processing log required
├─ Right to access supported via API
├─ Data retention policies
└─ Deletion/export capabilities
OAuth Client Lifecycle
Stages:
1. Creation
├─ Admin creates client
├─ Scopes assigned
├─ Roles assigned (if Client Credentials)
├─ Secret generated
└─ Client ID provided
2. Configuration
├─ Redirect URIs registered (if Auth Code)
├─ Scopes finalized
├─ Token duration set
└─ Roles/divisions confirmed
3. Usage
├─ Applications authenticate with client
├─ Users authorize app (if Code grant)
├─ Tokens issued and used
├─ API calls made
└─ Regular operations
4. Monitoring
├─ Track usage patterns
├─ Monitor authentication success
├─ Alert on anomalies
├─ Quarterly scope review
└─ Annual security audit
5. Maintenance
├─ Rotate secrets monthly
├─ Update scopes as needed
├─ Verify still in use
├─ Remove unused clients
└─ Document changes
6. Deactivation
├─ Determine if still needed
├─ Plan removal
├─ Notify application owners
├─ Provide replacement if needed
└─ Allow migration period
7. Deletion
├─ Remove old client
├─ Tokens immediately invalid
├─ Applications get 401 errors
├─ Audit log records deletion
└─ Cannot be recovered
Timeline:
Creation → Configuration → Usage → Monitoring → Maintenance → Deactivation → Deletion
0 days 1 day Day 1+ Day 30+ Day 30+ Day 365+ Day 380+
Common OAuth Client Configurations
Configuration 1: Web Application (Node.js + React)
Grant Type: Authorization Code
Redirect URIs:
├─ https://yourapp.com/callback
├─ https://yourapp.com/auth
└─ http://localhost:3000/callback (dev)
Scopes:
├─ conversations:readonly
├─ users:readonly
└─ presence:manage
Token Duration: 3600 (1 hour)
Use Case:
├─ User logs in via browser
├─ Backend handles token exchange
├─ Backend stores refresh token
└─ User can revoke access anytime
Configuration 2: Service Integration (Salesforce Sync)
Grant Type: Client Credentials
Roles:
├─ External Contact Manager
└─ Scheduler (if needed)
Divisions: Home Division
Scopes:
├─ externalcontacts:manage
├─ users:readonly
└─ scheduling:readonly
Token Duration: 86400 (1 day)
Use Case:
├─ Automated sync service
├─ No user interaction
├─ Runs on schedule
└─ Application acts as itself
Configuration 3: Mobile App with Backend
Grant Type: Authorization Code + PKCE
Redirect URIs:
├─ myapp://oauth/callback
├─ https://myapp.com/callback
└─ http://localhost:3000/callback (dev)
Scopes:
├─ conversations:readonly
├─ conversations:call:control
├─ users:readonly
└─ presence:manage
Token Duration: 3600 (1 hour)
Use Case:
├─ Mobile app user login
├─ PKCE for public client security
├─ Backend stores refresh token
└─ App cannot store client_secret
Configuration 4: Single-Page Application (SPA)
Grant Type: Authorization Code + PKCE
Redirect URIs:
├─ https://yourapp.com/
├─ https://yourapp.com/callback
└─ http://localhost:3000/ (dev)
Scopes:
├─ conversations:readonly
├─ users:readonly
└─ presence:manage
Token Duration: 3600 (1 hour)
Use Case:
├─ JavaScript SPA
├─ No backend (serverless)
├─ PKCE prevents code interception
├─ Tokens stored in memory only
Configuration 5: Bot/Virtual Agent
Grant Type: Client Credentials
Roles:
├─ Agent
└─ Virtual Agent (if available)
Divisions: Home Division
Scopes:
├─ conversations:readonly
├─ conversations:external:contact:add
├─ knowledge:readonly
└─ users:readonly
Token Duration: 86400 (1 day)
Use Case:
├─ Chatbot integration
├─ No user context
├─ Reads knowledge base
└─ Fully automated
Configuration 6: Admin Tool/Dashboard
Grant Type: Authorization Code
Redirect URIs:
├─ https://admin.yourcompany.com/callback
└─ http://localhost:8080/callback (dev)
Scopes:
├─ users:manage
├─ roles:manage
├─ oauth:client:manage
└─ admin:org:manage
Token Duration: 3600 (1 hour)
Use Case:
├─ Admin portal
├─ Full management capabilities
├─ User authentication
└─ Administrative access control
Troubleshooting OAuth Clients
Problem: Client Creation Fails
Check:
├─ Permission: Do you have oauth:client:add?
├─ Roles: Do you have the roles you're assigning?
├─ Scopes: Are scope names spelled correctly?
└─ Divisions: Do divisions exist?
Solution:
├─ Request oauth:client:add permission
├─ Use roles you have assigned
├─ Check scope names in API Explorer
└─ Use existing divisions
Problem: Client Secret Lost/Forgotten
Cannot Retrieve:
├─ Old secret: Cannot view (security feature)
├─ No recovery method
├─ No admin override
└─ Design for security
Solution:
├─ Generate new secret
├─ Update application
├─ Delete old client if not needed
└─ Document in future
Steps:
1. Click "Generate new secret"
2. Copy new secret
3. Update application config
4. Test authentication
5. Verify working
Problem: 401 Unauthorized on API Calls
Possible Causes:
├─ Token expired: Get fresh token
├─ Token revoked: Authenticate again
├─ Client credentials wrong: Check spelling
├─ Client no longer exists: Recreate
└─ Secret wrong: Regenerate
Troubleshooting:
1. Check token hasn't expired
2. Try authenticating again (fresh token)
3. Verify client_id and client_secret spelling
4. Check client exists in Admin UI
5. If regenerated secret, update application
6. Monitor logs for pattern
Problem: Scopes Not Working
User Still Can't Access API:
Causes:
├─ Wrong scope name
├─ User missing permission
├─ Token doesn't have scope
├─ Both scope and permission needed
└─ Other 403 reason
Check:
1. API Explorer: What scope required?
2. Token: Does it have that scope?
3. User: Does user have role permission?
4. Both: Scope AND permission needed
5. 403 error: One or both missing
Problem: Application Not Working After Update
Something Changed:
Check:
├─ Secret regenerated? Update app config
├─ Scopes changed? Users must re-authorize
├─ Roles changed? Token might lack permission
├─ Token duration changed? Should still work
└─ Redirect URI changed? Registration needed
Fix:
├─ If secret: Update app immediately
├─ If scopes: Get new token (user re-auth)
├─ If roles: Assign correct roles
└─ If URI: Re-register in Admin UI
Best Practices: OAuth Client Management
Security:
□ Store secrets in secure vault
□ Rotate monthly minimum
□ Never commit to git
□ Use environment variables
□ Encrypt at rest and in transit
□ Audit all changes
□ Monitor for anomalies
□ Principle of least privilege
Operations:
□ Document each client's purpose
□ Keep contact info for app owner
□ Review quarterly
□ Remove unused clients
□ Plan secret rotation schedule
□ Test after any changes
□ Verify working regularly
□ Monitor token usage
Compliance:
□ Meet HIPAA requirements
□ Meet PCI-DSS requirements
□ Meet SOC 2 requirements
□ Document compliance steps
□ Keep audit logs
□ Review permissions quarterly
□ Maintain change log
□ Plan for incidents
Key Takeaways: Chapter 6
- Admin-Only Access - Only admins can create OAuth clients
- Secret View-Once - Client secret only shown at creation (March 2026 change)
- Secure Storage Required - Use vault, not code/git/environment
- Monthly Rotation - Standard practice for secret updates
- Dual Grant Types - Can select multiple grant types per client
- Role & Scope - Both required for Client Credentials
- Redirect URIs - Must be exact match (case-sensitive)
- Audit Everything - Log client creation, secret rotation, deletions
Interview Prep: OAuth Client Management
| Question | Answer |
|---|---|
| Where create OAuth client? | Admin → Integrations → OAuth → Add client |
| Who can create? | Users with oauth:client:add permission |
| Client secret visibility? | Only shown once at creation (March 2026 change) |
| If secret lost? | Generate new secret, update application |
| Secret storage? | Secure vault (HashiCorp, AWS, Azure) |
| Secret rotation? | Monthly minimum, before departures, after exposure |
| Redirect URIs? | Up to 125, must be HTTPS, exact match required |
| Scopes required? | Yes, principle of least privilege |
| Token duration? | Default 1 hour, configurable 300-172,800 seconds |
| Client deletion? | Immediate, tokens invalid, can't recover |
Document Version
Chapter: 6 of 8
Last Updated: March 2026
Status: Current with OAuth 2.0 standards
Scope: Client creation, management, security