Javascript PHP驱动的API如何跨域认证真正的客户端(referer)(知道头可能被伪造)?

Javascript PHP驱动的API如何跨域认证真正的客户端(referer)(知道头可能被伪造)?,javascript,authentication,widget,cross-domain,referer,Javascript,Authentication,Widget,Cross Domain,Referer,使用PHP,您如何安全地验证一个API调用,跨域,并满足以下条件: 必须从给定的domain.com/page调用(无其他域) 必须有一个给定的密钥 一些背景:请在回答之前仔细阅读 我的web应用程序将通过如下调用在客户端网站上显示javascript小部件。所以我们讨论的是脚本的跨域身份验证,但只针对真正的客户端和给定的URL 目前,这个小部件可以通过一行javascript包含在客户端的网站中 示例客户端网站.com/page/with/my widget <head> ...

使用PHP,您如何安全地验证一个API调用跨域,并满足以下条件:

  • 必须从给定的domain.com/page调用(无其他域)
  • 必须有一个给定的密钥
  • 一些背景:请在回答之前仔细阅读

    我的web应用程序将通过如下调用在客户端网站上显示javascript小部件。所以我们讨论的是脚本的跨域身份验证,但只针对真正的客户端和给定的URL

    目前,这个小部件可以通过一行javascript包含在客户端的网站中

    示例客户端网站.com/page/with/my widget

    <head>
    ...
    <script src="//ws.my-webappserver.com/little-widget/?key=api_key"></script>
    ...
    </head>
    
    ***该小部件仅允许在某些网站/页面上运行

    现在,问题是:

  • 密钥位于客户端,因此任何人都可以查看源代码并获取密钥
  • 例如,引用者可以被欺骗(通过cURL)
  • 还有一个小问题: 我不能告诉客户端将密钥粘贴到服务器上的php脚本中,因为它们可以运行任何服务器端语言

    那么,我如何使我的web服务安全,并且只能由给定的域/页面访问

    任何帮助都将不胜感激


    ps:这个小部件可以上传到一个下拉框中,所以安全性是关键

    我建议使用白名单方法来解决这个问题,我不完全确定这会解决这个问题,但是我对支付处理器使用了类似的技术,它要求您将服务器IP列入白名单

    我以前听过很多。归根结底,您需要对每个用户自己进行身份验证,或者信任另一个站点的身份验证,并大力监控不良活动(这就是您正在做的)。在js中,您可以做更多的工作来打破业余的curl脚本,但除非您想保护每个请求,否则您几乎无能为力。
    if ($_SERVER['HTTP_REFERER'] !== "http://client-website.com/page/with/my-widget")
      && $_REQUEST["Key"] == "the_long_api_key") {
        header("Content-type: application/x-javascript");
        echo file_get_contents($thewidgetJS_in_secret_location_on_server);
    } else {
      //pretend to be a 404 page not found or some funky thing like that
    }