2

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

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

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

但是,我还想知道另一件事:通常,Web API 使用API 密钥(例如,https://api-docs.heroku.com/)。对于客户端来说,使用API 密钥会话 ID可能会很复杂......

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

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

4

1 回答 1

5

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

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

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

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

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

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

于 2012-11-03T19:14:58.360 回答