APIdevise:HTTP基本authentication与API令牌
我目前正在为Web应用程序的公共Web API创build一个身份validation系统。 鉴于每个用户帐户都有一个API密钥,并且每个请求都必须经过validation,所以我有两个select:
-
使用HTTP基本authentication, 就像GitHub一样 。
请求必须发送到URL
http://api.example.com/resource/id with basic authentication username: token password: the api key
-
传递API令牌作为查询string参数。
请求必须发送到URL
http://api.example.com/resource/id?token=api_key
还有第三个选项是在URI中传递令牌,但我真的不喜欢这个解决scheme。
你会采用哪种解决scheme,为什么?
我认为HTTP基本身份validation应该可以,但只是为了真正简单的需求。
完整(和最终)的解决scheme恕我直言,是实施一个OAuth提供商。 这并不复杂,它是一个简单的协议,给你很大的灵活性。 此外,许多大型企业实施这一趋势似乎也是当前的趋势,并得到了许多图书馆的支持。
最好的办法可能是在头部使用一个API密钥(例如'Authorization:Token MY_API_KEY')而不是URL参数:
HTTP基本身份validation的优势:
- 更方便,因为您可以轻松过期或重新生成令牌,而不会影响用户的帐户密码。
- 如果受到威胁,漏洞仅限于API,而不是用户的主帐户
- 每个账户可以有多个密钥(例如,用户可以并排“testing”和“生产”密钥)。
url中的API键优势:
- 提供额外的安全措施,防止用户无意中共享其中embedded凭证的URL。 (另外,URL可以在诸如服务器日志之类的东西中出现)
很多时候,我不得不考虑如何validation用户/请求到API,并比较了更多的解决scheme后,我最终使用了亚马逊的解决scheme ,我不需要或不能使用OAuth。 这个解决scheme是基于防止“中间人”问题的签名,因为基本身份validation和传递一个简单的令牌正在发送纯文本数据。 是的,你可以添加SSL,但这会增加系统的复杂性…
我宁愿使用令牌解决scheme。 如果您没有真正的用户使用自己的用户名和密码,那么感觉就像您正在使用基本身份validation结构不符合预期。 这不一定是错的,但不是那么干净,国际海事组织。 这也消除了使用自定义标题的需要,我认为这使得双方的实现更容易,更清洁。 接下来我要问的问题是,如果您应该使用双因素身份validation,或者您需要pipe理会话。