К основному содержанию
скилл CX Codex

encore-auth — скилл для Claude Code: что делает и как установить

Настраивает аутентификацию в Encore.ts, защищает эндпоинты через authHandler и Gateway, а также передаёт данные пользователя между сервисами.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add encoredev/skills --skill encore-auth -a claude-code
npx skills add encoredev/skills --skill auth -a claude-code
Открыть на GitHub

Что делает encore-auth

Скилл учит агента внедрять проверку подлинности в бекенд на Encore.ts. Он генерирует типизированный authHandler<AuthParams, AuthData>, регистрирует его внутри Gateway и закрывает маршруты флагом auth: true. Для извлечения профиля вызывающего пользователя внутри логики используется функция getAuthData() из ~encore/auth.

Внутрь заложены паттерны верификации JWT с помощью библиотеки jose, проверка API-ключей через SQL-запросы к базе и чтение сессий из cookie. Ошибки авторизации возвращают статус 401. При вызове соседних сервисов через ~encore/clients контекст AuthData пробрасывается автоматически.

Без привязки authHandler к Gateway механизм авторизации работать не будет. Для юнит-тестов в Vitest скилл показывает, как перехватывать вызовы getAuthData через vi.spyOn или передавать явный authData в клиенты сервисов.

Какие задачи решает

  • ограничить доступ к эндпоинтам Encore.ts через флаг auth: true
  • настроить валидацию JWT-токенов или API-ключей в authHandler
  • получать данные авторизованного пользователя через getAuthData
  • передавать контекст сессии между внутренними микросервисами
  • изолировать проверку прав в тестах с Vitest

Примеры запросов агенту

  • Сделай этот эндпоинт доступным только авторизованным пользователям через auth: true
  • Настрой authHandler для валидации Bearer JWT с проверкой через jose
  • Напиши тест на Vitest для защищённого эндпоинта с подменой getAuthData

Как установить encore-auth

1Через Skills CLI (Vercel)

npx skills add encoredev/skills --skill encore-auth -a claude-code
npx skills add encoredev/skills --skill auth -a claude-code

2Вручную: положить файлы

~/.claude/skills/auth/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/auth/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о encore-auth

Как установить encore-auth в Claude Code?

Выполните команду npx skills add encoredev/skills --skill encore-auth -a claude-code.

Что делает скилл encore-auth?

Он объясняет агенту правила работы со встроенной системой аутентификации Encore.ts: создание authHandler, регистрацию в Gateway и чтение getAuthData.

Как authHandler передаёт данные между сервисами?

Объект AuthData автоматически прокидывается при внутренних вызовах через ~encore/clients. Также его можно явно переопределить параметром authData.

Исходный текст

SKILL.md · Apache-2.0
---
name: encore-auth
description: >-
  Protect Encore.ts endpoints with authentication and authorize callers. Covers `authHandler`, `Gateway`, `getAuthData`, and `auth: true`.
when_to_use: >-
  User wants to require login on an endpoint, restrict an endpoint to authenticated/signed-in users, validate a bearer token / JWT / API key from an Authorization header, read the current user inside a handler (`getAuthData`), set up an `authHandler<AuthParams, AuthData>` or `Gateway`, return 401/403 from a handler, or set `auth: true` on `api(...)`. Trigger phrases: "protect this endpoint", "only authenticated users", "require login", "Authorization header", "bearer token", "401", "403", "who is calling", "current user".
---

# Encore Authentication

## Instructions

Encore.ts provides a built-in authentication system for identifying API callers and protecting endpoints.

### 1. Create an Auth Handler

```typescript
// auth.ts
import { Header, Gateway } from "encore.dev/api";
import { authHandler } from "encore.dev/auth";

// Define what the auth handler receives
interface AuthParams {
  authorization: Header<"Authorization">;
}

// Define what authenticated requests will have access to
interface AuthData {
  userID: string;
  email: string;
  role: "admin" | "user";
}

export const auth = authHandler<AuthParams, AuthData>(
  async (params) => {
    // Validate the token (example with JWT)
    const token = params.authorization.replace("Bearer ", "");
    
    const payload = await verifyToken(token);
    if (!payload) {
      throw APIError.unauthenticated("invalid token");
    }
    
    return {
      userID: payload.sub,
      email: payload.email,
      role: payload.role,
    };
  }
);

// Register the auth handler with a Gateway
export const gateway = new Gateway({
  authHandler: auth,
});
```

### 2. Protect Endpoints

```typescript
import { api } from "encore.dev/api";

// Protected endpoint - requires authentication
export const getProfile = api(
  { method: "GET", path: "/profile", expose: true, auth: true },
  async (): Promise<Profile> => {
    // Only authenticated users reach here
  }
);

// Public endpoint - no authentication required
export const healthCheck = api(
  { method: "GET", path: "/health", expose: true },
  async () => ({ status: "ok" })
);
```

### 3. Access Auth Data in Endpoints

```typescript
import { api } from "encore.dev/api";
import { getAuthData } from "~encore/auth";

export const getProfile = api(
  { method: "GET", path: "/profile", expose: true, auth: true },
  async (): Promise<Profile> => {
    const auth = getAuthData()!;  // Non-null when auth: true
    
    return {
      userID: auth.userID,
      email: auth.email,
      role: auth.role,
    };
  }
);
```

## Auth Handler Behavior

| Scenario | Handler Returns | Result |
|----------|----------------|--------|
| Valid credentials | `AuthData` object | Request authenticated |
| Invalid credentials | Throws `APIError.unauthenticated()` | Treated as no auth |
| Other error | Throws other error | Request aborted |

## Auth with Endpoints

| Endpoint Config | Request Has Auth | Result |
|-----------------|------------------|--------|
| `auth: true` | Yes | Proceeds with auth data |
| `auth: true` | No | 401 Unauthenticated |
| `auth: false` or omitted | Yes | Proceeds (auth data available) |
| `auth: false` or omitted | No | Proceeds (no auth data) |

## Service-to-Service Auth Propagation

Auth data automatically propagates to internal service calls:

```typescript
import { user } from "~encore/clients";
import { getAuthData } from "~encore/auth";

export const getOrderWithUser = api(
  { method: "GET", path: "/orders/:id", expose: true, auth: true },
  async ({ id }): Promise<OrderWithUser> => {
    const auth = getAuthData()!;

    // Auth is automatically propagated to this call
    const orderUser = await user.getProfile();

    return { order: await getOrder(id), user: orderUser };
  }
);
```

### Overriding Auth Data

You can explicitly override auth data when making service-to-service calls:

```typescript
import { user } from "~encore/clients";

// Override auth data for this specific call
const adminUser = await user.getProfile(
  {},
  { authData: { userID: "admin-123", email: "[email protected]", role: "admin" } }
);
```

## Common Auth Patterns

### JWT Token Validation

```typescript
import { jwtVerify } from "jose";
import { secret } from "encore.dev/config";

const jwtSecret = secret("JWTSecret");

async function verifyToken(token: string): Promise<JWTPayload | null> {
  try {
    const { payload } = await jwtVerify(
      token,
      new TextEncoder().encode(jwtSecret())
    );
    return payload;
  } catch {
    return null;
  }
}
```

### API Key Authentication

```typescript
export const auth = authHandler<AuthParams, AuthData>(
  async (params) => {
    const apiKey = params.authorization;
    
    const user = await db.queryRow<User>`
      SELECT id, email, role FROM users WHERE api_key = ${apiKey}
    `;
    
    if (!user) {
      throw APIError.unauthenticated("invalid API key");
    }
    
    return {
      userID: user.id,
      email: user.email,
      role: user.role,
    };
  }
);
```

### Cookie-Based Auth

```typescript
interface AuthParams {
  cookie: Header<"Cookie">;
}

export const auth = authHandler<AuthParams, AuthData>(
  async (params) => {
    const sessionId = parseCookie(params.cookie, "session");
    
    if (!sessionId) {
      throw APIError.unauthenticated("no session");
    }
    
    const session = await getSession(sessionId);
    if (!session || session.expiresAt < new Date()) {
      throw APIError.unauthenticated("session expired");
    }
    
    return {
      userID: session.userID,
      email: session.email,
      role: session.role,
    };
  }
);
```

## Testing with Auth

Mock authentication in tests using Vitest:

```typescript
import { describe, it, expect, vi } from "vitest";
import * as auth from "~encore/auth";
import { getProfile } from "./api";

describe("authenticated endpoints", () => {
  it("returns profile for authenticated user", async () => {
    // Mock getAuthData to return test user
    const spy = vi.spyOn(auth, "getAuthData");
    spy.mockImplementation(() => ({
      userID: "test-user-123",
      email: "[email protected]",
      role: "user",
    }));

    const profile = await getProfile();
    expect(profile.email).toBe("[email protected]");

    spy.mockRestore();
  });
});
```

The mock does not reach calls made through `~encore/clients`. To call an `auth: true` endpoint on another service from a test, pass `{ authData: ... }` as the second argument (see "Overriding Auth Data" above).

## Guidelines

- Auth handlers must be registered with a Gateway
- Use `getAuthData()` from `~encore/auth` to access auth data
- `getAuthData()` returns `null` in unauthenticated requests
- Auth data propagates automatically in service-to-service calls
- Throw `APIError.unauthenticated()` for invalid credentials
- Keep auth handlers fast - they run on every authenticated request

© encoredev · Apache-2.0 · encoredev/skills

Похожие скиллы

Все скиллы по теме «Бэкенд и API» →
mcp-builder официальный anthropics Скилл проводит через создание MCP-сервера на TypeScript или Python: от изучения протокола до тестов и оценки качества. 130 949установок claude-api официальный anthropics Справочник по Anthropic SDK и API Claude для генерации кода без устаревших параметров и выдуманных методов. 74 198установок lark-im larksuite Скилл подключает Lark IM к агенту: он отправляет сообщения, ищет историю, управляет чатами и файлами. Подойдёт для задач вокруг командных коммуникаций. CX Codex +1 472 900установок lark-event larksuite Слушает события Lark/Feishu и отдаёт их потоком NDJSON. Подходит для ботов, обработчиков сообщений и долгих подписчиков. CX Codex +1 466 800установок caveman-discover JuliusBrussee Находит точки вызова LLM в репозитории и размечает их воркфлоу для Caveman Cloud, чтобы расходы на токены не сливались в одну общую кучу. CX Codex +1 104 400установок migration JuliusBrussee Скилл задаёт правила безопасных миграций схем, данных и API с обязательным откатом. Пригодится при изменениях, где нельзя терять данные или ломать совместимость. CX Codex +1 103 900установок

Из того же набора25

encore-api Помогает агенту писать эндпоинты Encore.ts через api(...): типы запроса и ответа, параметры пути, валидация, ошибки. CX Codex +1 828установок encore-service Помогает настроить сервисы и каталоги в проектах на Encore.ts. Пригодится при создании микросервисов и организации вызовов через ~encore/clients. CX Codex +1 819установок encore-code-review Скилл проверяет код на Encore.ts перед мержем: инфраструктура внутри функций, require() вместо импортов, сырые Error вместо APIError. CX Codex +1 819установок encore-database Скилл учит агента работать с PostgreSQL в приложениях на Encore.ts. Он помогает составлять типобезопасные SQL-запросы и писать миграции схемы. CX Codex +1 799установок encore-testing Помогает писать и запускать автотесты для Encore.ts через encore test и vitest или jest. Пригодится, когда нужно покрыть эндпоинт или сервис и не возиться с изолированными базами вручную. CX Codex +1 791установок encore-frontend Скилл связывает фронтенд на React, Next.js, Vue или Svelte с бэкендом Encore.ts: генерация типизированного клиента, CORS и токены авторизации. CX Codex +1 763установок encore-migrate Пошагово переносит бэкенд на Encore.ts или Encore Go. Создаёт план в migration-plan.md, инвентаризирует эндпоинты, базы и очереди, разделяя серверную логику и фронтенд. CX Codex +1 725установок encore-go-auth Скилл помогает защищать Go-эндпоинты Encore и проверять, кто выполняет запрос. Пригодится для JWT, API-ключей и сессионных cookie. CX Codex +1 557установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой