【问题标题】:How much state can I save in session variables for a web app?我可以在 Web 应用程序的会话变量中保存多少状态?
【发布时间】:2011-12-10 13:06:42
【问题描述】:

我正在为我正在创建的 Web 应用程序编写 REST/RPC API。从我了解到的情况来看,REST 背后的核心理念之一似乎是不维护任何状态。也就是说,我发现自己在做一些事情,比如在服务器端将会话标记为经过身份验证,这感觉就像保存状态。我应该采取这种做法多远?我应该在哪里画线?还有其他一些东西可以非常方便地保存为会话变量的一部分,但我想知道我怎么知道什么时候不应该或不应该这样做。

我希望这是提出这个问题的合适场所。我曾在是否将其发布在程序员中进行了辩论,但这感觉更合适。

更新:

有人告诉我,使用票务系统比使用会话变量来维护身份验证信息等内容要好。有人可以包括并回答对这种票务系统如何工作的高度描述吗?

【问题讨论】:

  • 你考虑过HTTP BASIC认证吗?
  • 是的,但我听说安全性太差了。即凭证以纯文本形式传递。
  • 它的安全性不亚于带有会话的纯 HTML 表单。您还将看到所有请求参数和普通的 cookie。如果您想加密传输,只需使用 HTTPS。

标签: api web-applications rest rpc


【解决方案1】:

您是对的 - REST 调用在理想情况下是无状态的,并且将某些内容存储在会话变量中并将其用于 REST 调用是令人厌恶的。例如,您不能保证 RESTful 客户端甚至可以发送会话变量所需的 cookie 信息。

如果您需要身份验证,那么您应该有返回票证之类的 REST 调用,然后 REST 调用者会将该票证作为另一个调用的一部分发送。

更新 对于票务系统,您通常希望使用相同的身份验证或类似的身份验证系统。例如,如果您需要用户名和密码,您可能希望票证请求 POST。票证是在后续调用中传递的 GUID。服务器上的票可以存储在会话中,也可以存储在数据库中(我通常有一个 TICKETS 表,其中包含到期日期等信息)。

$result = file_get_contents('http://site.com?action=auth&user=matt&password=pass');
// parse $result XML for ticket or auth error
// subsequent calls...
$result = file_get_contents('http://site.com?action=getSomething&ticket=" . $ticket);

QuickBase 以这种方式工作 - 您发送一个带有用户名、密码和 api 应用令牌的 API_Auth 操作,并获得一张票作为回报。然后在后续调用中传递您的 api 应用令牌和票证 - GET 请求和 POST 发送。

【讨论】:

  • 据我所知,在会话变量中保存身份验证状态是相当标准的做法。我这样说有错吗?还是这样做的人不符合 REST?
  • 绝对正确 - 在会话中保存身份验证状态是标准做法。同样真实的是,为 REST 调用执行此操作的人不符合要求。在许多情况下,REST 的目的是使服务器端 API 和 Javascript Ajax API 易于使用。但是,这些类型的调用都不能保证能够处理存储身份验证和其他会话信息的服务器的需求。请改用票务系统。
  • 对于 GET 请求,这种方法是否容易受到中间人攻击?如果有人只是嗅探您发送的网址,他们将能够看到您的勾选并冒充您。
  • GET 和 POST 都容易受到嗅探。我通常使用 POST 来处理这样的事情,它更容易在 GET 请求中显示。我为 Intuit 建立了一个类似 Yammer 的网站,使用 Laconica 作为基础,但原来的 auth 是这样的 GET。我使它基于 SSL、POST 和票证以更好地保护它。 SSL GET 与 SSL POST 一样安全——两者都使用公共站点密钥进行加密。只有从域服务器检索到的 IP 地址是“明文”。
猜你喜欢
  • 1970-01-01
  • 2014-06-30
  • 2021-01-14
  • 1970-01-01
  • 2014-09-18
  • 2013-12-23
  • 2019-10-28
  • 1970-01-01
  • 2012-04-30
相关资源
最近更新 更多