代码之家  ›  专栏  ›  技术社区  ›  Chris McCall

如何设计一个允许跨域安全脚本的javascript API?

  •  16
  • Chris McCall  · 技术社区  · 14 年前

    我喜欢Google Maps的api的使用方式,使用脚本include,但我担心:

    如何使用SSL和某种身份验证来保证数据的安全,但仍然可以从不需要服务器端代理的纯HTML页面“水平”访问?我需要管理钥匙吗?如何在不被拦截的情况下将密钥发布到服务器?我可以使用OpenId(或其他第三方身份验证)来验证api用户,还是必须创建自己的身份验证机制?我在Google上到处都找不到安全地设计和部署API的好指南。

    现在我正在使用REST和AJAX来使用它们,但是跨域调用是不可能的。任何帮助或指向正确方向的指针都将不胜感激。

    5 回复  |  直到 14 年前
        1
  •  10
  •   T.J. Crowder    14 年前

    我可能会使用一个动态生成的脚本标记和一个SSL URL,它在查询字符串中包含一个经过公钥加密的密钥。服务器将使用私钥来解密查询字符串参数并返回包含相关信息的脚本(如果密钥无效,则返回或不返回)。或者类似的东西。但我承认实际上我没有必要这么做。

    我也会寻找现有技术,比如亚马逊的S3服务。

    所以:

    1. 用户提供机密
    2. JavaScript附加一个 script 包含URL的标记
    3. 服务器处理脚本请求,解密机密,检查它,并发送回相关响应。

    您很可能需要两个周期,因为否则对服务器的请求可能会通过中间人攻击被重用。那就是:

    1. JavaScript附加一个 请求唯一密钥的标记(可能包含一些混淆信息,如源IP和一些随机的进一步密钥)
    2. 服务器使用绑定到该IP的一次性密钥进行响应
    3. 用户提供机密
    4. 客户端代码使用公钥加密密钥,包括来自#1的唯一密钥
    5. JavaScript附加一个 包含URL的标记
    6. 服务器处理脚本请求,解密机密,检查它,并发送回相关响应。
    7. 可以使用1中包含的随机密钥(在某种程度上)对响应进行加密

    (或者是我?哈哈哈……)

        2
  •  0
  •   linusthe3rd    14 年前

    OAuth可以帮助用户登录到第三方应用程序,并允许您的应用程序在发出xhr请求时使用请求令牌代表他们访问第三方。 http://oauth.net/documentation/getting-started/

    ========

    使用服务器端代理的原因归结为web浏览器中内置的同源策略: http://en.wikipedia.org/wiki/Same_origin_policy

        3
  •  0
  •   dlongley    14 年前

    查看opensource javascript Forge项目。它提供了一个javascript TLS实现,允许安全的跨域xhr请求。可能对你有用:

    http://digitalbazaar.com/2010/07/20/javascript-tls-1/

    http://digitalbazaar.com/2010/07/20/javascript-tls-2/

    https://github.com/digitalbazaar/forge

    一个潜在的解决方案:

    1. 获取站点的SSL证书。
    2. 安装Forge附带的apache mod,以设置允许其他站点访问您的站点的跨域策略。
    3. Host Forge在您站点上的TLS实现,以及您站点的PEM格式证书。
    4. 告诉其他站点包含来自您站点的javascript,并使用它对您的站点进行安全调用,以执行您想要的任何操作。
        4
  •  0
  •   bdew    14 年前
    1. (第三方)页面使用OAUTH或类似的东西对用户进行身份验证并从服务器获取令牌。
    2. IFRAME可以通过SSL安全地与服务器通信
    3. 使用 easyXDM 或者类似于IFRAME和第三方页面之间的通信,使用您创建的一些有限的类RPC或类socket的API。

        5
  •  0
  •   ayc    14 年前

    我不太清楚到底是什么问题,我想你是想对[https://secure.com]进行类似jsonp的调用,以便在[http://regular.com]上处理/显示数据?

    这两个服务器能互相通话吗?这样怎么样:

    1. 用户登录[https://secure.com]

    2. 身份验证后,secure.com生成一个令牌(称为syntoken)并将其直接传递到regular.com(服务器到服务器),可能类似于会话id、任意消息和otp密码(称为syncipher)。

    3. Broswer收到会话id cookie,然后Secure.com将浏览器重定向到 http://regular.com/setcookieandredirect?session_id=blabla&otpencryptedsynmessage=blabla

    4. Regular.com使用会话id作为密钥查找otp密码,并解密otpencryptedmessage“blabla”

    5. 然后,Regular.com向浏览器发送一个由otpencryptedakmessage组成的cookie(我们将此cookie命名为“verified_session”)。

    从那里,你可以像打电话给

    https://secure.com/getscript.js?query=dataname&verifiedtoken=(verified_sessions_cookie_value

    其中secure.com/getscript.js将以verifiedtoken为密钥,根据[secure.com]发送的原始cookie会话id查找ackcipher,并解密otpencrypedackmessage。如果解密的消息与ack消息匹配,则呈现脚本文件。

    有点像三方握手。秘密的调味品是服务器必须能够直接相互交谈,以离散地传递密钥。您不必对两台服务器使用相同的会话id,我只是将其用作一个简单的参考点,以找到访问syn/ack otp密码的方法。密码必须完全对公众隐藏。