如何在使用客户端Javascript时保持API密钥的机密性?

49
例如,查看此Facebook插件。
客户端中的API密钥明确可见。有什么东西可以阻止另一个用户获取此密钥并在不同的站点上使用此功能吗?
我认为,一个非常天真的实现是检查请求来自哪个域,但这样的事情很容易被伪造。
如果我要创建类似的东西,如何保护身份验证过程?
我希望尽可能多地处理客户端,尽管肯定需要某种形式的服务器身份验证?任何链接或建议将不胜感激。
更新
关于API密钥的类似问题,我发现它很有用。

1
你看过 Twitter 的 @anywhere 吗?API 密钥是公开的,但他们使用其他信息/密钥来测试数据。 - Shaun Wilde
2个回答

13

简而言之:服务器端验证。当您在给定网站上使用不正确的密钥时,FB本身会抛出错误。 API密钥不应该是秘密(与密钥相反)。


那么我猜测在这种情况下,每个请求的 API 密钥都会改变,对吗? - Finglas
@Finglas:不应该。API密钥标识您的应用程序,并且与单个域绑定;如果您在另一个域上使用它,则当通过AJAX在FB上检查时,API密钥将无法匹配,界面将无法加载。 - Piskvor left the building
5
我明白你的意思。如果我注册了A网站,我怎么能相信这个域名是可信的呢?因为我可以使用相同的密钥创建B网站,但在发送请求之前篡改标头,这样我们该如何防范呢? - Finglas
@Finglas:你是如何篡改头部信息的?这些信息不是由你的服务器发送的,而是由用户的浏览器发送的。 - Piskvor left the building
7
像 Firebug/tamper data 这样的工具等等。尽管如此,API 密钥似乎能够胜任这项工作。在同一主题下,可以找到一个有趣的问题,链接为 https://dev59.com/_XE95IYBdhLWcg3wkeqq - Finglas
显示剩余4条评论

3

我自己没有做过这个,但我知道你担心的攻击类型被称为跨站请求伪造(CSRF)。关于这方面的维基百科文章提供了一些如何预防的提示。


这应该是这个问题的标题。 “如何防止跨站点请求伪造?” - mr5
5
如果标题是“防止 CSRF”,像我这样不知道名称的人就找不到这个问题了。 - Eponymous
1
@Eponymous 嗯,你说得对!我不记得为什么写了这个愚蠢的评论。就当我没说吧。哈哈 - mr5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接