【问题标题】:How can the authentication be implemented for RESTful web applications?如何为 RESTful Web 应用程序实现身份验证?
【发布时间】:2012-01-16 03:19:24
【问题描述】:

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

我怎样才能做到这一点并确保一切安全(即永远不要以明文形式发送用户名/密码)?我发现了一些“流行语”,例如“HTTP 身份验证”和“会话”,但找不到可靠且清晰的文章来说明如何实现这些内容。

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

【问题讨论】:

    标签: javascript google-app-engine web-applications authorization


    【解决方案1】:

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

    GAE python 上的 Google 帐户/OpenID:http://code.google.com/appengine/docs/python/users/

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

    这样您就拥有了管理用户所需的一切,并且使用 Django,您还可以获得权限框架。

    【讨论】:

    • 我会选择 Google Accounts/OpenID,但我需要用户拥有唯一的显示名称。我可以使用 Google 帐户/OpenID 做到这一点吗?
    • 有分配给用户的唯一标识符。在联合身份验证 (OpenID) 下,谷歌会将用户视为您通过用户 API 获得的任何其他用户。以下是完整文档:code.google.com/appengine/articles/openid.html。请注意,此功能仍处于试验阶段。
    • @Stefan 让用户在第一次登录后选择一个显示名称。
    【解决方案2】:

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

    在网络应用程序中,您通常会在服务器端创建会话并将令牌作为 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。

    【讨论】:

      猜你喜欢
      • 2014-01-15
      • 2010-11-11
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      • 2015-09-17
      • 2018-08-12
      相关资源
      最近更新 更多