Я создаю прототип приложения, используя API YNAB (вам нужен бюджет) и ngrok на порту 3000, и получаю сообщение об ошибке ниже. В настоящее время я только настраиваю базовую маршрутизацию, но не могу успешно получить токен доступа и заставить браузер перенаправить обратно на мой маршрут / app. Ошибка ниже - лог консоли; Я также получаю 502 в браузере.
{ Error: getaddrinfo ENOTFOUND https://app.youneedabudget.com https://app.youneedabudget.com:443
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:67:26)
errno: 'ENOTFOUND',
code: 'ENOTFOUND',
syscall: 'getaddrinfo',
hostname: 'https://app.youneedabudget.com',
host: 'https://app.youneedabudget.com',
port: 443 }
Документация по API, которую я использую для запросов ONuth от YNAB, может быть найдена здесь . Я использую ngrok с именем хоста https://ynag.ngrok.io, и я настроил свои URL перенаправления как:
https://ynag.ngrok.io/oauth/token
https://ynag.ngrok.io/app
https://ynag.ngrok.io/oauth/redirect
Я использую команду экспорта в терминале, чтобы добавить свой идентификатор клиента и секрет, и успешно перейти на страницу входа в YNAB для API, получить код авторизации и перенаправить на «/ oauth / token» (как проверено в журналах моей консоли и открывается страница авторизации), но после нажатия «Авторизовать», чтобы получить токен доступа и перенаправить на мой маршрут «/ app», я получаю сообщение об ошибке выше, и страница либо не перенаправляет, либо обозначает Bad Gateway 502.
// index.js
const express = require('express');
const querystring = require('querystring');
const https = require('https');
const morgan = require('morgan');
const clientID = process.env.clientID;
const clientSecret = process.env.clientSecret;
const codeRedirect = encodeURI('https://ynag.ngrok.io/oauth/token');
const tokenRedirect = encodeURI('https://ynag.ngrok.io/app');
const app = express();
const port = process.env.PORT || 3000;
let authCode;
app.use(morgan('dev'));
// Home Route
app.get('/', (req, res) => {
res.send('App Home');
});
// Obtain Authorization Code
app.get('/oauth/redirect', (req, res) => {
res.redirect(`https://app.youneedabudget.com/oauth/authorize?client_id=${clientID}&redirect_uri=${codeRedirect}&response_type=code`);
});
// Obtain Access Token
app.get('/oauth/token', (req, res) => {
authCode = req.query.code;
console.log(`Client ID: ${clientID} \nClient Secret: ${clientSecret} \nAuthorization Code: ${authCode}`);
let post_data = querystring.stringify({
'client_id': clientID,
'client_secret': clientSecret,
'redirect_url': tokenRedirect,
'grant_type': 'authorization_code',
'code': authCode
});
let post_options = {
host: 'https://app.youneedabudget.com',
path: `/oauth/token?client_id=${clientID}&client_secret=${clientSecret}&redirect_uri=${tokenRedirect}&grant_type=authorization_code&code=${authCode}`,
port: 443,
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': post_data.length
}
};
let post_req = https.request(post_options, (res) => {
console.log('Status: ' + res.statusCode);
console.log('Headers: ' + JSON.stringify(res.headers));
res.setEncoding('utf8');
res.on('data', (response) => {
console.log(`Response: ${response}`);
});
});
post_req.on('error', (e) => {
console.error(e);
});
post_req.write(post_data);
post_req.end();
});
// Successful Login Route
app.get('/app', (req, res) => {
res.send('Logged in.');
});
app.listen(port, () => {
console.log(`Server listening on port ${port}.`);
});