在使用Angular时隐藏一个API密钥(在一个环境variables中可能?)
我正在运行一个带有Node / Express后端的小型Angular应用程序。
在我的一个Angular工厂(即在客户端),我向Github发出一个$ http请求来返回用户信息。 然而,一个Github生成的密钥(这意味着保密)需要这样做。
我知道我不能在客户端使用process.env.XYZ。 我想知道如何保持这个关键密钥? 我必须在后端提出请求吗? 如果是这样,我如何将返回的Github数据传输到前端?
对不起,如果这似乎是简单的,但我是一个相对的新手,所以任何明确的答复代码示例将不胜感激。 谢谢
不幸的是,您必须在您的后端代理请求,以保持关键的秘密。 (我假设你需要一些不可用的用户数据,像https://api.github.com/users/rsp?callback=foo这样的未经validation的请求,否则你不需要首先使用API密钥 – 但你没有具体说明你需要做什么,这只是我的猜测)。
你可以做的是这样的:在你的后端,你可以为你的前端添加一个新的路由只是为了获取信息。 它可以做任何你需要的 – 使用或不使用任何秘密的API密钥,validation请求,在返回给你的客户之前处理响应等。
例:
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'); });
在这个例子中你可以得到用户信息:
- HTTP://本地主机:3000 / GitHub的用户/ ABC
函数getUser
应该向GitHub发出一个实际的请求,在你调用它之前,你可以改变它是否是你正在发出请求的前端,例如通过cheching“Referer”头或其他东西,validationinput等。
现在,如果你只需要一个公共信息,那么你也许可以像这样使用一个公共的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