面向客户端的 REST API 身份验证

Posted

技术标签:

【中文标题】面向客户端的 REST API 身份验证【英文标题】:Client Facing REST API Authentication 【发布时间】:2013-01-20 14:56:42 【问题描述】:

我看过很多关于验证 RESTful API 的不同解决方案的不同帖子,鉴于当前的情况,我有一些问题。

我已经构建了一个 REST API,它允许我的软件服务的客户(我们是一家 B2B 公司)以编程方式访问资源。现在我已经让 API 正常工作,我想以最标准化的方式保护它。我需要根据 API 的调用者允许访问某些资源。也就是说,并非所有 API 的用户都可以访问所有资源。

我有以下格式的 URL:

https://mydomain/api/students
https://mydomain/api/students/s123
https://mydomain/api/students/s123/classes
https://mydomain/api/students/s123/classes/c456

到目前为止,我已经想出了这些可能的解决方案:

    为每个客户端提供一个唯一密钥,他们可以使用该密钥最终生成一个加密令牌,该令牌将在每次 REST 调用结束时作为 GET 参数传递,以(重新)验证每个请求。这种方法是不是太贵了

    https://mydomain.com/api/students/s123?token=abc123

    在 HTTP 授权标头中提供一个值,如 here 所示。这和#1几乎一样吗? (除了我无法将 URL 粘贴到浏览器中)人们不再使用这些标头了吗?

    使用 OAuth 2(我还不清楚)。 OAuth 2 是否真的将客户端验证为登录用户?这难道不违背 REST API 无状态的精神吗?我希望 OAuth 对我来说是正确的解决方案(因为它是一个公共标准),但是在阅读了一点之后,我不太确定。 REST API 调用是否矫枉过正和/或不当?

我的目标是提供一个无需为每个想要使用该 API 的客户更改的 API,而是我可以提供一个可供所有客户使用的标准文档。

如果我不清楚,我很乐意发布更多详细信息。

【问题讨论】:

【参考方案1】:

您可能要准备 API 的客户端有 2 种类型:

受信任的客户 - 由您编写。他们可以拥有实际用户的用户名和密码,并且可以在每次请求时将该数据发送到您的服务器,可能在 HTTP auth 标头中。您所需要的只是他们的加密连接。

第 3 方客户端 - 由一些随机开发人员编写。您可以在您的服务中注册它们并为它们中的每一个添加一个唯一的 API 密钥。之后,如果用户想要使用他们的服务,您必须向她显示一个提示,在该提示中她可以允许访问 3rd 方客户端。之后,第三方客户端将被分配给具有给定权限的用户帐户,并将获得用户特定的访问令牌。因此,当客户端将其 API 密钥和用户特定令牌与请求一起发送时,它会以用户的名义发送请求。

OAuth 可以帮助您控制第二种情况。

您的网址对客户没有任何意义。通过 REST,您必须通过发送带有语义注释的链接(例如链接关系)来将客户端与 URL 结构分离。因此,您的文档不必包含有关 URL 结构的任何内容(也许它对服务器端调试很有用,但仅此而已)。你必须谈论不同类型的链接。通过在服务器端生成这些链接,您可以检查实际用户(或第 3 方客户端)的权限,并跳过她无权关注的链接。

【讨论】:

以上是关于面向客户端的 REST API 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

REST API 的身份管理和身份验证

如何从 android 客户端进行经过身份验证的 django rest api 调用?

与 Keycloak 身份验证插件集成时,无法从 rest 客户端调用 nuxeo rest api

SOA:Rails 多个客户端的用户身份验证和 api 授权

使用邮件和密码通过 REST API [Firebase] 进行身份验证

移动客户端的asp.net Web Api自定义身份验证要求