ECONNREFUSED 127.0.0.1:80 при попытке войти в систему с помощью next-auth

Я использую библиотеку https://next-auth.js.org/ для создания системы аутентификации для Next.js моего приложения. На моем локальном компьютере все работает нормально, но после развертывания веб-сайта в Vercel моя функция входа не работает.

Страница входа (/pages/signin) загружается нормально, я отправляю учетные данные и получаю такую ​​ошибку:https://projectname-git-branch.username.now.sh/api/auth/error?error=Error%3A%20connect%20ECONNREFUSED%20127.0.0.1%3A80.

Я нашел много статей о том, что ошибка вот-вот будет неправильной baseURL настроен для axios, но у меня много axios запросы везде в коде (например, я получаю данные из firebase после загрузки приложения), и он работает без проблем.

Я консолью зарегистрированную переменную среды, в которой я установил baseURL собственность для axios и это нормально.

// _app.js
import axios from 'axios';
axios.defaults.baseURL = process.env.FIREBASE_APIURL;
console.log('axios-baseurl', axios.defaults.baseURL) // it prints right url

Больше информации об этой проблеме я написал там: #846

Я действительно не знаю, что мне делать. Я не получаю информации о том, где возникает эта ошибка, какой файл и номер строки, какой запрос в моем коде.

Ниже я положил всю свою [...nextauth.js]файл и войдите в форму. Может быть, есть что-то, что мне лучше там настроить.

// [...nextauth.js]
import NextAuth from 'next-auth'
import Providers from 'next-auth/providers'

import axios from 'axios';
axios.defaults.baseURL = process.env.FIREBASE_APIURL;
console.log('axios-baseurl', axios.defaults.baseURL)

const sha1 = require('crypto-js/sha1');
const md5 = require('crypto-js/md5');

export default (req, res) => 
    NextAuth(req, res, {
        providers: [
            Providers.Credentials({
                name: 'Credentials',
                credentials: {
                    phone: { label: "Numer telefonu", type: "text" },
                    password: { label: "Haslo", type: "password" }
                },
                authorize: async (loginData) => {
                    const { csrfToken, phone, password } = loginData;
                    
                    //  checking if there is account with these credentials
                    let res = await login({
                        phone, 
                        password: sha1(md5(password)).toString()
                    })

                    //  200 = OK
                    if(res.status == 200){
                        //  check if account was activated
                        if(res.data.info.activated == "true"){
                            //  collect account data
                            const user = {
                                phone,
                                ...res.data.info
                            }
                            return Promise.resolve(user);
                        }
                        else{
                            //  account is not activated by sms code
                            return Promise.reject(new Error("AccountNotActivated"));
                        }
                    }
                    else {
                        //  wrong credentials
                        return Promise.reject(new Error("WrongCredentials"));
                    }
                }
            })
        ],
        callbacks: {
            jwt: async (token, user, account, profile, isNewUser) => {
                user && (token.user = user);
                return Promise.resolve(token)
            },
            session: async (session, user, sessionToken) => {
                session.user = user.user;
                return Promise.resolve(session)
            }
        },
        
        pages: {
            signIn: '/signin'
        },
        
        site: process.env.NEXTAUTH_URL || "localhost:3000",
        debug: true
    })


//  function which sends login request to rest api and returns result
//  https://stackru.com/q/64244115
const login = async data => await axios.post('/checkCredentials', data);

<!-- /pages/signin.js -->
<form action="/api/auth/callback/credentials" method="post">
    <input name='csrfToken' type='hidden' defaultValue={csrfToken} />
    <label>
        Numer telefonu: <br />
        <input name='phone' type='text' required autoComplete='off' />
    </label>
    <br />
    <label>
        Hasło: <br />
        <input name='password' type='password' required autoComplete='off' />
    </label>
    <br />
    <br />
    <input type="submit" value="Zaloguj" />
</form>

1 ответ

Вам нужно будет установить переменные среды для производственного использования:

NEXTAUTH_URL (например, NEXTAUTH_URL='https://example.com'

https://next-auth.js.org/configuration/options#nextauth_url

и

NEXTAUTH_SECRET (например, NEXTAUTH_SECRET='MYGENERATEDOPENSSLSECRET')

документация @ https://next-auth.js.org/configuration/options#nextauth_secret

Вы можете сгенерировать секрет в командной строке (только один возможный способ)

      openssl rand -base64 32

Добавьте обе переменные в развертывание vercel:https://vercel.com/docs/concepts/projects/environment-variables .

Другие вопросы по тегам