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 .