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

在NextAuth v4 Credentials Provider中如何将原始Token存入Session

解决方案

要把你的API原始Token存入NextAuth的Session中,需要修改authorize回调生成/获取Token,再通过jwt和session回调把Token传递到客户端。以下是具体步骤:

1. 在authorize中生成/获取API Token

在CredentialsProvider的authorize函数里,验证用户身份后,生成或获取你的API所需的原始Token(这里以生成JWT为例):

// 先引入jsonwebtoken(如果需要自己生成Token)
import jwt from 'jsonwebtoken';

// 在CredentialsProvider的authorize函数内,验证通过后添加:
async authorize(credentials, req) {
  // ... 现有数据库连接、用户验证逻辑 ...

  // 验证通过后,生成API Token(替换成你实际的Token生成/获取逻辑)
  const apiToken = jwt.sign(
    { userId: user._id, email: user.email },
    process.env.JWT_API_SECRET, // 用你的API Token密钥,存在环境变量中
    { expiresIn: '24h' } // 和session的maxAge保持一致
  );

  // 返回不含密码的用户信息+API Token
  const { password, ...userWithoutPwd } = user._doc; // Mongoose文档需转成普通对象
  return { ...userWithoutPwd, apiToken };
}

2. 在jwt回调中存储API Token

把API Token存入NextAuth的JWT Token对象中:

callbacks: {
  async jwt({ token, user, account, profile, isNewUser }) {
    if (user) {
      token.user = user;
      token.apiToken = user.apiToken; // 新增:存储API Token
    }
    if (account) token.accessToken = account.access_token;

    return token;
  },
  // ...
}

3. 在session回调中传递API Token到客户端

将API Token添加到Session对象,让客户端可以访问:

async session({ session, token, user, account }) {
  const { password, ...tokenPwdRemoved } = token.user;
  session.user = tokenPwdRemoved;
  session.apiToken = token.apiToken; // 新增:把API Token放到session里
  return session;
}

4. 客户端使用Token调用API

通过useSession钩子获取Token,在请求头中携带:

import { useSession } from 'next-auth/react';

const YourComponent = () => {
  const { data: session } = useSession();

  const fetchProtectedData = async () => {
    if (!session?.apiToken) return;

    const res = await fetch('/api/your-protected-endpoint', {
      headers: {
        Authorization: `Bearer ${session.apiToken}` // 和Postman测试的格式一致
      }
    });

    const data = await res.json();
    // 处理返回数据
  };

  return <button onClick={fetchProtectedData}>获取数据</button>;
};

注意事项

  • 确保API Token的密钥(如JWT_API_SECRET)存储在环境变量中,不要硬编码或暴露给客户端
  • 保持Token的过期时间和NextAuth Session的maxAge一致,避免Token提前失效
  • 如果你的API Token不是自己生成的,而是从第三方服务获取的,只需在authorize函数中调用对应接口获取Token,再返回即可

内容的提问来源于stack exchange,提问作者Ric Cohen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:25:50