mcpField
O
oauth-implementation

oauth-implementation

github.com/secondsky安全240415 次安装5 周前更新
代码仓库

关于 oauth-implementation

oauth-implementation 是介绍 OAuth 2.0 与 OpenID Connect 身份验证实现的技能,适合开发需要安全登录和令牌管理的应用。内容涵盖常见授权流程、PKCE、安全要求及多语言框架参考实现。

主要功能

  1. 01覆盖 OAuth 2.0 常见授权流程
  2. 02说明面向公共客户端的 PKCE
  3. 03提供 Express 授权码流程示例
  4. 04列出令牌与重定向安全要求
  5. 05附 Python、Java 实现参考

适用场景

  1. 01为 Web 应用实现授权码登录
  2. 02为 SPA 或移动应用配置 PKCE
  3. 03实现服务间客户端凭据认证
  4. 04规划令牌轮换与会话续期

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/secondsky/claude-skills --skill oauth-implementation

安装后在 Claude Code 中输入/oauth-implementation确认已加载。

附带文件references/python-java.md

详细介绍

OAuth 实现

实现 OAuth 2.0 和 OpenID Connect,实现安全认证。

OAuth 2.0 流程

流程使用场景
授权码Web 应用(最安全)
授权码 + PKCESPA、移动应用
客户端凭据服务间通信
刷新令牌会话续期

授权码流程(Express)

const express = require('express');
const jwt = require('jsonwebtoken');

// Step 1: Redirect to authorization
app.get('/auth/login', (req, res) => {
  const state = crypto.randomBytes(16).toString('hex');
  req.session.oauthState = state;

  const params = new URLSearchParams({
    client_id: process.env.CLIENT_ID,
    redirect_uri: process.env.REDIRECT_URI,
    response_type: 'code',
    scope: 'openid profile email',
    state
  });

  res.redirect(`${PROVIDER_URL}/authorize?${params}`);
});

// Step 2: Handle callback
app.get('/auth/callback', async (req, res) => {
  if (req.query.state !== req.session.oauthState) {
    return res.status(400).json({ error: 'Invalid state' });
  }

  const tokenResponse = await fetch(`${PROVIDER_URL}/token`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    body: new URLSearchParams({
      grant_type: 'authorization_code',
      code: req.query.code,
      redirect_uri: process.env.REDIRECT_URI,
      client_id: process.env.CLIENT_ID,
      client_secret: process.env.CLIENT_SECRET
    })
  });

  const tokens = await tokenResponse.json();
  // Store tokens securely and create session
});

面向公共客户端的 PKCE

function generatePKCE() {
  const verifier = crypto.randomBytes(32).toString('base64url');
  const challenge = crypto
    .createHash('sha256')
    .update(verifier)
    .digest('base64url');
  return { verifier, challenge };
}

安全要求

  • 始终使用 HTTPS
  • 严格验证重定向 URI
  • 公共客户端使用 PKCE
  • 将令牌存储在 HttpOnly Cookie 中
  • 实现令牌轮换
  • 使用短时访问令牌(15 min)

其他实现

参见 references/python-java.md,了解:

  • 使用 Authlib OIDC 提供方的 Python Flask
  • OpenID Connect 发现和 JWKS 端点
  • Java Spring Security OAuth2 服务端
  • 令牌内省和撤销

切勿执行

  • 将令牌存储在 localStorage 中
  • 使用隐式流程
  • 跳过 state 参数验证
  • 在前端暴露客户端密钥
  • 使用长期有效的访问令牌

评论

支持 Markdown