2

我正在运行一个带有 Node/Express 后端的小型 Angular 应用程序。

在我的一个 Angular 工厂(即客户端)中,我向 Github 发出 $http 请求以返回用户信息。但是,执行此操作需要 Github 生成的密钥(应保密)。

我知道我不能在客户端使用 process.env.XYZ。我想知道如何才能将此 api 密钥保密?我是否必须在后端提出请求?如果是这样,我如何将返回的 Github 数据传输到前端?

抱歉,如果这看起来很简单,但我是一个相对新手,所以任何带有代码示例的明确回复将不胜感激。谢谢

4

1 回答 1

2

不幸的是,您必须在后端代理请求以保密。(我假设您需要一些通过未经身份验证的请求无法获得的用户数据,例如https://api.github.com/users/rsp?callback=foo因为否则您首先不需要使用 API 密钥- 但你没有具体说明你需要做什么,所以这只是我的猜测)。

你可以做的是这样的事情:在你的后端,你可以为你的前端添加一个新的路由来获取信息。它可以做任何您需要的事情 - 使用或不使用任何 API 密钥、验证请求、在返回客户端之前处理响应等。

例子:

var app = require('express')();

app.get('/github-user/:user', function (req, res) {
    getUser(req.params.user, function (err, data) {
        if (err) res.json({error: "Some error"});
        else res.json(data);
    });
});

function getUser(user, callback) {
    // a stub function that should do something more
    if (!user) callback("Error");
    else callback(null, {user:user, name:"The user "+user});
}

app.listen(3000, function () {
  console.log('Listening on port 3000');
});

在此示例中,您可以在以下位置获取用户信息:

该函数getUser应该向 GitHub 发出实际请求,在您调用它之前,您可以更改是否确实是您的前端发出请求,例如通过检查“Referer”标头或其他内容,验证输入等。

现在,如果您只需要公共信息,那么您可以使用像这样的公共 JSON-P API - 使用 jQuery 的示例使事情变得简单:

var user = prompt("User name:");
var req = $.getJSON('https://api.github.com/users/'+user);
req.then(function (data) {
  console.log(data);
});

演示

于 2016-06-11T10:03:53.440 回答