关于 oauth-implementation
oauth-implementation 是介绍 OAuth 2.0 与 OpenID Connect 身份验证实现的技能,适合开发需要安全登录和令牌管理的应用。内容涵盖常见授权流程、PKCE、安全要求及多语言框架参考实现。
主要功能
- 01覆盖 OAuth 2.0 常见授权流程
- 02说明面向公共客户端的 PKCE
- 03提供 Express 授权码流程示例
- 04列出令牌与重定向安全要求
- 05附 Python、Java 实现参考
适用场景
- 01为 Web 应用实现授权码登录
- 02为 SPA 或移动应用配置 PKCE
- 03实现服务间客户端凭据认证
- 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 应用(最安全) |
| 授权码 + PKCE | SPA、移动应用 |
| 客户端凭据 | 服务间通信 |
| 刷新令牌 | 会话续期 |
授权码流程(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