如何验证 api 对我的 api 的访问权限?

How do I verify an api's access to my api?

我正在构建一个 api,我们称之为 CommonApi,其他 API 将使用它。对于此示例,假设我们有一个应用程序,其前端使用 superNewTrendyFrameworkThatsTheBest.js 和 WebApi 后端,我们将其称为 AppApi。我们正在使用我们的 IDP 提供的 MS Identity。

因此,应用程序将使用自己的 api、AppApi 调用 IDP 并对用户进行身份验证,通过声明获取所有角色和权限,以及访问令牌以继续使用 AppApi 和它作为守门人的所有光荣资源。

现在,我有点卡住的部分是在用户已经通过身份验证后我如何访问 CommonApi。我已经拥有来自 IDP 的访问令牌(可能是 JWT)以及所有角色和权限。我需要检查 AppApi 是否 允许 访问 CommonApi,但我还想在每次调用 CommonApi 时检查数据库或再次调用 IDP,如果可以避免的话.

是否应该有第二个令牌来访问 CommonApi?如果可能的话,我想避免这种情况,但如果那是最好的方式,那就是我会做的。我不是在寻找特定于技术的解决方案——库、中间件等,而是对我应该做什么的理解。

我认为你只是从错误的角度看问题。正确的观点应该会消除你的困惑。

其他 API 正在访问您的 API 这一事实无关紧要。归根结底,您的 API 服务于 客户 ,您只需要知道某个客户正在访问您的 API。那可能是另一个 API、一个用户、一个控制台应用程序、一项服务,等等。没关系。

该客户需要获得授权才能使用您的应用程序。获得授权的身份验证方法可能因客户端而异,但都实现了相同的目标。例如,另一个 API 之类的东西很可能会通过客户端身份验证(id/key 对)进行身份验证。在这里,您授权 客户端 ,因此如果该客户端代表特定用户,他们将需要单独作为该用户进行身份验证(通常通过 OAuth)。或者,如果另一个 API 专门为特定用户工作,则整个过程可以简单地通过 OAuth 实现(即客户端本身不进行身份验证,而是该客户端的用户通过客户端提供的 OAuth 工作流进行身份验证. 在任何一种情况下,客户端最终都会获得一个身份验证令牌,然后他们可以将其与进一步的请求一起发送以授权该请求。

重要的部分是授权令牌。无论采用何种认证方式,都会给出一个认证令牌,那个就是用来授权请求​​的。

基于您在此处展示的情景。最有可能的做法是 AppApi 应该通过客户端身份验证与 CommonApi 进行身份验证(它将被分配一个客户端 ID 和一个客户端密码,并将其发送到 CommonApi 上的端点以获取访问令牌。然后它将使用 那个 访问令牌授权对 CommonApi 的所有请求。该网站的用户将对该网站进行身份验证并与 AppApi 进行交互该身份验证,但这应该与 CommonApi 发生的任何事情无关。一个例外是如果 AppApi 冒充 [=11= 的用户]。例如,我可能有一个 API 在 Facebook 上做一些事情。如果我需要通过 API 作为特定用户做类似 post 的事情,那么用户需要API 通过 OAuth 工作流直接向 Facebook 进行身份验证。之后,API 被授予访问令牌以代表用户执行操作。