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

next-auth获取Discord access_token、refresh_token及profile的方法

NextAuth获取Discord认证Token与用户信息实现方案

配置回调拦截并打印信息

你只需要在原有NextAuth配置中新增callbacks字段,即可在认证流程中拿到并打印access_token、refresh_token和用户profile,同时可以将需要的字段持久化到session中供业务侧调用,修改后的完整配置如下:

import NextAuth from 'next-auth/next';
import DiscordProvider from 'next-auth/providers/discord';

export default NextAuth({
    providers: [
        DiscordProvider({
            clientId: process.env.DISCORD_CLIENT_ID,
            clientSecret: process.env.DISCORD_CLIENT_SECRET,
            authorization: {
                params: {
                    scope: 'identify email guilds applications.commands.permissions.update'
                }
            },
            token: "https://discord.com/api/oauth2/token",
            userinfo: "https://discord.com/api/users/@me", 
        }),
    ],
    callbacks: {
        // JWT回调在token生成、刷新时触发
        async jwt({ token, account, profile }) {
            // 仅首次登录时account、profile参数会携带Discord返回的原始数据
            if (account) {
                // 控制台打印需要的信息
                console.log('access_token:', account.access_token);
                console.log('refresh_token:', account.refresh_token);
                console.log('Discord用户原始profile:', profile);
                // 将需要的字段挂载到jwt对象上,供后续session透传
                token.accessToken = account.access_token;
                token.refreshToken = account.refresh_token;
                token.discordProfile = profile;
            }
            return token;
        },
        // session回调在客户端/服务端读取session时触发
        async session({ session, token }) {
            // 将jwt上挂载的字段透传到session对象
            session.accessToken = token.accessToken;
            session.refreshToken = token.refreshToken;
            session.user.discordProfile = token.discordProfile;
            return session;
        }
    }
})

配置完成后,用户首次走Discord登录流程时,服务端控制台就会直接打印出你需要的三类信息。

业务侧读取已存储的信息

配置完成后,你可以在不同场景下直接从session中读取对应字段:

  • 服务端场景(服务端组件、Route Handler、服务端接口):使用getServerSession方法读取
import { getServerSession } from "next-auth/next";
// 替换为你项目中NextAuth配置文件的实际导入路径
import authOptions from "@/app/api/auth/[...nextauth]/route";

export async function getAuthInfo() {
  const session = await getServerSession(authOptions);
  // 直接读取字段即可
  const accessToken = session?.accessToken;
  const refreshToken = session?.refreshToken;
  const userProfile = session?.user?.discordProfile;
  return { accessToken, refreshToken, userProfile };
}
  • 客户端场景(添加了'use client'标记的客户端组件):使用useSession钩子读取
'use client'
import { useSession } from "next-auth/react";

export default function AuthInfo() {
  const { data: session } = useSession();
  return (
    <div>
      <p>Access Token: {session?.accessToken}</p>
      <p>Discord用户名: {session?.user?.discordProfile?.username}</p>
    </div>
  )
}

安全提示:access_token、refresh_token属于敏感凭证,生产环境不建议透传到客户端暴露,这类字段建议仅在服务端逻辑中调用,避免泄露导致账号安全风险。

内容的提问来源于stack exchange,提问作者Aditya Kirad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:51:23