我有一个挑战,即实现一个相对非技术客户使用的API–将一些示例代码粘贴到他们的WordPress或本地PHP站点可能就是我们所要求的。 要求他们在他们的服务器上安装SSL不会发生。 所以我正在寻求一种简单而安全的方式来validationAPI客户端。
OAuth是明显的解决scheme,但我不认为它通过了“简单”的testing。
添加一个客户端ID和散列的秘密作为参数的请求更接近 – 这不是很难做md5($secret . $client_id)或任何PHP将是。
在我看来,如果客户端请求可以使用与SSH公钥相同的方法(客户端从我们的服务器给我们一个密钥,那么应该有一些神奇的作用,使所有后续事务透明地工作,就像普通的HTTP API请求一样。
我仍然在工作(显然:-),所以如果我是一个白痴,这将是很高兴知道为什么。
谢谢!
如果您正在托pipe服务,那么您可以在您身边设置SSL。 有几个选项来validation客户端。
类似于SSH公钥的东西是SSL客户端证书authentication(也称为2路SSL)。
它的一个相当大的话题,是你的API纯粹基于web吗? 为什么SSL太难了? 如果你想要自动化客户端的可信通信并保证不可否认性,那么你需要SSL。 如果您的API是从用户会话访问的,您是否可以实现2因素身份validation。 使用类似RSA令牌的东西,或者甚至如果他们有智能手机的谷歌身份validation。
最简单的方法是,您可以启用HTTP基本身份validation。 假设您已经在您的服务器上启用了HTTPS,并确保客户端configuration了https:// URI( 避免依赖自动redirect ,事实上尤其是使用HTTP Basic)。 只要给每个注册的客户端一个用户名和密码。
大多数客户应该支持这种forms的authentication。 如果您的客户端是PHP服务器, 则应该设置CURLOPT_USERPWD参数 。
使用API密钥(例如基于某个UUID)作为某些API的查询参数也很常见。 这是多么方便可能取决于你的代码的一面。 总的来说,就安全性而言,它基本等同于基本用户名/密码(除了您可能必须将密钥映射到用户名外)。
如果您想使用公钥authentication,请使用SSL / TLS客户端证书。 这是更多的参与。 您可能需要为此创build自己的CA(这可以通过在用户的浏览器中完成密钥生成的方式来完成),但这仍然不方便。 1
缺点是用户可能必须将证书从一种格式转换为另一种格式才能使用。
无论哪种方式,如果您使用SSL,并希望他们粘贴一些PHP / Curl代码,他们可能仍然需要做一些configuration。 至less, CURLOPT_SSL_VERIFYPEER应为TRUE , CURLOPT_SSL_VERIFYHOST应为2 (默认值), CURLOPT_CAPATH应指向包含其可信CA证书的目录。 这可能取决于他们的主机。
1 也可以将一个SSH RSA密钥变成一个自签名的X.509证书,但这是相当技术性的(也需要一些工作)。 在HTTP之上的其他公钥authentication机制(可能基于SSH密钥)将由您来创build,这通常是一个坏主意(很难自行获得)。 这当然是不值得的,因为HTTPS客户端身份validation会为您提供经过validation的事情,并且已经被现有的库支持。
我认为你能做的就是使用Diffie Hellman来创build基于公钥/私钥对的共享密钥。 我使用了类似的方法; 我认为,如果您试图从多个来源控制对您的API的授权,则此方法可以正常工作。