如何为RESTful web应用程序实现身份验证

How can the authentication be implemented for RESTful web applications?

本文关键字:应用程序 实现 身份验证 web RESTful      更新时间:2023-09-26

我正在编写一个web应用程序在JavaScript(客户端)和Python/谷歌应用程序引擎(服务),我希望用户添加他们的数据。我创建了一个欢迎页面,将有登录/注册框。在输入正确的用户名/密码后,我希望用户被授权,然后转发到web应用程序页面,并使用户发送AJAX请求到指定用户id的RESTful服务,即(host/{userid}/some_resource) -并在服务端确保用户被授权。

我怎样才能做到这一点,并使一切安全(即永远不要发送用户名/密码在明文)?我发现了一些"流行词",如"HTTP身份验证"answers"会话",但无法找到一篇可靠而清晰的文章来实现这些东西。

我也想知道不同的流行网站如何处理授权(即GMail通过HTTPS工作;Stackoverflow和Facebook似乎使用HTTP)。

我不喜欢重新发明轮子,所以我建议您要么使用GAE内置的Google Accounts(或OpenID)集成,要么使用Django用户身份验证。

Google Accounts/OpenID on GAE python: http://code.google.com/appengine/docs/python/users/

Django authentication: https://docs.djangoproject.com/en/dev/topics/auth/

这样你就有了管理用户所需的一切,并且在Django中,你还得到了权限框架

基本上你想要的是一个会话。当用户登录时,服务器向他们返回一个唯一的令牌,该令牌指定系统中的会话或用户。每当用户发出后续请求时,他们都会传回令牌,以便服务器可以检查它并确保用户被允许执行他们试图执行的任何操作。

在web应用程序中,您通常在服务器端创建会话并将令牌作为cookie传回。用户浏览器将在每次请求时自动将此令牌发送到服务器,以便服务器可以看到用户已经过身份验证。这就是Gmail、Stack Overflow和Facebook(以及几乎所有网站)所做的。

如果你想在GAE上使用cookie,你可以使用内置的Google用户系统,它会自动创建会话和cookie,你所要做的就是使用用户API来找出谁登录了(参见GAE文档中的用户示例)。如果您不想使用Google用户系统(因为您不想要求您的用户拥有Google帐户),您可以使用自己的会话系统或使用已建立的库,例如GAE-Sessions (https://github.com/dound/gae-sessions)。在那个网站上有一些关于如何使用它的示例代码。

旁白:不被web浏览器严格使用的RESTful api通常不使用cookie进行身份验证。它们要么预先为每个用户创建一个令牌(在创建用户时),要么在用户登录时(在对登录请求的响应中传递令牌),然后用户在请求中将该令牌作为参数或HTTP头传递回服务器。

在上述两种情况下,您可以通过HTTPS登录,其余的操作通过HTTP进行,并且无需任何额外的努力就可以工作,但是从客户端传递到服务器的令牌将通过HTTP不安全发送,这是不好的。许多会话系统会跟踪会话所属的IP地址,所以如果有人试图通过复制他们的令牌来劫持会话,他们就无法进入,但是,除非你有很好的理由不这样做,否则你应该使用HTTPS。