djangonext.jsaxiosnext-authconnection-refused

next-auth: Axios raises connect ECONNREFUSED ::1:8000 when sign-in to django


Stack

Summary

i have a nextjs(13+)+django(4.2+) application up and running on my localhost, now i am at the stage of adding authentication.

i am using next-auth(4.22+) to handle the authentication part.

When i try to sign in, i get this error AxiosError: connect ECONNREFUSED ::1:8000, every other request made by axios go through except the login one.

i have read other answers but none worked for me...

Error

{
  error: AxiosError: connect ECONNREFUSED ::1:8000
      at AxiosError.from (file:///home/yuri/Coding/pos/frontend/node_modules/axios/lib/core/AxiosError.js:89:14)
      at RedirectableRequest.handleRequestError (file:///home/yuri/Coding/pos/frontend/node_modules/axios/lib/adapters/http.js:591:25)
      at RedirectableRequest.emit (node:events:514:28)
      at eventHandlers.<computed> (/home/yuri/Coding/pos/frontend/node_modules/follow-redirects/index.js:14:24)
      at ClientRequest.emit (node:events:514:28)
      at Socket.socketErrorListener (node:_http_client:501:9)
      at Socket.emit (node:events:514:28)
      at emitErrorNT (node:internal/streams/destroy:151:8)
      at emitErrorCloseNT (node:internal/streams/destroy:116:3)
      at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
    port: 8000,
    address: '::1',
    syscall: 'connect',
    code: 'ECONNREFUSED',
    errno: -111,
    config: {
      transitional: [Object],
      adapter: [Array],
      transformRequest: [Array],
      transformResponse: [Array],
      timeout: 0,
      xsrfCookieName: 'csrftoken',
      xsrfHeaderName: 'X-CSRFToken',
      maxContentLength: -1,
      maxBodyLength: -1,
      env: [Object],
      validateStatus: [Function: validateStatus],
      headers: [AxiosHeaders],
      baseURL: 'http://localhost:8000',
      withCredentials: true,
      paramsSerializer: [Object],
      method: 'post',
      url: '/api/auth/login/',
      data: '{"username":"yuri","password":"yuri","redirect":"false","csrfToken":"80d0b198ee09f1abc790d722d42e6fa48a0e38c78a77d4e7c4bd340c9cbb9636","callbackUrl":"http://localhost:3000/auth/sign-in?from=%2Fprofile","json":"true"}'
    },
    request: Writable {
      _writableState: [WritableState],
      _events: [Object: null prototype],
      _eventsCount: 3,
      _maxListeners: undefined,
      _options: [Object],
      _ended: false,
      _ending: true,
      _redirectCount: 0,
      _redirects: [],
      _requestBodyLength: 216,
      _requestBodyBuffers: [Array],
      _onNativeResponse: [Function (anonymous)],
      _currentRequest: [ClientRequest],
      _currentUrl: 'http://localhost:8000/api/auth/login/',
      [Symbol(kCapture)]: false
    },
    cause: Error: connect ECONNREFUSED ::1:8000
        at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1495:16) {
      errno: -111,
      code: 'ECONNREFUSED',
      syscall: 'connect',
      address: '::1',
      port: 8000
    }
  }
}

Iptables

yuri@bookworm ~$ sudo iptables -L                                              
[sudo] password for yuri: 
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   

/etc/hosts

127.0.0.1       localhost
127.0.1.1       bookworm

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Before, i was using Ubuntu 23.04 but i decided to switch to Debian 12 (bookworm) due to system bloating, and this is the first time i have encountered this error.

How to fix this ? is there any explanation to this issue ?


Solution

  • i have finally figured it out.

    The reason Debian 12 system is using IPv6 (::1) instead of IPv4 (127.0.0.1) when i ping localhost is because Debian (and many other modern operating systems) prefer IPv6 over IPv4 when both are available, as a part of the trend towards the adoption of IPv6.

    According to chatGPT:

    IPv6 is the next-generation Internet Protocol, designed to replace IPv4 due to the exhaustion of available IPv4 addresses. To ensure a smooth transition to IPv6, many operating systems are configured to use IPv6 when it's available and fallback to IPv4 if it's not.

    To configure Debian to prefer IPv4 over IPv6, you can adjust the system's precedence for IPv4 and IPv6 in the network configuration. You can achieve this by modifying the /etc/gai.conf file, which controls the order of preference for different IP address families.

    Here's how you can set Debian to prefer IPv4 over IPv6:

    sudo nano /etc/gai.conf
    
    #
    #    For sites which prefer IPv4 connections change the last line to
    #
    #precedence ::ffff:0:0/96  100
    

    To

    #
    #    For sites which prefer IPv4 connections change the last line to
    #
    precedence ::ffff:0:0/96  100
    

    OR