You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 09:36:22