如何通过Next Auth与Prisma获取登录用户的GitHub用户名及仓库
实现方案
要获取GitHub用户名及仓库信息,你可以通过调整Next Auth配置、扩展Prisma模型以及调用GitHub API来实现,具体步骤如下:
1. 扩展Prisma模型存储GitHub用户名
首先修改你的Prisma Schema,给User模型新增字段用于存储GitHub用户名:
model User { id String @id @default(cuid()) name String? email String? @unique emailVerified DateTime? image String? githubUsername String? // 新增字段:存储GitHub用户名 accounts Account[] sessions Session[] }
修改后运行prisma migrate dev命令,同步数据库结构。
2. 配置Next Auth的GitHub授权权限
在Next Auth的配置文件(pages/api/auth/[...nextauth].js/ts)中,调整GitHub Provider的授权范围,确保能获取用户基本信息及仓库权限:
import NextAuth from "next-auth"; import GitHubProvider from "next-auth/providers/github"; import { PrismaAdapter } from "@next-auth/prisma-adapter"; import { PrismaClient } from "@prisma/client"; const prisma = new PrismaClient(); export default NextAuth({ adapter: PrismaAdapter(prisma), providers: [ GitHubProvider({ clientId: process.env.GITHUB_ID, clientSecret: process.env.GITHUB_SECRET, // 按需调整权限:read:user获取用户信息,repo获取仓库(含私有),public_repo仅获取公开仓库 authorization: { params: { scope: "read:user user:email repo", }, }, }), ], callbacks: { // 登录时将GitHub用户名存入User表 async signIn({ user, account, profile }) { if (account.provider === "github" && profile.login) { await prisma.user.update({ where: { id: user.id }, data: { githubUsername: profile.login }, }); } return true; }, // 将GitHub用户名加入session,方便前端直接获取 async session({ session, user }) { session.user.githubUsername = user.githubUsername; return session; }, }, });
3. 通过Access Token调用GitHub API获取仓库
Next Auth会将GitHub的access_token存储在Account表中,你可以通过该令牌调用GitHub API获取用户仓库:
创建API路由(pages/api/github/repos.js):
import { getServerSession } from "next-auth/next"; import { authOptions } from "../auth/[...nextauth]"; import { PrismaClient } from "@prisma/client"; const prisma = new PrismaClient(); export default async function handler(req, res) { const session = await getServerSession(req, res, authOptions); if (!session) return res.status(401).json({ error: "未授权" }); // 获取当前用户的GitHub账号记录 const githubAccount = await prisma.account.findFirst({ where: { userId: session.user.id, provider: "github" }, }); if (!githubAccount?.access_token) { return res.status(400).json({ error: "无法获取GitHub访问令牌" }); } try { // 调用GitHub API获取仓库列表 const response = await fetch("https://api.github.com/user/repos", { headers: { Authorization: `token ${githubAccount.access_token}` }, }); if (!response.ok) throw new Error("GitHub API请求失败"); const repos = await response.json(); res.status(200).json(repos); } catch (err) { res.status(500).json({ error: err.message }); } }
前端可直接调用该API接口,获取当前登录用户的GitHub仓库数据。
注意事项
- Access Token过期问题:Next Auth会自动利用
refresh_token刷新过期的令牌,无需手动处理; - 权限调整:如果仅需公开仓库,将scope改为
read:user user:email public_repo即可,避免请求不必要的权限; - 数据安全:请勿在前端直接暴露Access Token,所有API调用需通过后端中转。
内容的提问来源于stack exchange,提问作者user18371666
相关产品推荐
相关产品推荐

