我不建议使用基本身份验证进行 API 身份验证。当涉及到身份验证时,您应该考虑应用程序(客户端)开发人员也必须实现其身份验证方面。其中一部分不仅是身份验证本身,还包括如何获取凭据,甚至更多。
我建议使用已建立的身份验证标准,该标准随最流行的编程语言的客户端库一起提供。这些库使开发人员更有可能调整您的 API,因为它们减少了客户端的实现工作。
使用身份验证标准的另一个重要原因是它们使开发人员(和其他人)对您的身份验证系统的安全性更有信心。这些标准已经过专家审核,它们的弱点和优势是众所周知的并记录在案。除非您是安全专家,否则您不太可能开发出几乎一样可靠的身份验证流程 :-)。
该领域最成熟的标准是OAuth,但您可以通过搜索“oauth Alternatives”找到替代品。
OAuth 如何帮助您解决问题?
在 OAuth 2 中,应用程序客户端必须在访问任何受保护的资源之前为用户获取访问令牌。要获取访问令牌,应用程序必须使用其应用程序凭据对自己进行身份验证。根据用例(例如,第 3 方、移动设备),这可以通过 OAuth 标准定义的不同方式完成。
访问令牌不仅应该代表用户,还应该代表哪些操作可以用于哪些资源(权限)。用户可以向不同的应用程序授予不同的权限,因此必须以某种方式将这些信息链接到令牌。
然而,如何为访问令牌实现这种语义并不是 OAuth 的一部分——它只是定义了如何获取访问令牌的流程。因此,访问令牌语义的实现通常是特定于应用程序的。
创建访问令牌时,您可以通过在后端存储访问令牌及其权限之间的链接来实现此类令牌语义。可以为每个用户-应用程序组合存储权限,也可以为每个应用程序存储权限,具体取决于您希望事情的精细程度。
然后,每次 API 处理访问令牌时,您都会获取此信息并检查用户是否有足够的权限来访问资源并执行所需的操作。
另一种选择是将权限信息放入访问令牌中并对令牌进行签名或加密。当您收到访问令牌时,您将对其进行验证或解密,并使用存储在访问令牌中的权限做出决定。您可能想看看Json Web Tokens (JWT)如何实现这一点。
后一种解决方案的好处是在后端实现过程中具有更好的可扩展性和更少的工作量。它的缺点是可能更大的请求(尤其是使用 RSA 加密)和对令牌的控制较少。