Python 如何保护我在应用程序中拨打的REST电话?

Python 如何保护我在应用程序中拨打的REST电话?,python,google-app-engine,rest,restful-authentication,tipfy,Python,Google App Engine,Rest,Restful Authentication,Tipfy,我有一个具有“私有”RESTAPI的应用程序;从我自己的网页进行Ajax调用时,我使用RESTful URL。然而,这是不安全的,任何人如果知道URL模式都可以进行相同的调用 保护这些调用的最佳(或标准)方法是什么?如果我打算在将来发布一个API,那么现在就看类似OAuth的东西是否值得,还是将两种不同的策略混合在一起 我正在使用用于Python和Tipfy的Google应用程序引擎 OAuth在您当前的场景()中可能有些过分,因为它被设计为授权第三方服务访问用户的资源 通过授权用户保护AJAX

我有一个具有“私有”RESTAPI的应用程序;从我自己的网页进行Ajax调用时,我使用RESTful URL。然而,这是不安全的,任何人如果知道URL模式都可以进行相同的调用

保护这些调用的最佳(或标准)方法是什么?如果我打算在将来发布一个API,那么现在就看类似OAuth的东西是否值得,还是将两种不同的策略混合在一起


我正在使用用于Python和Tipfy的Google应用程序引擎

OAuth在您当前的场景()中可能有些过分,因为它被设计为授权第三方服务访问用户的资源

通过授权用户保护AJAX请求 AFAICT,您控制客户端、资源和身份验证;因此,您只需要保护对URL的访问,并可能通过SSL保护客户端和服务器之间的通信[2]

因此,请使用技巧保护您的URL:

from tipfy import RequestHandler, Response
from tipfy.ext.auth import AppEngineAuthMixin, user_required

class MyHandler(RequestHandler, AppEngineAuthMixin):
    @user_required
    def get(self, **kwargs):
        return Response('Only logged in users can see this page.')
在没有授权用户的情况下保护AJAX请求
如果用户是未知的,那么可以应用CSRF预防来帮助保护REST服务不被“未经授权”的客户端调用。Tipfy内置了这一功能,但它不是AJAX。相反,可以使用将“真实性令牌”应用于所有需要在服务器上验证的呼叫。

请务必查看

它正迅速成为保护RESTAPI的“事实上”标准,许多大公司都在使用它,包括,仅举几个例子

对于GAE上的Python,您有两个选项:

最直接的方法(IMHO)是使用David Larlet的库来获取BitBucket上的可用数据

但是由于您没有使用Django,也许您想看看GitHub上提供的库,它被认为是最新的、经过单元测试的用于Python 2.4+的OAuth实现


不管怎样,我认为使用OAuth比使用自己的服务安全解决方案要好得多

保护javascript客户端几乎是不可能的;在服务器上,您没有简单的方法来区分使用web浏览器的用户和精心编制的脚本

SSL通过导线加密数据,但在边缘解密,所以这没有帮助。它防止中间人攻击,但不验证原始客户端的合法性

OAuth有助于保护两台服务器之间的请求,但对于Javascript客户端来说,它并没有真正的帮助:任何阅读Javascript代码的人都可以找到您的用户密钥/机密,然后他们就可以伪造签名请求

您可以做一些事情来缓解API刮取:

  • 当有人访问您的网站时生成短期会话cookie。需要有效的会话cookie来调用REST API
  • 生成短期请求令牌,并将其包含在您的网站HTML中;在每个API请求中需要一个有效的请求令牌
  • 要求您网站的用户登录(谷歌账户/OpenID);在处理API请求之前检查验证cookie
  • 速率限制API请求。如果在短时间内看到来自一个客户端的请求过多,请阻止它们

如果您要使用OAuth,您可能应该使用OAuth 2.0——为什么要从您自己的网页到您自己的“私有”REST API使用OAuth?@Erick网页是客户端,服务器是资源提供者。谢谢,Erick。唯一的问题是,即使没有人登录,我也需要使用Ajax。Tipfy是否还有其他装饰师可以实现此目的?@Wraith,如何识别有效用户和无效用户?任何人都可以使用网站的基本功能,但有些功能受到限制。当需要一个有效的登录用户时,使用decorator是明确的,但我仍然为匿名用户使用Ajax。我唯一能想到的是,使用tipfy会话扩展中的“secret_key”功能来创建某种哈希验证,以确保调用来自您的Ajax应用程序。谢谢大家的输入。我选择OAuth是因为它是标准的,现在和将来都将为我服务。