使用自定义API

时间:2016-07-22 13:16:04

标签: javascript php rest

我正在使用Phonegap / Cordova编写移动应用程序。 移动应用程序需要来自我编写的服务器端应用程序的信息。我创建了一个API来获取这些信息。

API的第一件事就是验证移动应用程序是我编写的应用程序。 它使用公共API密钥和秘密API密钥执行此操作。 (它们用于生成授权标头)。

在移动应用程序和服务器端应用程序上生成授权标头,服务器将检查它们是否存在差异。

它是这样的:

移动应用程序(Javascript / jQuery)

var SIGNATURE = SHA512( MY_APP + MY_PUBLIC_API_KEY + TIMESTAMP + NONCE + MY_SECRET_API_KEY );
var auth = "path=MY_APP,key=MY_PUBLIC_API_KEY,time=TIMESTAMP,nonce=NONCE,signature=SIGNATURE"
$.ajax( { 
    type = "POST", 
    url: url, 
    headers : {
        "Authorization" : auth
    }
} );

服务器端(PHP)

// there is some regex to "decode" the auth header
// now, recreate the signature from the public variables in the auth header and check for a match (note: this includes fetching the secret from an xml file as it is not in the public information)

问题显然在于我需要秘密API密钥才能在客户端生成签名。

在网上阅读文章后,很多人都说将这个秘密存储在服务器上(然后使用服务器作为中介),但我相信只有在你使用第三方API时才适用。 这也只是将问题从客户端移开。是什么阻止了某人打电话给中间人,无论如何这只是秘密?

一个非常类似的解决方案是将密钥存储在服务器上并在应用加载时获取它,但肯定是同样的问题......什么阻止某人简单地转到api.mydomain.com/getsecretkey

在客户端存储秘密是不可行的。特别是有了phonegap。人们如何做到这一点?

感谢任何和所有帮助。

2 个答案:

答案 0 :(得分:0)

在服务器上,您可以先检测“身份验证”数据,例如检查所需的基本数据,用户代理等。

其次,尝试加密您的数据,您可以首先使用app secret来获取服务器的新密钥(用于下一个会话),然后使用已接受的新密钥作为下一个加密密钥。 建议端到端加密。

JWT.io图书馆可以帮助解决这些问题。 https://jwt.io/

如果这些要求不符合,您的服务器可能会拒绝连接或发送错误代码。

答案 1 :(得分:0)

我认为这里的底线只是:“你不能这样做。”该工作正在用户的机器上完成,使用机器上也存在的代码。因此,坚定的小偷可以辨别出你所有的“秘密”,而你无能为力。

可以向您的主机添加各种形式的支票,只需查找每个请求中必须存在的内容,并拒绝回复(即使,“只需删除数据包“)如果没有这个特性。例如,这将允许您忽略某些脚本小子的机器人向您抛出的“垃圾”请求:他们必须拥有您的客户端应用程序的副本,以便弄清楚如何表达他们的消息正确,这自然意味着“一个更坚定,不太随意的小偷。” (互联网上的许多攻击者只是试图制造噪音并造成恶作剧,而且(恕我直言)值得做一些事情让你快速忽略这些事情。)