【问题标题】:Should Web API server use session id and/or auth-token?Web API 服务器应该使用 session id 和/或 auth-token 吗?
【发布时间】:2012-11-04 03:14:58
【问题描述】:

根据@Veraticus 对此question 的回答,Web 身份验证框架将 current_user 的 ID 保存在 会话 ID 中,以便快速轻松地从数据库中检索用户(无需获取用户每次都对数据库进行新查询)。

这很棒,因为这正是我想通过我正在编写的 API 对我自己的服务器执行的操作(出于性能原因)。

但我想知道 session id...我的意思是,如果服务器处理会话,客户端必须向他提供 session id

不过,我还想知道另一件事:一般来说,Web API 使用 API 密钥(例如,https://api-docs.heroku.com/)。并且使用 API 密钥session id 对于客户端来说可能很复杂...

我希望 Heroku 不会在每个 HTTP 请求中使用收到的 auth-token 执行数据库查询。但如果他们不这样做,他们如何在没有其会话 id 的情况下对用户进行身份验证?

我很困惑。非常感谢您的任何想法。

【问题讨论】:

  • @sergio-tulentsev:为了在第一个 HTTPS 查询时只执行 1 个 SQL 查询,然后其他一些没有 SQL 的 HTTPS 查询,我们如何实现该机制?

标签: ruby-on-rails web-services api rest concurrency


【解决方案1】:

会话和身份验证令牌/API 密钥是非常不同的身份验证方法,服务于不同的用例。

Sessions 最常用于 HTML 网站,例如,用户通过服务器验证一次(通常通过提供用户名和密码),然后浏览网站而无需重新验证自己的每一个要求。这对服务器有要求,它需要能够维护会话状态并将其存储在内存中,以及客户端,它需要能够存储会话 ID(通常在 cookie 中)并在每个请求。

身份验证令牌/API 密钥可以被认为是更轻量级的,因为请求之间没有需要维护的状态(服务器是无状态的)。每个操作几乎都是原子的,客户端必须在每次请求时验证自己(使用令牌/密钥)。这种方法更适合通过“程序”而不是用户网络浏览器以编程方式访问服务器资源。

IMO,客户 同时使用两者并没有什么意义。如果用户已经通过会话进行身份验证,则服务器已经知道是谁在调用它,并且不需要请求额外的 API 密钥。

OTOH,您的 服务器 Web API 可能足够聪明,可以接受来自客户端的两种形式的身份验证。调用时,它可以检查客户端是否已经建立了会话(在这种情况下,它知道谁在调用它),如果没有,则检查客户端是否正在传递一些 API 密钥/身份验证令牌并即时对用户进行身份验证。

回答您最后一个问题,由于使用密钥或令牌保护的 API 是无状态的,因此每个调用都需要单独进行身份验证。这意味着它需要为每个请求加载有关客户端的信息以验证密钥。通常此信息存储在数据库中,因此可能意味着每次请求都会命中数据库,除非服务器实施某种缓存来加快处理速度(Heroku 很可能就是这种情况)。

【讨论】:

  • 感谢您的详细回答,@christophe-l。我想在我的 Sinatra 应用程序中拥有一个像 Heroku 这样的缓存系统。
  • 不客气。我对 Sinatra 不是很熟悉,但 memcached 是一个非常好的与语言无关的缓存系统,它也可以 work with Sinatra
  • 身份验证令牌如何是无状态的?服务器环境是否不需要存储令牌并保存使用该令牌对哪个用户进行身份验证的信息?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
  • 2021-06-25
  • 2019-09-25
  • 2016-03-18
  • 2019-06-07
  • 2015-11-17
  • 2013-05-06
相关资源
最近更新 更多