在Next.js中通过NextAuth.js自定义提供者传递code至Token端点
解决NextAuth.js自定义OAuth提供者转发code到Token端点的问题
首先明确:NextAuth.js默认会自动处理code到token的交换流程——当用户携带code回调到你的应用时,框架会自动提取code参数,按照OAuth 2.0规范向你配置的token.url发送POST请求,请求体包含code、client_id、client_secret、redirect_uri等必要参数,所以你当前的配置其实已经在转发code了。
如果需要自定义转发逻辑(比如添加额外参数、修改请求规则),可以在token配置中添加request函数手动控制:
{ id: "myauth", name: "myauthname", type: "oauth", clientId: "nextjs-client", clientSecret: "dummy-secret", authorization: { url: "http://localhost:8087/token-mediator/oauth/authorize", params: { scope: "openid email profile" } }, token: { url: "http://localhost:8087/token-mediator/oauth/token", // 自定义token请求逻辑,确保code被转发 async request({ params, client, provider }) { // 提取回调URL中的code参数 const { code } = params; // 按OAuth规范构造请求体 const response = await fetch(provider.token.url, { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: new URLSearchParams({ code: code, client_id: client.clientId, client_secret: client.clientSecret, redirect_uri: provider.callbackUrl, // 必须与OAuth服务器配置的回调地址一致 grant_type: "authorization_code" // 授权码模式必填参数 }) }); // 解析并返回token响应 const data = await response.json(); return { tokens: data }; } } }
关键细节:
params参数包含回调URL的所有查询参数,其中就有需要的code;provider.callbackUrl是NextAuth自动生成的回调地址,必须和你在OAuth服务端配置的回调地址完全匹配;- 请求的
Content-Type必须设为application/x-www-form-urlencoded,这是OAuth token端点的标准要求; - 若Token端点需要额外参数,直接添加到
URLSearchParams中即可。
内容的提问来源于stack exchange,提问作者Katlock
相关产品推荐
相关产品推荐

