如何使用节点 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用rxjs从后端api获取头属性?

如何在 Web 推送通知中从后端发送图像?

如何从后端向用户本地主机上的另一台服务器发出请求

使用 keycloak 保护节点 js 后端 API

跨站点 cookie 的问题:如何将 cookie 从后端设置到前端

根据请求jQuery将pdf从后端传输到前端