5

我使用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,但我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://stackoverflow.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>
4

0 回答 0