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
相关产品推荐
相关产品推荐

