next-auth with googleProvider returns error: TIMED OUT // Try signing in with a different account

Viewed 688

Hi I am working with next.js with next-auth googleProvider. I have finished coding in local environment and now I am testing in production.

The problem I faced is it google API returns an error when try to signIn. The symptom is like below

  • it prints "Try signing in with a different account." in the browser
  • it returns error message like below in server
>>>> redirect callback /welcome http://test.abc.com:5000
[next-auth][error][GET_AUTHORIZATION_URL_ERROR]
https://next-auth.js.org/errors#get_authorization_url_error connect ETIMEDOUT 172.217.26.237:443 {
  message: 'connect ETIMEDOUT 172.217.26.237:443',
  stack: 'Error: connect ETIMEDOUT 172.217.26.237:443\n' +
    '    at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1187:16)',
  name: 'Error'
}
[next-auth][error][SIGNIN_OAUTH_ERROR]
https://next-auth.js.org/errors#signin_oauth_error connect ETIMEDOUT 172.217.26.237:443 {
  error: {
    message: 'connect ETIMEDOUT 172.217.26.237:443',
    stack: 'Error: connect ETIMEDOUT 172.217.26.237:443\n' +
      '    at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1187:16)',
    name: 'Error'
  },
  provider: {
    id: 'google',
    name: 'Google',
    type: 'oauth',
    wellKnown: 'https://accounts.google.com/.well-known/openid-configuration',
    authorization: { params: [Object] },
    idToken: true,
    checks: [ 'pkce', 'state' ],
    profile: [Function: profile],
    clientId: 'private.info.apps.googleusercontent.com',
    clientSecret: 'user_secret',
    httpOptions: { timeout: 6000000, agent: false },
    signinUrl: 'http://test.abc.com:5000/api/auth/signin/google',
    callbackUrl: 'http://test.abc.com:5000/api/auth/callback/google'
  },
  message: 'connect ETIMEDOUT 172.217.26.237:443'
}

So... at first, I guess it is a firewall issue. However I could receive data from google endpoints.(i.e. curl https://accounts.google.com/.well-known/openid-configuration)

I was also able to fetch curl 172.217.26.237:443, but it returned zero bytes.

Below is my [...nextAuth.js].(Nothing special I think)

import NextAuth from 'next-auth';
import GoogleProvider from 'next-auth/providers/google';

const AUTH_TIMEOUT = 60000;
export default NextAuth({
    providers: [
        GoogleProvider({
            clientId: process.env.GOOGLE_CLIENT_ID,
            clientSecret: process.env.GOOGLE_CLIENT_SECRET,
            authorization: {
                params: {
                    prompt: 'consent',
                    access_type: 'offline',
                    response_type: 'code',
                },
            },
            // https://github.com/nextauthjs/next-auth/issues/3920
            httpOptions: {
                timeout: AUTH_TIMEOUT,
            },
        }),
    ],
    callbacks: {
        async signIn({ account, profile }) {
            console.debug('>>>> signIn callback', account, profile);
            if (account.provider === 'google') {
                return profile.email_verified && profile.email.endsWith('myhost.com');
            }
            return false;
        },
        async redirect({ url, baseUrl }) {
            console.log(process.env.HTTPS_PROXY);
            console.debug('>>>> redirect callback', url, baseUrl);
            if (url.startsWith('/')) return `${baseUrl}${url}`;
            if (new URL(url).origin === baseUrl) return url;
            return baseUrl;
        },
        async session({ session, user, token }) {
            console.debug('>>>> session callback', session, user, token);
            const mergedSession = { ...session };
            if (token && token.id_token) {
                mergedSession.user.id_token = token.id_token;
            }
            return mergedSession;
        },
        async jwt({
            token, user, account,
            profile, isNewUser,
        }) {
            console.debug('>>>> jwt callback', token, user, account, profile, isNewUser);
            const mergedTokenObject = { ...token };
            if (account && !token.id_token) {
                mergedTokenObject.id_token = account.id_token;
            }
            return mergedTokenObject;
        },
    },
    secret: process.env.APP_SECRET,
});

Here is the question.

Could it be a firewall issue? - I just do not get it since I can fetching some data from those urls with curl.

If not, what kind of things I could try at this moment? thx

0 Answers
Related