区分已登录和未登录的公共REST API

问题描述 投票:0回答:1

我正在考虑创建一个身份验证流程。有一些本质上是公共的api(不需要进行身份验证,但是如果用户登录,我希望能够进行个性化设置),并且某些api受保护。

我了解如何构建受保护的api,以及在那里返回什么状态代码。

但是,我不确定是否应该将信息发送给用户未登录的公共api的客户端?如果是这样,发送此信息的正确方法是所有人都可以访问api,但用户未登录vs用户已登录?

我正在使用基于访问和刷新令牌的身份验证机制来保护我的api。我可以想到两种方法,但不确定哪种方法更好:

  1. 如果将访问令牌传递给公共api,我将像私有api一样验证令牌,如果无效则返回401,如果有效则返回200。然后,客户端尝试生成新的访问令牌,如果用户注销,它将失败。现在,客户端尝试不使用访问令牌的api调用,并且由于api是公共的,因此将执行逻辑并返回响应。在这种方法中,客户知道他已注销,因为他没有有效的访问令牌。但是,每次访问令牌不再有效时都会进行额外的调用(由于访问令牌的寿命很短,因此可能会发生很多)

  2. 万一令牌无效,我仍然执行代码并返回结果,但是以某种方式使客户端知道访问令牌不再有效。在这种方法中,没有多余的网络呼叫,并且如果客户端可以通过标准方法理解响应,则他也可以知道访问令牌不再有效。但是,在这种情况下,由于令牌不再有效,因此我无法假定用户已登录并进行个性化设置。

哪种方法是最好的,推荐的做法是什么?还是还有其他我完全不了解的方法。

任何帮助将不胜感激。

api rest security authentication
1个回答
0
投票

您的公共API应该具有2个变体:个性化和非个性化。让客户端软件决定是否要个性化。

这并不一定意味着每个调用都有2个端点,您可以添加?personalized=true查询参数。重要的部分是决定权在客户端上:客户端必须知道是否已登录,并且客户端必须请求个性化响应(并添加其访问令牌)。

这意味着当API是公共的并且调用了非个性化的变体时,您不会返回401未经授权,但是在所有其他情况下,您都将返回401。


有多个理由将决定提交给客户:

首先,客户端的复杂性:您不希望仅因为客户端已登录就希望获得个性化内容而进入API。客户端将登录,但会话超时时其调用不会失败,因此它会期待个性化的内容,并且不会出现。您可以例如添加响应头,但是对于客户端来说,以通常的HTTP方式处理未实现的期望要容易得多-状态码。

第二,服务器复杂度:在某个时候,已登录的客户端将需要非个性化的内容。这可能容易实现,也可能很难实现,这取决于您有多少服务器代码做出了上述假设。

最后,灵活性:您可能有一个Web客户端。您可能有一个移动客户端。客户可能根本不与人互动。客户可能更关心效率,而不是关注个性化。客户端可能想要avoid专业化,但出于其他原因仍然提供登录选项。您已经公开了两种实现,让客户端选择。


关于呼叫数量,假设这与效率有关,在几乎所有情况下,客户端都可以轻松知道客户端是否已登录。会话当然会超时,但是这种情况通常不值得优化。

© www.soinside.com 2019 - 2024. All rights reserved.