evernote-security-basics
Security guidelines for storing API credentials and implementing secure OAuth flows with Evernote.
Install
mkdir -p .claude/skills/evernote-security-basics && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/8061" && unzip -o skill.zip -d .claude/skills/evernote-security-basics && rm skill.zipInstalls to .claude/skills/evernote-security-basics
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Implement security best practices for Evernote integrations.Key capabilities
- →Manage credentials via environment variables or secrets managers
- →Implement CSRF-protected OAuth 1.0a flows
- →Encrypt access tokens at rest using AES-256-GCM
- →Sanitize user input for ENML content
- →Redact sensitive information from logs
How it works
The skill enforces security by requiring environment-based credential storage, token encryption, and input sanitization to prevent common vulnerabilities.
Inputs & outputs
When to use evernote-security-basics
- →Secure OAuth implementation
- →Manage API credentials
- →Hardening integrations
About this skill
Evernote Security Basics
Overview
Security best practices for Evernote API integrations, covering credential management, OAuth hardening, token storage, data protection, and secure logging patterns.
Prerequisites
- Evernote SDK setup
- Understanding of OAuth 1.0a
- Basic cryptography concepts (AES encryption, hashing)
Instructions
Step 1: Credential Management
Store consumerKey, consumerSecret, and access tokens in environment variables or a secrets manager (AWS Secrets Manager, GCP Secret Manager, HashiCorp Vault). Never commit credentials to source control. Add .env to .gitignore.
// Load from environment, fail fast if missing
const requiredVars = ['EVERNOTE_CONSUMER_KEY', 'EVERNOTE_CONSUMER_SECRET'];
for (const v of requiredVars) {
if (!process.env[v]) throw new Error(`Missing required env var: ${v}`);
}
Step 2: Secure OAuth Flow
Add CSRF protection with a state parameter stored in the session. Validate the callback URL matches your registered domain. Use HTTPS-only for all OAuth endpoints. Set secure cookie flags for session tokens.
// Generate CSRF token for OAuth state
const csrfToken = crypto.randomBytes(32).toString('hex');
req.session.oauthCsrf = csrfToken;
// Verify on callback
if (req.query.state !== req.session.oauthCsrf) {
return res.status(403).send('CSRF validation failed');
}
Step 3: Encrypted Token Storage
Encrypt access tokens at rest using AES-256-GCM before storing in your database. Decrypt only when making API calls. Store the encryption key separately from the database.
Step 4: Input Validation
Sanitize all user input before embedding in ENML. Validate note titles (max 255 chars), tag names (max 100 chars, no commas), and notebook names (max 100 chars). Strip forbidden HTML elements and attributes.
Step 5: Secure Logging
Redact access tokens, consumer secrets, and user email addresses from log output. Log only the first 8 characters of tokens for debugging correlation.
function redactToken(token) {
if (!token || token.length < 12) return '***';
return token.slice(0, 8) + '...[REDACTED]';
}
Step 6: Token Lifecycle Management
Track token expiration (edam_expires), implement proactive refresh before expiry, and handle AUTH_EXPIRED errors gracefully. Tokens default to 1-year validity but users can set shorter durations.
For the complete security implementation including encrypted storage, CSRF-protected OAuth, input validation, and audit logging, see Implementation Guide.
Output
- Environment-based credential management with validation
- CSRF-protected OAuth 1.0a flow
- AES-256-GCM encrypted token storage
- Input sanitization for ENML content and metadata
- Redacted logging utility
- Token expiration tracking and refresh
Error Handling
| Error | Cause | Solution |
|---|---|---|
INVALID_AUTH | Token revoked or invalid | Re-authenticate via OAuth; check token not corrupted during encryption |
AUTH_EXPIRED | Token past expiration date | Implement proactive refresh before edam_expires |
PERMISSION_DENIED | API key lacks required scope | Request appropriate permissions from Evernote |
| CSRF mismatch | Session expired or attack attempt | Regenerate CSRF token and restart OAuth flow |
Resources
Next Steps
For production deployment checklist, see evernote-prod-checklist.
Examples
Secure credential setup: Store credentials in AWS Secrets Manager, load at startup, validate all required values are present, and fail fast on missing configuration.
Token rotation: Monitor edam_expires for all stored tokens, send re-authentication emails 30 days before expiry, and gracefully degrade to read-only mode when tokens expire.
When not to use it
- →When committing credentials to source control
Prerequisites
Limitations
- →Requires proactive token refresh before edam_expires
How it compares
It provides a hardened security layer for Evernote integrations compared to standard SDK usage.
Compared to similar skills
evernote-security-basics side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| evernote-security-basics (this skill) | 0 | 27d | Review | Advanced |
| auth-patterns | 7 | 7mo | Review | Intermediate |
| clerk-incident-runbook | 1 | 27d | Caution | Intermediate |
| customerio-security-basics | 1 | 27d | Review | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by jeremylongshore
View all by jeremylongshore →You might also like
auth-patterns
davepoon
This skill should be used when the user asks about "authentication in Next.js", "NextAuth", "Auth.js", "middleware auth", "protected routes", "session management", "JWT", "login flow", or needs guidance on implementing authentication and authorization in Next.js applications.
clerk-incident-runbook
jeremylongshore
Incident response procedures for Clerk authentication issues. Use when handling auth outages, security incidents, or production authentication problems. Trigger with phrases like "clerk incident", "clerk outage", "clerk down", "auth not working", "clerk emergency".
customerio-security-basics
jeremylongshore
Apply Customer.io security best practices. Use when implementing secure integrations, handling PII, or setting up proper access controls. Trigger with phrases like "customer.io security", "customer.io pii", "secure customer.io", "customer.io gdpr".
gamma-enterprise-rbac
jeremylongshore
Implement enterprise role-based access control for Gamma integrations. Use when configuring team permissions, multi-tenant access, or enterprise authorization patterns. Trigger with phrases like "gamma RBAC", "gamma permissions", "gamma access control", "gamma enterprise", "gamma roles".
jwt-auth
dadbodgeoff
Implement secure JWT authentication with refresh token rotation, secure storage, and automatic renewal. Use when building authentication for SPAs, mobile apps, or APIs that need stateless auth with refresh capabilities.
maintainx-security-basics
jeremylongshore
Configure MaintainX API security, credential management, and access control. Use when securing API keys, implementing access controls, or hardening your MaintainX integration. Trigger with phrases like "maintainx security", "maintainx api key security", "secure maintainx", "maintainx credentials", "maintainx access control".