根据@Veraticus对此question的回答,Web身份验证框架将current_user的ID保存在会话ID 中,以便快速轻松地从数据库中检索用户(无需每次使用数据库上的新查询来提取用户。)
这很好,因为它正是我想用我自己的服务器做的(出于性能原因),通过我正在编写的API。
但我想知道会话ID ...我的意思是,如果服务器处理会话,客户端必须向他提供会话ID 。
但是,我也想知道另一件事:一般来说,Web API使用 API密钥(例如,https://api-docs.heroku.com/)。使用 API密钥和会话ID 对于客户来说可能很复杂......
我希望Heroku不会在每个HTTP请求中使用收到的auth-token执行数据库查询。但如果他们不这样做,他们如何在没有会话ID 的情况下对用户进行身份验证?
我很困惑。非常感谢您的任何想法。
答案 0 :(得分:3)
会话和身份验证令牌/ API密钥是非常不同的身份验证方法,可以用于不同的用例。
会话最常用于HTML网站,例如,用户通过服务器进行一次身份验证(通常通过提供用户名和密码),然后浏览网站而无需重新进行身份验证在每一个要求。这对服务器有要求,服务器需要能够维护会话状态并将其存储在内存中,以及客户端需要能够存储会话ID(通常在cookie中)并在每次存在时呈现请求。
Auth令牌/ API密钥可被视为更轻量级,因为请求之间没有状态可维护(服务器是无状态的)。每个操作都是原子的,客户端必须在每次请求时使用令牌/密钥进行身份验证。这种方法更适合通过“程序”而不是用户Web浏览器以编程方式访问服务器资源。
IMO,客户端同时使用两者并不合理。如果用户已经通过会话进行了身份验证,则服务器已经知道谁正在调用它,并且不需要请求额外的API密钥。
OTOH,您的服务器 Web API可以足够智能,可以接受来自客户端的两种形式的身份验证。调用时,它可以检查客户端是否已经建立了会话(在这种情况下,它知道谁在调用它),如果没有,则检查客户端是否正在传递一些API密钥/身份验证令牌并在运行时验证用户。 / p>
要回答您的上一个问题,由于使用密钥或令牌保护的API是无状态的,因此每个呼叫都需要单独进行身份验证。这意味着它需要为每个验证密钥的请求加载有关客户端的信息。通常这些信息存储在数据库中,这可能意味着每次请求都会遇到数据库,除非服务器实现某种缓存以加快速度(Heroku最有可能出现这种情况)。