使用 API 密钥保护我的 API
Secure my API with an API key
我正在构建自己的 API,它被以下人使用:
1) Android 应用程序
2) 桌面应用
我的一个网址是这样的:http://api.chatapp.info/order_api/files/getbeers.php 我的用户通过 JSON 从我的数据库中获取数据。我最近在考虑使用 API 密钥创建身份验证。
关于如何做的任何想法?或者我是否必须执行 http://api.chatapp.info/order_api/files/getbeers.php?api_key= 之类的操作,然后将 GET 方法与存储在我的数据库中的某些密钥进行比较?
有什么想法吗?
OAuth 是一个复杂的协议,通过谷歌搜索和阅读文档可以更好地了解它,但这可能是保护 API 端点的一个不错的选择。
简而言之,OAuth 是一种让用户获得对您的 API 的访问权限的方式,方法是证明他们被允许访问,然后使用您提供的安全 "access token"。
客户端通过传递 "api-key" 和某种 "secret key" 从 API 服务器请求访问令牌。这些是在您的 API 用户注册使用您的 API.
时提供给他们的
如果从客户端传递给 API 服务器的凭据是正确的,则 API 服务器会响应 "access token"。此访问令牌在一定时间内有效,应与所有后续请求一起发送,以证明客户端已获得使用 API.
的访问权限
客户端向您的 API 服务器发出 API 数据请求,并且必须包含 "access token"。如果包含 "access token" 并且仍然有效(即尚未过期),那么您可以使用他们请求的数据进行响应。
这里有一些资源链接,可帮助您了解如何在 API 中实施 OAuth。
http://scottksmith.com/blog/2014/07/02/beer-locker-building-a-restful-api-with-node-oauth2-server/
http://www.devx.com/webdev/create-your-own-rest-api-using-oauth-authentication.html
请参阅 this link 比较 OAuth 1.0 和 OAuth 2.0,以确定哪种更适合您的情况。
如果您需要对用户进行身份验证,那么我会选择 Oauth。如果不是,则将请求参数的加密校验和添加到自定义请求 header.
正如@mike 提到的,OAuth 很复杂 API,更重要的是需要第三个服务端点 运行 在某处提供 authentication/authorization 访问。
一个人认为您肯定不想做的是在 URL 中包含 API 键。这很容易重播 and/or 被代理欺骗和识别并在日志文件中捕获。更好的解决方案是在您的请求中包含 API 密钥作为附加 HTTP header,并在您的 API 端点中查找该特定值。
对于像您建议的简单用例,您可能会发现使用您作为 Android 应用程序和API 端点。如果你走这条路,它不容易改变,如果受到损害意味着一个真正的 PITA 来启用和就位新密钥。
如果您使用 "shared secret",那么我建议让用户相对容易地(或至少有一些 UI)更新该密钥,以防它被泄露。我假设您可以相当轻松地更新您的网络服务。此过程不如 OAuth 或 OAuth2 安全,但实施起来绝对更简单、更快速,同时仍提供合理的 "security" 级别(在这种情况下,安全性意味着 "you're allowed to access this API")。
我正在构建自己的 API,它被以下人使用:
1) Android 应用程序 2) 桌面应用
我的一个网址是这样的:http://api.chatapp.info/order_api/files/getbeers.php 我的用户通过 JSON 从我的数据库中获取数据。我最近在考虑使用 API 密钥创建身份验证。
关于如何做的任何想法?或者我是否必须执行 http://api.chatapp.info/order_api/files/getbeers.php?api_key= 之类的操作,然后将 GET 方法与存储在我的数据库中的某些密钥进行比较?
有什么想法吗?
OAuth 是一个复杂的协议,通过谷歌搜索和阅读文档可以更好地了解它,但这可能是保护 API 端点的一个不错的选择。
简而言之,OAuth 是一种让用户获得对您的 API 的访问权限的方式,方法是证明他们被允许访问,然后使用您提供的安全 "access token"。
客户端通过传递 "api-key" 和某种 "secret key" 从 API 服务器请求访问令牌。这些是在您的 API 用户注册使用您的 API.
时提供给他们的
如果从客户端传递给 API 服务器的凭据是正确的,则 API 服务器会响应 "access token"。此访问令牌在一定时间内有效,应与所有后续请求一起发送,以证明客户端已获得使用 API.
的访问权限
客户端向您的 API 服务器发出 API 数据请求,并且必须包含 "access token"。如果包含 "access token" 并且仍然有效(即尚未过期),那么您可以使用他们请求的数据进行响应。
这里有一些资源链接,可帮助您了解如何在 API 中实施 OAuth。
http://scottksmith.com/blog/2014/07/02/beer-locker-building-a-restful-api-with-node-oauth2-server/ http://www.devx.com/webdev/create-your-own-rest-api-using-oauth-authentication.html
请参阅 this link 比较 OAuth 1.0 和 OAuth 2.0,以确定哪种更适合您的情况。
如果您需要对用户进行身份验证,那么我会选择 Oauth。如果不是,则将请求参数的加密校验和添加到自定义请求 header.
正如@mike 提到的,OAuth 很复杂 API,更重要的是需要第三个服务端点 运行 在某处提供 authentication/authorization 访问。
一个人认为您肯定不想做的是在 URL 中包含 API 键。这很容易重播 and/or 被代理欺骗和识别并在日志文件中捕获。更好的解决方案是在您的请求中包含 API 密钥作为附加 HTTP header,并在您的 API 端点中查找该特定值。
对于像您建议的简单用例,您可能会发现使用您作为 Android 应用程序和API 端点。如果你走这条路,它不容易改变,如果受到损害意味着一个真正的 PITA 来启用和就位新密钥。
如果您使用 "shared secret",那么我建议让用户相对容易地(或至少有一些 UI)更新该密钥,以防它被泄露。我假设您可以相当轻松地更新您的网络服务。此过程不如 OAuth 或 OAuth2 安全,但实施起来绝对更简单、更快速,同时仍提供合理的 "security" 级别(在这种情况下,安全性意味着 "you're allowed to access this API")。