Install
$ agentstack add skill-edfenton-claude-skills-nean-add-auth ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ● Environment & secrets Used
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Purpose
Add secure authentication to an existing NEAN project using Passport.js and JWT.
Arguments
--providers— Comma-separated providers (default:local)- Options:
local,google,github,discord --with-refresh-tokens— Enable refresh token rotation (recommended for production)
What gets created
libs/api/auth/
├── src/
│ ├── auth.module.ts # Auth module with guards
│ ├── auth.controller.ts # Login, register, refresh endpoints
│ ├── auth.service.ts # Auth logic
│ ├── strategies/
│ │ ├── jwt.strategy.ts # JWT validation
│ │ ├── jwt-refresh.strategy.ts # Refresh token (if enabled)
│ │ ├── local.strategy.ts # Username/password
│ │ ├── google.strategy.ts # (if selected)
│ │ └── github.strategy.ts # (if selected)
│ ├── guards/
│ │ ├── jwt-auth.guard.ts # Route protection
│ │ ├── local-auth.guard.ts # Login guard
│ │ └── roles.guard.ts # RBAC guard
│ ├── decorators/
│ │ ├── current-user.decorator.ts # Extract user from request
│ │ ├── public.decorator.ts # Mark route as public
│ │ └── roles.decorator.ts # Role requirements
│ └── index.ts
libs/api/database/src/entities/
├── user.entity.ts # User entity
└── refresh-token.entity.ts # (if --with-refresh-tokens)
libs/shared/types/src/
├── auth.dto.ts # Login, register, token DTOs
└── user.dto.ts # User response DTO
apps/web/src/app/auth/
├── auth.routes.ts # Auth routing
├── login/ # Login page
├── register/ # Registration page
├── callback/ # OAuth callback (if OAuth)
└── guards/
└── auth.guard.ts # Angular route guard
libs/web/auth/
├── src/
│ ├── auth.service.ts # Auth API calls
│ ├── auth.interceptor.ts # Attach JWT to requests
│ ├── auth.store.ts # NgRx auth state
│ └── index.ts
.env.example # Updated with auth vars
Environment variables required
# JWT
JWT_SECRET= # Generate with: openssl rand -base64 64
JWT_EXPIRES_IN=15m
JWT_REFRESH_SECRET= # If using refresh tokens
JWT_REFRESH_EXPIRES_IN=7d
# OAuth (per provider)
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOGLE_CALLBACK_URL=http://localhost:3000/api/auth/google/callback
GITHUB_CLIENT_ID=
GITHUB_CLIENT_SECRET=
GITHUB_CALLBACK_URL=http://localhost:3000/api/auth/github/callback
Workflow
- Install dependencies:
@nestjs/passport,passport,passport-jwt,passport-local,bcrypt - Create User entity with password hash
- Create auth module with strategies
- Create guards and decorators
- Create auth controller with endpoints
- Create Angular auth components
- Create Angular auth interceptor and guard
- Update env validation schema
- Run tests to verify
API Endpoints
| Method | Endpoint | Description | Auth | |--------|----------------------|-----------------------|------| | POST | /api/auth/register | Create new account | No | | POST | /api/auth/login | Login with credentials| No | | POST | /api/auth/refresh | Refresh access token | No* | | POST | /api/auth/logout | Invalidate tokens | Yes | | GET | /api/auth/me | Get current user | Yes | | GET | /api/auth/google | Start Google OAuth | No | | GET | /api/auth/google/callback | Google callback | No |
*Refresh endpoint uses refresh token in httpOnly cookie
Protected routes
Apply JwtAuthGuard globally in main.ts or per-controller:
// Global (with @Public() decorator for exceptions)
app.useGlobalGuards(new JwtAuthGuard());
// Per-controller
@UseGuards(JwtAuthGuard)
@Controller('users')
export class UsersController {}
// Per-route
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles('admin')
@Delete(':id')
delete() {}
Usage patterns
NestJS Controller
@Controller('protected')
@UseGuards(JwtAuthGuard)
export class ProtectedController {
@Get('profile')
getProfile(@CurrentUser() user: User) {
return user;
}
}
Angular Component
@Component({...})
export class ProfileComponent {
private authStore = inject(AuthStore);
user = this.authStore.user;
isAuthenticated = this.authStore.isAuthenticated;
}
Angular Route Guard
export const authGuard: CanActivateFn = () => {
const authStore = inject(AuthStore);
const router = inject(Router);
if (authStore.isAuthenticated()) {
return true;
}
return router.createUrlTree(['/auth/login']);
};
Output
Summarize: providers configured, environment variables needed, protected routes, components available.
Reference
For templates and OAuth setup guides, see reference/nean-add-auth-reference.md
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: edfenton
- Source: edfenton/claude-skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.