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

oauth · mcollina — скилл для Claude Code: что делает и как установить

Настраивает авторизацию OAuth 2.0 и 2.1 в приложениях на Fastify с защитой через PKCE и ротацией токенов. Пригодится для проверки JWT, настройки сессий и устранения ошибок redirect URI.

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

Что делает oauth

Скилл описывает внедрение OAuth 2.0 и 2.1 в приложения на Fastify. Внутри собраны шаблоны для Authorization Code Flow с PKCE (S256) и обмена кода на токены через плагин @fastify/oauth2. Охвачены также сценарии Client Credentials и мобильные клиенты по RFC 8252.

Для проверки входящих JWT скилл подключает хук onRequest через библиотеку @fastify/jwt. Код сверяет клеймы exp, iss, aud и sub при каждом запросе. Скилл запрещает хранить токены в localStorage и требует использовать сессионные куки с флагами HttpOnly, Secure и SameSite=Strict.

Проверка на HS256 для сторонних провайдеров здесь заблокирована: для них нужны ключи RS256 или ES256 с JWKS. Для запуска готового кода в проекте понадобятся пакеты @fastify/oauth2, @fastify/cookie, @fastify/session, fastify-plugin и @fastify/jwt.

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

  • настроить авторизацию Fastify через PKCE и плагин @fastify/oauth2
  • валидировать JWT-токены с проверкой клеймов iss, aud и exp
  • организовать ротацию refresh-токенов по стандарту RFC 6749
  • защитить маршруты API через хук проверки токенов

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

  • Помоги настроить авторизацию Fastify через Authorization Code Flow и PKCE
  • Добавь хук onRequest для валидации JWT и проверки клеймов iss и aud
  • Как реализовать ротацию refresh-токенов в Fastify по RFC 6749?

Как установить oauth

1Через Skills CLI (Vercel)

npx skills add mcollina/skills --skill oauth -a claude-code

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

~/.claude/skills/oauth/SKILL.md

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

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

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

typescript-magician Устраняет ошибки TypeScript, заменяет any на строгие типы и строит типобезопасные дженерики. Помогает навести порядок в типах кодовой базы. CX Codex +1 2 800установок nodejs-core Скилл для правок и отладки ядра Node.js: коммиты и PR в nodejs/node, нативные краши, V8, node-gyp, N-API и libuv. CX Codex +1 1 900установок documentation Скилл структурирует техническую документацию по фреймворку Diátaxis. Он помогает писать туториалы, инструкции how-to, справочники и концептуальные статьи без каши в структуре. CX Codex +1 1 800установок octocat Скилл связывает агента с Git и GitHub через gh CLI. Он пригодится для PR, issue, проверок CI, веток и анализа истории репозитория. CX Codex +1 1 300установок init Собирает AGENTS.md из того, что агент не выведет из кода: нестандартные команды, ловушки, локальные договорённости. И выкидывает из файла всё остальное. CX Codex +1 1 300установок skill-optimizer Скилл для тех, кто пишет и правит скиллы: помогает понять, почему модель их не применяет, и не ухудшают ли они вывод. CX Codex +1 1 400установок linting-neostandard-eslint9 Скилл настраивает ESLint 9 с flat config и базой neostandard в проектах на JavaScript и TypeScript. Помогает перейти с устаревшего .eslintrc и запустить проверки в CI. CX Codex +1 1 100установок snipgrapher Генерирует изображения сниппетов кода в форматах PNG, SVG и WebP через утилиту snipgrapher. Пригодится для подготовки иллюстраций в документацию, чейнджлоги и публикации в соцсетях. CX Codex +1 955установок

Другие версии oauth

Похожие

oauth-oidc-misconfiguration yaklang Чек-лист для проверки настроек OAuth 2.0 и OpenID Connect. Помогает находить уязвимости в redirect_uri, валидации state, реализации PKCE и привязке аккаунтов. CX Codex +1 3 700установок jwt-oauth-token-attacks yaklang Скилл для Claude и других ИИ-редакторов: разбор атак на токены JWT и потоки OAuth 2.0. Пригодится, когда нужно проверить, как приложение доверяет токенам и ключам. CX Codex +1 3 800установок integration-connectivity-connected-app-configure forcedotcom Скилл для настройки OAuth в Salesforce: Connected Apps, External Client Apps, JWT bearer и PKCE. Пригодится, когда правите .connectedApp-meta.xml или .eca-meta.xml. CX Codex +1 5 400установок auth0-authentication Mindrally Скилл задаёт агенту правила работы с Auth0: потоки авторизации, Actions, проверка токенов и защита редиректов. CX Codex +1 700установок api-authentication secondsky Скилл для ИИ-агента, который помогает писать аутентификацию в API: JWT, OAuth 2.0, API-ключи, сессии и защитные заголовки. CX Codex +1 533установок zoom-oauth официальный Zoom Скилл для Codex и ChatGPT, который разбирает потоки авторизации Zoom: выбор grant flow, области доступа, ротация refresh-токенов и разбор ошибок. CX Codex GP ChatGPT ★ 7 596звёзд репо

Рядом в теме «Бэкенд и API»

Всё по теме «Бэкенд и API» →

Вопросы о oauth

Как установить oauth в Claude Code?

Выполните в терминале команду npx skills add mcollina/skills --skill oauth -a claude-code.

Что делает скилл oauth?

Он содержит готовые шаблоны и правила для настройки потоков OAuth 2.0/2.1 в Fastify. Скилл помогает внедрить PKCE, верификацию JWT, ротацию refresh-токенов и защиту маршрутов.

Какие зависимости нужны для работы этого скилла в Fastify?

Для воспроизведения примеров понадобятся пакеты @fastify/oauth2, @fastify/cookie, @fastify/session, fastify-plugin и @fastify/jwt.

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

SKILL.md · MIT
---
name: oauth
description: Implements OAuth 2.0/2.1 authorization flows in Fastify applications — configures authorization code with PKCE, client credentials, device flow, refresh token rotation, JWT validation, and token introspection/revocation endpoints. Use when setting up authentication, authorization, login flows, access tokens, API security, or securing Fastify routes with OAuth; also applies when troubleshooting token validation errors, mismatched redirect URIs, CSRF issues, scope problems, or RFC 6749/6750/7636/8252/8628 compliance questions.
metadata:
  tags: oauth, oauth2, security, authentication, authorization, jwt, fastify
---

## When to use

Use this skill when you need to:
- Implement or debug an OAuth 2.0/2.1 flow in a Fastify application
- Validate tokens, configure PKCE, or set up refresh token rotation
- Secure Fastify routes and plugins with access-control middleware
- Resolve RFC compliance questions or identify security anti-patterns

---

## Step-by-step: Authorization Code + PKCE in Fastify

### 1. Install dependencies

```bash
npm install @fastify/oauth2 @fastify/cookie @fastify/session fastify-plugin
```

### 2. Register the OAuth plugin

```typescript
// plugins/oauth.ts
import fp from 'fastify-plugin'
import oauth2, { OAuth2Namespace } from '@fastify/oauth2'
import { FastifyInstance } from 'fastify'

export default fp(async function (fastify: FastifyInstance) {
  fastify.register(oauth2, {
    name: 'oauth2',
    scope: ['openid', 'profile', 'email'],
    credentials: {
      client: {
        id: process.env.CLIENT_ID!,
        secret: process.env.CLIENT_SECRET!,
      },
      auth: {
        authorizeHost: process.env.AUTH_SERVER!,
        authorizePath: '/authorize',
        tokenHost: process.env.AUTH_SERVER!,
        tokenPath: '/token',
      },
    },
    startRedirectPath: '/login',
    callbackUri: process.env.CALLBACK_URI!,
    pkce: 'S256',               // RFC 7636 — always use for public clients
    generateStateFunction: (req) => req.session.state = crypto.randomUUID(),
    checkStateFunction: (req, callback) =>
      req.query.state === req.session.state ? callback() : callback(new Error('State mismatch')),
  })
})
```

**Validation checkpoint:** Confirm `callbackUri` exactly matches a registered redirect URI at the authorization server before proceeding (RFC 6749 §3.1.2).

### 3. Handle the callback and exchange the code

```typescript
// routes/auth.ts
import { FastifyInstance } from 'fastify'

export default async function authRoutes(fastify: FastifyInstance) {
  fastify.get('/login/callback', async (request, reply) => {
    // @fastify/oauth2 verifies state and exchanges code automatically
    const tokenResponse = await fastify.oauth2.getAccessTokenFromAuthorizationCodeFlow(request)

    // Store only what you need; never log the raw token
    request.session.set('accessToken', tokenResponse.token.access_token)
    request.session.set('refreshToken', tokenResponse.token.refresh_token)

    return reply.redirect('/')
  })

  fastify.get('/logout', async (request, reply) => {
    await request.session.destroy()
    return reply.redirect('/')
  })
}
```

### 4. JWT validation middleware (token introspection hook)

```typescript
// hooks/verifyToken.ts
import { FastifyRequest, FastifyReply } from 'fastify'
import jwt from '@fastify/jwt'

export async function verifyToken(request: FastifyRequest, reply: FastifyReply) {
  try {
    await request.jwtVerify()
    // Validate required claims (RFC 7519)
    const payload = request.user as Record<string, unknown>
    const now = Math.floor(Date.now() / 1000)

    if (typeof payload.exp === 'number' && payload.exp < now)
      return reply.code(401).send({ error: 'token_expired' })

    if (payload.iss !== process.env.EXPECTED_ISSUER)
      return reply.code(401).send({ error: 'invalid_issuer' })

    if (payload.aud !== process.env.EXPECTED_AUDIENCE)
      return reply.code(401).send({ error: 'invalid_audience' })

  } catch (err) {
    return reply.code(401).send({ error: 'invalid_token', error_description: (err as Error).message })
  }
}
```

**Validation checkpoints:**
- Verify `exp`, `iss`, `aud`, and `sub` on every request — never skip (RFC 7519 §4)
- Use `fastify.jwt.verify` (asymmetric RS256/ES256) rather than HS256 for tokens issued by a third-party server

### 5. Protecting routes

```typescript
// routes/api.ts
import { FastifyInstance } from 'fastify'
import { verifyToken } from '../hooks/verifyToken'

export default async function apiRoutes(fastify: FastifyInstance) {
  fastify.addHook('onRequest', verifyToken)   // applies to all routes in this scope

  fastify.get('/me', {
    schema: {
      response: { 200: { type: 'object', properties: { sub: { type: 'string' } } } },
    },
  }, async (request) => {
    const user = request.user as { sub: string }
    return { sub: user.sub }
  })
}
```

### 6. Refresh token rotation

```typescript
async function refreshAccessToken(fastify: FastifyInstance, refreshToken: string) {
  const newToken = await fastify.oauth2.getNewAccessTokenUsingRefreshTokenFlow({ refresh_token: refreshToken })

  // Always replace the stored refresh token if rotation is in use (RFC 6749 §10.4)
  return {
    accessToken: newToken.token.access_token,
    refreshToken: newToken.token.refresh_token ?? refreshToken,
  }
}
```

---

## Security checklist

| Requirement | RFC reference |
|---|---|
| Validate redirect URI against allowlist | RFC 6749 §3.1.2 |
| PKCE (S256) for all public clients | RFC 7636 §4.2 |
| Validate `state` to prevent CSRF | RFC 6749 §10.12 |
| Validate `iss`, `aud`, `exp` on every JWT | RFC 7519 §4 |
| Rotate refresh tokens on every use | RFC 6749 §10.4 |
| Use HTTPS everywhere; reject HTTP redirect URIs | RFC 6749 §3.1.2.1 |
| Rate-limit token endpoints | OAuth 2.1 §7 |

---

## Common anti-patterns

- **Storing tokens in localStorage** — use `HttpOnly`, `Secure`, `SameSite=Strict` cookies instead
- **Skipping audience validation** — allows token reuse across services
- **Using implicit flow** — deprecated in OAuth 2.1; use authorization code + PKCE
- **Accepting `response_type=token` in browser apps** — tokens in URL fragments leak in logs/referrers
- **Symmetric signing (HS256) for third-party tokens** — use RS256/ES256 with JWKS endpoint

---

## Further implementation references

- See `DEVICE_FLOW.md` for device authorization flow (RFC 8628) implementation
- See `TOKEN_VALIDATION.md` for JWKS rotation, caching strategies, and opaque token introspection
- See `CLIENT_CREDENTIALS.md` for machine-to-machine service authentication patterns
- See `MOBILE_OAUTH.md` for native/mobile app flows (RFC 8252) and custom URI schemes

© mcollina · MIT · mcollina/skills

Смотрите также

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

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