Web API 服务器应该使用会话 ID 和/或身份验证令牌吗?

Dou*_*oug 2 api rest concurrency web-services ruby-on-rails

根据@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 的情况下对用户进行身份验证?

我糊涂了。非常感谢您的任何想法。

Chr*_*e L 5

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

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

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

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

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

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