尝试使用next-auth登录时出现“ECONNREFUSED 127.0.0.1:80”错误

17

我使用 next-auth.js 库为 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请求(例如在应用程序加载后从firebase获取数据),但它们没有任何问题。

我在控制台记录了设置axiosbaseURL属性的环境变量,它也没问题。

// _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://dev59.com/vL3pa4cB1Zd3GeqPhZre
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>

2
我有类似的问题...真是烦人..哈哈,你找到解决方案了吗?我看了很多帖子都没找到什么 :( 谢谢 - Sovanna
有关此事的任何更新吗?这里也有类似的问题。谢谢! - Romaixn
@Romaixn 你是否在Vercel中正确设置了NEXTAUTH_URL环境变量的值(生产环境URL)? - juliomalves
1个回答

1

您需要为生产环境设置环境变量:

NEXTAUTH_URL(例如:NEXTAUTH_URL='https://example.com')

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

and

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接