Javascript 如何检查公共API的XMLHttpRequest是来自我自己的webapp还是来自第三方客户端(以确保优先级)?

Javascript 如何检查公共API的XMLHttpRequest是来自我自己的webapp还是来自第三方客户端(以确保优先级)?,javascript,ajax,api,authentication,xmlhttprequest,Javascript,Ajax,Api,Authentication,Xmlhttprequest,有人知道一种在API端检查XMLHttpRequest是从我自己的web应用程序(即我编写的JS)还是从第三方应用程序生成的方法吗 在我看来,问题在于,由于JS是在客户机上运行的,因此任何人都可以访问,因此我无法秘密地与API服务器通信。我认为这很有用,因为在高使用率的情况下,我无法将来自我自己的应用程序的请求优先于第三方客户端 我显然可以发送一些未记录的参数,但这些参数可能是伪造的 有人有什么想法吗?我想到了一些想法。我知道秘密永远不会持久,所以我同意这不是一个好的选择 您可以在不同的未公告

有人知道一种在API端检查XMLHttpRequest是从我自己的web应用程序(即我编写的JS)还是从第三方应用程序生成的方法吗

在我看来,问题在于,由于JS是在客户机上运行的,因此任何人都可以访问,因此我无法秘密地与API服务器通信。我认为这很有用,因为在高使用率的情况下,我无法将来自我自己的应用程序的请求优先于第三方客户端

我显然可以发送一些未记录的参数,但这些参数可能是伪造的


有人有什么想法吗?

我想到了一些想法。我知道秘密永远不会持久,所以我同意这不是一个好的选择

  • 您可以在不同的未公告端口上运行另一个实例

  • 您可以通过SSL进行此操作,并使用证书来标识客户端

  • 一种简单但不太安全的方法是使用cookies

  • 你可以通过IP地址,但这可能是一个管理噩梦


    • 我想到了几个主意。我知道秘密永远不会持久,所以我同意这不是一个好的选择

      • 您可以在不同的未公告端口上运行另一个实例

      • 您可以通过SSL进行此操作,并使用证书来标识客户端

      • 一种简单但不太安全的方法是使用cookies

      • 你可以通过IP地址,但这可能是一个管理噩梦


      如果您确实批准第三方客户端访问您的API,也许您可以为他们提供一个稍有不同的、速率有限的接口,并对其进行良好的记录(以便它更易于使用,从而被第三方客户端实际使用)

      一种方法是使用两个不同的API URL,例如:

      • /api?client=ThirdPartyAppName&……
        用于第三方应用程序(您会鼓励使用此URL)
      • /api?令牌=&…
        用于您自己的JS

      请注意,正如您所提到的,不可能完全停止对您自己的代码进行反向工程。虽然它需要更长的时间,甚至编译,二进制代码也可以用C++语言编写,但是可以逆向工程,并且,

      如果你同意第三方客户端访问API,也许你可以为他们提供一个稍微不同的、速率受限的接口并把它做好。(以便更易于使用,从而被第三方客户实际使用)

      一种方法是使用两个不同的API URL,例如:

      • /api?client=ThirdPartyAppName&……
        用于第三方应用程序(您会鼓励使用此URL)
      • /api?令牌=&…
        用于您自己的JS

      注意到,正如你所说的,不可能完全停止对自己代码的逆向工程。虽然它需要更长的时间,甚至编译,但是用C++语言编写的二进制代码可以逆向工程,并且,

      < P>我会让你的Web服务器应用程序生成一个令牌,它将在J中传递给你的客户端。avaScript或一个隐藏字段,它们反过来将使用该字段来调用您的API。那些具有有效令牌的人将获得优先级,缺少或无效的tokes将不会。web服务器应用程序可以在您的系统中创建和注册令牌,其使用方式限制了试图重用令牌的其他人(例如,时间限制).

      我会让您的web服务器应用程序生成一个令牌,它将以JavaScript或隐藏字段的形式传递给您的客户端,然后客户端将使用该字段调用您的API。具有有效令牌的用户将获得优先级,缺少或无效的TOKE则不会。web服务器应用程序可以在您的系统中以限制了它对试图重用它的其他人的有用性(例如,时间有限)。

      1、2和4的问题是我不知道客户端是谁,我无法隐藏连接细节(因为它们在JS中)…1、2和4的问题是我不知道客户端是谁,我无法隐藏连接细节(因为它们在JS中)…很好的一点,尽管你说它并不完全安全。因此我必须说,我喜欢ongle的想法,即每次都从http服务器发送有时间限制的令牌或其他令牌。如果时间限制大约为2小时,这些令牌就不会被第三方客户端窃取…@ol1ver:“有时间限制”代币——这是我的意图。谢谢。我讨厌这样的事实,我不能批准两个答案,所以…:-pGood points,尽管就像你说的那样,这并不完全安全。因此我必须说,我喜欢ongle的想法,即每次都从http服务器发送有时间限制的代币或其他代币。如果时间允许,这些代币就不会被第三方客户端窃取麻省理工学院有点像2小时…@ol1ver:“限时”代币——这是我的初衷。谢谢。我讨厌我不能批准两个答案,所以…:-p真是个好主意。我没想到。我的意思是它仍然可能被盗,但由于时间敏感性,它会使它从“偷窃”中变得不那么有用.尽管他们只是在这里扮演魔鬼代言人的角色,但显然他们自己可以运行一个程序,每x分钟窃取一次代码(通过假装是客户机)然后插入到他们自己的代码中。但生活并不完美:-p.谢谢!实际上,我可以通过在前端http服务器+客户端IP地址上构建基于某种秘密的令牌来避免这种情况。这意味着我可以检查,令牌是否真的是最近生成的,并且是为提出请求的客户端生成的!!除了时间感之外您可以考虑浏览器用户代理和IP地址的一部分(可能只是B类部分)。记住,大型代理服务器(例如,公司)后面的用户可能会在请求之间呈现不同的IP地址。