本页面提供了一些与 API 密钥和身份验证有关的背景信息:它们各自的使用方式、两者之间的区别以及应考虑使用 API 密钥的场景。
API 密钥用于识别项目,身份验证用于识别用户
Cloud Endpoints 同时支持 API 密钥和身份验证(例如 Firebase 或 Auth0)这两种方案。两者之间的主要区别如下:
API 密钥用于识别正在调用 API 的调用方项目(应用或网站)。
身份验证令牌用于识别正在使用应用或网站的用户(人员)。
API 密钥提供项目授权
为了确定哪种方案最合适,您必须了解 API 密钥和身份验证有哪些用途。
API 密钥的用途如下:
项目识别 - 识别正在调用相应 API 的应用或项目
项目授权 - 检查调用方应用是否拥有调用 API 的权限,以及是否已在其项目中启用 API
API 密钥的安全性不及身份验证令牌(请参阅 API 密钥的安全性),但 API 密钥可用于识别调用 API 的应用或项目。它们是在进行调用的项目中生成的,您可以将其用于环境(例如 IP 地址范围或者 Android 或 iOS 应用)。
通过识别调用方项目,您可以使用 API 密钥关联使用信息与相应项目。 借助 API 密钥,Extensible Service Proxy (ESP) 可以拒绝尚未获得访问权限或尚未启用 API 的项目发出的调用请求。用户身份验证
相比之下,身份验证方案通常有两个用途:
用户身份验证 - 安全地验证调用方用户的真实身份是否与宣称的一致。
用户授权 - 检查用户是否应具备发出此请求的权限。
身份验证机制提供了一种安全识别调用方用户的方式。 Endpoints 还会检查身份验证令牌,以验证其是否有权调用 API。然后,API 服务器会根据该身份验证的结果决定是否向请求授权。
如果您需要能够识别正在进行调用的用户,请参阅对用户进行身份验证。
虽然 API 密钥可识别调用方项目,但无法识别调用方用户。例如,如果您创建了一个调用 API 的应用,那么可以使用 API 密钥来识别正在进行调用的应用,但无法使用它识别正在使用该应用的人员的身份。
如果您需要一种更安全的方法来限制哪些项目或服务可以调用您的 API,请参阅服务之间的身份验证。
API 密钥的安全性
人们普遍认为 API 密钥是不安全的;由于客户端通常可以访问 API 密钥,因此 API 密钥很容易被他人窃取。密钥被窃取后,由于没有到期时间,因此可以无限期地使用,除非项目所有者撤消密钥或重新生成密钥。虽然您可以对 API 密钥设置限制以缓解此问题,但也可以考虑使用更好的授权方法。
如需查看示例,请参阅对用户进行身份验证。
何时使用 API 密钥
API 可以将其部分或所有方法限制为要求提供 API 密钥。以下情况适合采用这种做法:
您确实希望屏蔽匿名流量。如果应用开发者需要与 API 提供方合作调试某个问题或显示其应用的使用情况,那么可以使用 API 密钥来识别 API 提供方的应用流量。
您希望控制 API 调用的次数。
您希望识别 API 流量中的使用模式。您可以在 API 和服务中查看应用的使用情况。
您希望按 API 密钥过滤日志。
API 密钥不能用于:
识别具体用户(API 密钥无法用于识别用户,只能用于识别项目)。
安全授权。
识别项目的创建者。
Service Infrastructure 不提供直接通过 API 密钥查找项目的方法。