我正在运行一个带有Node / Express后端的小型Angular应用程序。
在我的一个Angular工厂(即客户端),我向Github发出$ http请求以返回用户信息。但是,需要Github生成的密钥(意图保密)。
我知道我不能在客户端使用process.env.XYZ。我想知道如何保密这个api密钥?我是否必须在后端提出请求?如果是这样,我如何将返回的Github数据传输到前端?
很抱歉,如果这看似简单,但我是一个相对新手,所以任何明确的代码示例回复将非常感激。谢谢
答案 0 :(得分: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);
});
请参阅DEMO