验证 API 的不同方法
HTTP 基本身份验证
API 密钥🔑
基于 OAuth 令牌的身份验证🔐
结论⛳
您可能喜欢的其他文章😊
每当我们设计需要对 API 访问进行身份验证的安全系统时,您都必须考虑您的应用程序和用户应该如何进行自我身份验证。
在本文中,我们将讨论实现此目标的三种不同方法:
我们还将研究所有这些方法的优点和缺点。
HTTP 基本身份验证
基本身份验证 (Basic Auth) 是使用预定义用户名和密码进行身份验证的最简单方法之一。此技术使用名为 Authorization 的标头,其中包含用户名和密码的 base64 编码表示。
使用用户名和密码进行基本身份验证的简单请求如下所示:
GET / HTTP/1.1
Host: api.xyz.com
Authorization: Basic XGFuaAVsOnbHc3M3b32Jl
通常不建议使用基本身份验证来验证用户身份,因为为每个请求发送用户凭据是一种不好的做法。
好处:
HTTP Basic Auth 易于使用和实现,可作为服务器到服务器环境中应用程序的良好身份验证。
缺点:
当用户通过身份验证时,应用程序需要收集密码。从用户的角度来看,不可能知道应用程序如何处理密码。应用程序将获得帐户的完全访问权限,并且用户除了更改密码之外没有其他方法可以撤销访问权限。
API 密钥🔑
API 密钥是一种无需引用实际用户即可对访问任何 API 的应用程序进行身份验证的方法。应用程序会将密钥添加到每个 API 请求中,API 可以使用该密钥识别应用程序并授权请求。您还可以使用密钥执行诸如速率限制之类的操作。
一些 API 使用查询参数来发送/接收 API 密钥,一些使用标头,一些使用正文参数。
例如,带有查询参数的 API 密钥将如下所示:
curl -X POST https://language.googleapis.com/v1/blablabla?key=API_KEY
虽然我通常更喜欢在自定义标头中发送 API 密钥,如下所示:
curl https://api.xyz.com/v1/blablabla \
-H "Content-Type:application/json" \
-H "X-Auth-Key:1234567893feefc5f0q5000bfo0c38d90bbeb"
(此处 -H 表示该字段位于标题内部)
要了解有关 curl 的更多信息,请阅读此处👉什么是 cURL?
好处:
客户和开发者使用 API 密钥相对容易。在 API 请求中添加密钥也非常简单。
缺点:
API 密钥仅标识应用程序,而非应用程序的用户。密钥很难保密。对于服务器到服务器的通信,可以隐藏密钥并限制访问权限,使其仅在后端场景中使用。但是,在客户端向服务器发出请求的情况下,如果应用程序的安全性不充分,密钥可能会泄露。
基于 OAuth 令牌的身份验证🔐
基于令牌的 API 是基于这样的理念:所有需要访问 API 的服务都会收到一个令牌,作为应用被允许调用该服务的证明。该令牌由应用程序和服务都信任的第三方颁发。
获取这些令牌的最流行协议是 OAuth 2.0,在 RFC 6749 中指定。
OAuth 指定了一种机制,应用程序可以代表用户向用户请求访问服务,并接收令牌作为用户同意的证明。
这种方法可以实现更好的身份验证,应用程序必须事先发布一个授权服务器 (AS),负责颁发令牌。该授权服务器还允许第三方应用程序注册并接收凭证,以便其应用程序能够代表用户请求访问权限。
这些是 OAuth 身份验证过程中涉及的过程:
-
用户访问你的应用程序,输入信息
-
应用程序将用户重定向到第三方令牌生成服务。
-
第三方服务返回一个授权码,该授权码包含在重定向 URL 中。这会将用户重定向回应用程序。
-
您的应用程序再次调用该服务并传递可用于通过 API 验证交易的授权令牌。
现在,第三方应用程序可以使用收到的令牌调用 API。令牌将随请求一起发送,方法是将其添加到带有 Bearer 关键字的 Authorization 标头中,如下所示:
GET /XYZ HTTP/1.1
Host api.xyz.com
Authorization: Bearer <your-received-token>
令牌验证
已颁发的令牌可以通过两种方式返回:返回令牌数据的引用,或直接返回令牌的值。对于引用令牌,服务必须向 AS 发送请求以验证令牌并返回与其关联的数据。此过程称为自省,示例响应如下所示:
{
"active": true,
"sub": “username”,
"client_id": "app_id",
"scope": "read"
…
}
根据这些信息,服务可以决定是否允许或拒绝请求。client_id 还可用于应用程序的统计和速率限制。
返回值通常使用 JSON Web Token (JWT) 之类的 token 格式。该 token 可以签名或加密,以便服务端只需使用受信任 AS 的公钥即可验证该 token。
好处:
节省时间 - 从长远来看,这是一种非常节省时间的方法。无论是在线查找新网站,还是返回之前访问过的网站,如果您经常访问的网站支持 OAuth,那么您只需创建一个帐户即可完成大部分在线活动。例如,您可能见过一些网站要求使用 Google/Twitter/Facebook 登录,所有这些网站都在内部使用了 OAuth。
安全性 - OAuth 现在是标准模型,所有 OAuth 数据传输都必须在 SSL(安全套接字层)上进行,以确保使用最受信任的加密行业协议来尽可能保证数据的安全。
缺点:
网络钓鱼 - 如果操作正确,OAuth 应该是安全的,但要求用户快速登录到其他网站的行为可能会让我们疏忽大意,误以为这种做法始终安全。但迄今为止,已发生过许多案例,用户沦为看似诱人的弹出广告的受害者,数据遭到网络钓鱼。
结论⛳
在本文中,我们讨论了三种保护 API 安全的主要方法。这三种方法各有优缺点,但其中最好的是 OAuth,许多行业和企业在处理客户端-服务器场景时都更倾向于使用 OAuth。
但是,对于多个应用程序需要相互通信的情况(即服务器-服务器场景),您仍然可以选择使用基本身份验证和 API 密钥以简化操作。
您可能喜欢的其他文章😊
- 理解线性回归——机器学习中最流行的算法之一,每个数据科学家都应该知道。
- GIT INIT(第 1 部分) ——针对初学者的 GIT 系列。
- 比特币挖矿- 了解比特币挖矿的具体过程。
- 提高时间复杂度——了解如何提高代码的时间复杂度。
- GPT-3 - OpenAI 推出的大型开源先进语言模型,拥有超过 1750 亿个参数。