API密钥在PHP / MYSQL中的功能

3
关于PHP/MYSQL中的API密钥有一个问题。我已经阅读了很多资料,但仍需要进一步澄清和一些最佳实践指南,因为我只是对HTML、JS、JQUERY、PHP/MYSQL等技术有基础的了解。
我的服务器端代码是PHP,它连接到MYSQL数据库。数据库有一个“users”表,其中存储列如“id”、“username”、“password”(使用PHP5中的password_hash()函数进行加密,不存储明文值)和“api_key”的内容。我还会考虑添加一些其他的内容,例如“last_seen”和“last_login”以提高安全性。
我希望使用API密钥来验证用户访问服务器上的资源(例如parseID.php,该脚本接受POST参数并返回用户输入的ID的JSON结果)。如果需要,用户也可以在脚本中使用此API密钥来访问JSON输出。
我的思路是:
- 已登录用户单击按钮以生成API密钥。 - 脚本生成API密钥(使用password_hash()函数)并将其保存在数据库中与用户ID相关联。 - 当用户想要访问受保护的资源时,他们将提供给定的API密钥作为GET/POST参数(或存储在会话中?),系统将尝试将其与数据库中的密钥进行匹配,并返回结果(认证 vs 非认证)。 - 如果验证成功,则用户可以访问该资源。
我还将使用SSL来加密用户和资源之间的通信。
我有点不清楚,想知道还有哪些步骤/最佳实践可以采取,以确保API密钥和用户信息的安全性?
我在这里和谷歌上搜索到的所有信息都是几年前的,使用MD5等加密方式。
1个回答

2
这是正确的 - API密钥分配给用户,调用需要传递API以验证用户并检查他们可以做什么。
我建议一些更改:
一个已登录的用户点击按钮生成API密钥。
如果用户只能拥有一个API密钥,那么在创建帐户时生成API密钥并在其个人资料/设置区域中提供将更容易,这样会形成一对一的关系而不是一对零或一对一。您想要按需生成它的唯一原因是如果您必须通过某些审核过程明确授权。
无论哪种方式,您还需要让用户重置API密钥(主要是为了防止可能的泄漏)。
顺便说一句,更常见的模式是支持多个API密钥。例如,如果您查看Twitter的开发人员面板,用户可以创建N个“应用程序”,每个应用程序自动获得自己的API密钥。这种方法有一些优点,例如,您可以收集有关应用程序的元数据,API密钥被分区(安全性更好),每个应用程序的权限模型可以不同,并且您可以撤销单个应用程序而不影响所有用法。虽然这可能对您来说有些过度设计。
存储在会话中??
会话更多是与cookie相关的Web概念。您不需要那种复杂性。只需在每个请求路径中要求API密钥即可。
当用户想要访问受保护的资源时
您可能需要在每个请求中都要求API密钥,而不仅仅是受保护资源的请求。对于用户来说,这同样容易,而且它将使您能够按用户基础进行速率限制和记录请求。

我认为我在这里走上了正确的道路 - 非常感谢您的建议。我是否只需使用会话来实现用户登录网站以编辑其个人资料等功能? - Jimmy P
是的。对于基于浏览器的交互,会话很好用。 - mahemoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接