hoangvvo / next-connect

The TypeScript-ready, minimal router and middleware layer for Next.js, Micro, Vercel, or Node.js http/http2
https://www.npmjs.com/package/next-connect
MIT License
1.62k stars 65 forks source link

nextjs14 with next-connect not working #239

Open epubreader opened 6 months ago

epubreader commented 6 months ago

TypeError: res.setHeader is not a function at strategy.redirect (webpack-internal:///(rsc)/./node_modules/passport/lib/middleware/authenticate.js:322:21) at stored (webpack-internal:///(rsc)/./node_modules/passport-oauth2/lib/strategy.js:285:22) at NullStore.store (webpack-internal:///(rsc)/./node_modules/passport-oauth2/lib/state/null.js:3:5) at OAuth2Strategy.authenticate (webpack-internal:///(rsc)/./node_modules/passport-oauth2/lib/strategy.js:296:38) at attempt (webpack-internal:///(rsc)/./node_modules/passport/lib/middleware/authenticate.js:353:22) at authenticate (webpack-internal:///(rsc)/./node_modules/passport/lib/middleware/authenticate.js:354:11) at eval (webpack-internal:///(rsc)/./app/api/auth/[provider]/route.js:55:11) at new Promise () at authenticate (webpack-internal:///(rsc)/./app/api/auth/[provider]/route.js:46:42) at Array.eval (webpack-internal:///(rsc)/./app/api/auth/[provider]/route.js:61:28) at next (webpack-internal:///(rsc)/./node_modules/next-connect/dist/esm/router.js:67:34) at Array.initialize (webpack-internal:///(rsc)/./node_modules/passport/lib/middleware/initialize.js:86:9) at Router.exec (webpack-internal:///(rsc)/./node_modules/next-connect/dist/esm/router.js:68:22) at EdgeRouter.run (webpack-internal:///(rsc)/./node_modules/next-connect/dist/esm/edge.js:47:63) at GET (webpack-internal:///(rsc)/./app/api/auth/[provider]/route.js:106:23) at /home/mason/project/epubpub/nextjs/node_modules/next/dist/compiled/next-server/app-route.runtime.dev.js:6:63257 at /home/mason/project/epubpub/nextjs/node_modules/next/dist/server/lib/trace/tracer.js:133:36

`import passport from "passport"; import { Strategy as GitHubOAuth2Strategy } from "passport-github"; import { OAuth2Strategy as GoogleOAuth2Strategy } from "passport-google-oauth";

//import api from "@/api";

const SUPPORTED_PROVIDERS = ["google", "github"]; import { NextResponse } from "next/server";

import { createEdgeRouter } from "next-connect";

passport.use( new GitHubOAuth2Strategy( { clientID: process.env.GITHUB_CLIENT_ID ?? "", clientSecret: process.env.GITHUB_CLIENT_SECRET ?? "", callbackURL: process.env.GITHUB_CALLBACKURL ?? "", scope: ["user:email"], }, (accessToken, , profile, cb) => { return cb(null, { accessToken, profile }); } ) ); passport.use( new GoogleOAuth2Strategy( { clientID: process.env.GOOGLE_CLIENT_ID ?? "", clientSecret: process.env.GOOGLE_CLIENT_SECRET ?? "", callbackURL: process.env.GOOGLE_CALLBACKURL ?? "", scope: "profile email", }, (accessToken, , profile, cb) => { return cb(null, { accessToken, profile }); } ) );

const authenticate = (method, req, res) => new Promise((resolve, reject) => { passport.authenticate(method, { session: false }, (error, token) => { if (error) { reject(error); } else { resolve(token); } })(req, res); });

const router = createEdgeRouter();

router.use(passport.initialize()).get(async (req, res) => { const { provider } = res.params; try { const user = await authenticate(provider, req, res); return NextResponse.json({ user }); } catch (error) { console.error(error); return NextResponse.json(error.message, { status: 401 }); } });

export async function GET(req, ctx) { // Validate provider const { provider } = ctx.params;

if (typeof provider !== "string") { return Response.json( { success: false, error: "Invalid OAuth2 provider.", }, { status: 400, } ); } if (!SUPPORTED_PROVIDERS.includes(provider)) { return Response.json( { success: false, error: ${provider} is not a supported OAuth2 provider., }, { status: 400, } ); }

// Check if we're already logged in // const user = await api.me(req, res); // if (user.success && user?.payload) { // // If User hasn't completed account creation then redirect // if (user.payload.user?.state !== "COMPLETE") { // res.redirect("/profile"); // return; // } // res.redirect("/"); // return; // }

try { const opts = { session: false, };

return router.run(req, ctx);
//await passport.authenticate(provider, opts)(req, new NextResponse());

} catch (err) { console.error(err); return Response.json( { success: false, error: Failed to authenticate with ${provider}. Please try again later., }, { status: 500, } ); } } `

mkbctrl commented 6 months ago

please make sure your code is properly wrapped. It's pain to read.