用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/ForceInjection/domain-driven-design-skills --skill authentication-authorization命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | authentication-authorization |
| description | ログイン、セッション、JWT、OAuth、アクセス制御を実装する際に使用。 |
認証(誰か) ≠ 認可(何ができるか)。両方必要。
// ⚠️ 署名アルゴリズムはHS256以上
const token = jwt.sign({ userId }, SECRET, {
expiresIn: '15m', // 短め
algorithm: 'HS256'
});
// 検証
const decoded = jwt.verify(token, SECRET);
// ⚠️ セッションIDは十分なエントロピー
app.use(session({
secret: process.env.SESSION_SECRET, // 🚫 ハードコード禁止
resave: false,
saveUninitialized: false,
cookie: {
httpOnly: true, // ⚠️ 必須
secure: true, // ⚠️ 本番では必須
sameSite: 'lax'
}
}));
// ⚠️ すべてのエンドポイントで確認
function authorize(requiredRole: string) {
return (req, res, next) => {
if (!req.user) return res.status(401).json({ error: 'Unauthorized' });
if (req.user.role !== requiredRole) {
return res.status(403).json({ error: 'Forbidden' });
}
next();
};
}
// リソースオーナー確認
if (resource.ownerId !== req.user.id && !req.user.isAdmin) {
return res.status(403).json({ error: 'Forbidden' });
}
// ⚠️ bcrypt, saltRounds 12以上
const hash = await bcrypt.hash(password, 12);
const isValid = await bcrypt.compare(password, hash);
// ❌ パスワード平文保存
user.password = password;
// ❌ トークンをURLに含める
/api/data?token=xxx
// ❌ フロントエンドのみで認可
if (user.role === 'admin') { showAdminPanel(); }
// ❌ シークレットのハードコード
const SECRET = 'my-secret-key';
// ❌ httpOnlyなしのセッションCookie
cookie: { httpOnly: false }