clerk-auth-webhook-handler
Version:
A type-safe webhook handler for Clerk webhooks with support for Svix
173 lines (134 loc) โข 4.6 kB
Markdown
[](https://badge.fury.io/js/clerk-auth-webhook-handler)
[](https://opensource.org/licenses/MIT)
[](https://github.com/ellerbrock/typescript-badges/)
A type-safe webhook handler for Express applications specifically designed for Clerk Authentication webhooks. Set up your Clerk webhook handlers in minutes!
- ๐ **Type-safe**: Full TypeScript support with Clerk event types
- ๐ **Express Integration**: Seamless integration with Express applications
- โก **Zero Dependencies**: Lightweight with no external runtime dependencies
- ๐ **Secure**: Built-in support for Clerk webhook signature verification
- ๐ฏ **Event-Based**: Simple event-based architecture for Clerk events
- โ๏ธ **Middleware Ready**: Easy to extend with custom middleware
```bash
npm install clerk-auth-webhook-handler
yarn add clerk-auth-webhook-handler
pnpm add clerk-auth-webhook-handler
```
```typescript
import express from 'express';
import { ClerkWebhookManager } from 'clerk-auth-webhook-handler';
import { UserJSON } from '@clerk/clerk-sdk-node';
const app = express();
// Health check endpoint
app.get('/health', (_, res) => {
res.status(200).json({ status: 'healthy' });
});`
// Initialize webhook handler
const webhookHandler = new ClerkWebhookManager({
path: '/api/clerk-webhooks',
secretKey: process.env.CLERK_WEBHOOK_SECRET,
handlers: {
'user.created': async (event) => {
const user = event.data as UserJSON;
console.log(`New user created: ${user.username} (${user.email_addresses[0].email_address})`);
}
}
});
// Use middleware
app.use(express.json());
app.use(webhookHandler.getRouter());
app.listen(3000, () => {
console.log('๐ Server ready at http://localhost:3000');
});
```
The webhook handler supports all Clerk webhook events including:
- `user.created`
- `user.updated`
- `user.deleted`
<!-- More coming soon -->
The handler automatically verifies Clerk webhook signatures when you provide the secret key:
```typescript
const webhookHandler = new ClerkWebhookManager({
path: '/api/clerk-webhooks',
secretKey: process.env.CLERK_WEBHOOK_SECRET, // Required for security
handlers: {
// Your handlers here
}
});
```
```typescript
import express from 'express';
import { ClerkWebhookManager } from 'clerk-auth-webhook-handler';
import { UserJSON } from '@clerk/clerk-sdk-node';
const app = express();
// Initialize webhook handler
const webhookHandler = new ClerkWebhookManager({
path: '/api/clerk-webhooks',
secretKey: process.env.CLERK_WEBHOOK_SECRET,
handlers: {
'user.created': async (event) => {
// your logic here
// const user = event.data as UserJSON;
// await db.users.create({
// id: user.id,
// email: user.email_addresses[0].email_address,
// name: user.username
// });
},
'user.updated': async (event) => {
// your logic here
// const user = event.data as UserJSON;
// await db.users.update(user.id, {
// email: user.email_addresses[0].email_address,
// name: user.username
// });
},
}
});
app.use(express.json());
app.use(webhookHandler.getRouter());
app.listen(3000, () => {
console.log('๐ Server ready at http://localhost:3000');
});
```
To test your Clerk webhook handlers locally:
```typescript
// test/webhook.test.ts
import request from 'supertest';
import { app } from '../src/app';
describe('Clerk Webhook Handler', () => {
it('should handle user.created event', async () => {
const payload = {
type: 'user.created',
data: {
id: '123',
email_addresses: [{
email_address: 'test@example.com'
}],
username: 'testuser'
}
};
await request(app)
.post('/api/clerk-webhooks')
.send(payload)
.expect(200);
});
});
```
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
If you have any questions or need help integrating the Clerk webhook handler, please open an issue or reach out to the maintainers.
---
Made with โค๏ธ by Abhishek