如何使用节点 js 从后端 API 请求 apikey?
Posted
技术标签:
【中文标题】如何使用节点 js 从后端 API 请求 apikey?【英文标题】:How to request apikey from backend API using node js? 【发布时间】:2020-11-11 09:46:16 【问题描述】:我正在学习使用 Node (Express) + React 构建天气应用程序。我已成功从开放天气 API 获取天气数据。
但是,我在我的 React 应用程序中直接使用开放天气 API 密钥,例如 const weatherURL = 'http://api.openweathermap.org/data/2.5/weather?q=london,uk&APPID=1234567qwerty';
。显然这是不安全的,因为它会将 API 密钥暴露给客户端。我曾考虑将 API 密钥存储在 .env
文件中,但根据 [this answer][1],我不应该将 API 密钥存储在 .env
文件或 .gitignore
中。正确的方法是向后端 API 发出请求,然后对后端进行 API 调用并将数据发回。我不知道该怎么做。有人可以帮忙吗?
以下是我的节点js代码:
const express = require('express');
const cors = require('cors');
const app = express();
const SELECT_ALL_QUERY = 'SELECT * FROM `mySchema`.`myTable`;';
app.use(cors());
app.get('/', (req, res) =>
res.send('go to /myTable to see content')
);
const pool = require('./awsPool');
pool.getConnection((err, connection) =>
if (err)
return console.log('ERROR! ', err);
if(!connection)
return console.log('No connection was found');
app.get('/myTable', (req, res) =>
console.log(connection);
connection.query(SELECT_ALL_QUERY, (err, results) =>
if (err)
return res.send(err)
else
return res.json(
data: results
)
;
);
);
);
let port=process.env.PORT||4000;
app.listen(port, () =>
console.log(`App running on port $port `);
);```
[1]: https://***.com/a/57103663/8720421
【问题讨论】:
你说的是设置代理服务器...看看那个... nodeJs/Express 的用户护照中间件。他们提供了护照头apikey策略,您可以使用该策略创建和授权apiKey。 passportjs.org/packages/passport-headerapikey 【参考方案1】:链接答案的建议是在您的 Node/Express 后端 API 中创建一个路由,该路由将为您而不是前端调用天气 API。这样,每当您的前端进行调用时,请求和您的 API 密钥就不会面向公众。
执行此操作的方法基本上与您在 React 中所做的相同,使用内置或 3rd 方库发出 HTTP 请求。 This resource 我刚刚发现有一些关于如何做到这两点的信息。
【讨论】:
【参考方案2】:node中最简单的纯http-request如下:
const http = require('http')
const url = 'http://api.openweathermap.org/data/'
http.request(url, callback).end()
function callback (weatherResponse)
let jsonString = ''
weatherResponse.on('data', chunk =>
jsonString += chunk
)
weatherResponse.on('end', () =>
// Now you have the complete response and can do whatever you want with it
// like return it to your user `res.send(jsonString)`
console.log(jsonString)
)
许多人发现必须处理块和整个异步事情很笨重,因此有许多流行的 npm 模块,例如:https://www.npmjs.com/package/axios。 (这里是其他竞争者的列表https://github.com/request/request/issues/3143)。
此外,将 API 密钥存储在后端的环境变量中是正常的。如果您尝试对应用进行 docker 化,或者只是扩展到使用两台后端服务器而不是一台后端服务器,这会让事情变得简单。
【讨论】:
【参考方案3】:我根据@ippi的答案找到了一个解决方案,在原代码中添加以下部分:
const request = require('request');
const url = 'http://api.openweathermap.org/data/2.5/weather?q=london,uk&APPID=1234567';
app.get('/weather', (req, res) =>
request(url, (error, response, body) =>
if (!error && response.statusCode == 200)
var info = JSON.parse(body)
res.send(info);
)
)
url 可以存储在.env
文件中并传递到上面的代码中。返回的天气数据可以在http://localhost:4000/weather
以JSON格式查看。在 React 中,天气数据可以通过这个 localhost url 获取。
编辑:request
已弃用,因此这里是使用axios
的解决方案
app.get('/weather', (req, res) =>
axios.get(url)
.then(response => res.json(response.data))
.catch(error =>
console.log(error);
);
)
【讨论】:
【参考方案4】:nodeJs/Express 的用户护照中间件。他们提供了护照头apikey策略,您可以使用该策略创建和授权apiKey。 http://www.passportjs.org/packages/passport-headerapikey/
【讨论】:
以上是关于如何使用节点 js 从后端 API 请求 apikey?的主要内容,如果未能解决你的问题,请参考以下文章