jeremylongshore/claude-code-plugins-plus-skills
juicebox-pack
plugins/saas-packs/juicebox-pack/skills/juicebox-security-basics/SKILL.md
January 22, 2026
Select agents to install to:
npx add-skill https://github.com/jeremylongshore/claude-code-plugins-plus-skills/blob/main/plugins/saas-packs/juicebox-pack/skills/juicebox-security-basics/SKILL.md -a claude-code --skill juicebox-security-basicsInstallation paths:
.claude/skills/juicebox-security-basics/# Juicebox Security Basics
## Overview
Implement security best practices for Juicebox API integration.
## Prerequisites
- Juicebox API access configured
- Environment variable management
- Basic security awareness
## Instructions
### Step 1: Secure API Key Storage
**NEVER do this:**
```typescript
// BAD - hardcoded API key
const client = new JuiceboxClient({
apiKey: 'jb_prod_xxxxxxxxxxxxxxxxx'
});
```
**DO this instead:**
```typescript
// GOOD - environment variable
const client = new JuiceboxClient({
apiKey: process.env.JUICEBOX_API_KEY
});
```
**For production, use secret managers:**
```typescript
// AWS Secrets Manager
import { SecretsManager } from '@aws-sdk/client-secrets-manager';
async function getApiKey(): Promise<string> {
const client = new SecretsManager({ region: 'us-east-1' });
const secret = await client.getSecretValue({
SecretId: 'juicebox/api-key'
});
return JSON.parse(secret.SecretString!).apiKey;
}
// Google Secret Manager
import { SecretManagerServiceClient } from '@google-cloud/secret-manager';
async function getApiKey(): Promise<string> {
const client = new SecretManagerServiceClient();
const [version] = await client.accessSecretVersion({
name: 'projects/my-project/secrets/juicebox-api-key/versions/latest'
});
return version.payload!.data!.toString();
}
```
### Step 2: Implement Access Controls
```typescript
// middleware/juicebox-auth.ts
export function requireJuiceboxAccess(requiredScope: string) {
return async (req: Request, res: Response, next: NextFunction) => {
const user = req.user;
if (!user) {
return res.status(401).json({ error: 'Authentication required' });
}
const hasScope = user.permissions.includes(`juicebox:${requiredScope}`);
if (!hasScope) {
return res.status(403).json({ error: 'Insufficient permissions' });
}
next();
};
}
// Usage
app.get('/api/search',
requireJuiceboxAccess('search:read'),
async (req, res) => {
// ... search logic