我正在尝试为我的下一个项目创建一个REST API。我想我理解大多数概念,但对安全性有点不确定。显然,即使从第一个生产代码版本开始,您也不希望出现安全问题。
我知道REST是无状态的,所以不是让用户登录并且他们的会话存储在服务器上并且在他们发出请求时重新启动,他们会向服务器发送他们唯一的API密钥,服务器会在每次请求时对他们进行身份验证。
那么登录系统的用户如何看待“幕后”?它是这样的:
然后客户有责任存储API密钥并随每个请求一起提交。此密钥存储在数据库中的服务器上,用于在每个请求上标识用户及其权限等。
这听起来很合理,但也打破了应用程序的真正无状态,因为大多数请求都需要初始化“make me a a key key”请求。
提前感谢您帮助我理解!
答案 0 :(得分:2)
GroupMe的API使用基于令牌的方法来验证其API用户(这允许其API用户创建脚本以代表他们调用API)。
为了成功进行API调用,我(作为API的用户)必须登录并创建一个应用程序,它为我提供了一个访问令牌(见图)。
此访问令牌(在groupme的情况下)是我必须包含所有请求以便请求成功的内容。格式可能会有所不同,具体取决于您使用的是谁的API,但在groupme的情况下,它看起来像这样:
https://api.groupme.com/v3/PAGE_TO_CALL?token=YOUR_ACCESS_TOKEN
这将允许GroupMe API识别我并执行我指定的任何操作。这个访问令牌就像我的用户名和密码,拥有它的人将能够像我一样进行API调用,包括我创建的任何脚本......
如果您对创建自己的REST API感兴趣,我会查看this文章,特别是关于创建其他用户可以使用的基于令牌的身份验证方法的最后一节使用您的API进行身份验证。
以下是最相关的摘录:
API身份验证
在普通的Web应用程序中,处理身份验证通常通过接受用户名和密码以及在会话中保存用户ID来处理。用户的浏览器保存具有会话ID的cookie。当用户访问需要身份验证的网站上的页面时,浏览器会发送cookie,应用程序会通过ID查找会话(如果它尚未过期),并且由于用户ID已保存在会话中,允许用户查看页面。
使用API,使用会话来跟踪用户不一定是最好的方法。有时,您的用户可能希望直接访问API,有时用户可能会授权其他应用程序代表他们访问API。
解决方案是使用基于令牌的身份验证。用户使用其用户名和密码登录,并且应用程序使用用户可以用于将来请求的唯一令牌进行响应。此令牌可以传递到应用程序,以便用户可以在以后拒绝该应用程序进一步访问时撤销该令牌。
有一种标准的方式,这已经变得非常流行。它被称为OAuth。具体来说,OAuth标准的第2版。在线实现OAuth有很多很好的资源,所以我想说这超出了本教程的范围。如果您使用的是Ruby,那么有一些很棒的库可以为您处理大部分工作,例如OmniAuth。