【发布时间】:2011-04-27 04:56:21
【问题描述】:
概述
我希望为我的应用程序创建一个 (REST) API。最初/主要目的是供移动应用程序(iPhone、Android、Symbian 等)使用。我一直在研究基于 Web 的 API 的不同身份验证和授权机制(通过研究其他实现)。我已经了解了大部分基本概念,但仍在寻找一些领域的指导。我想做的最后一件事是重新发明轮子,但我没有找到任何符合我标准的标准解决方案(但是我的标准被误导了,所以也可以随意批评)。此外,我希望 API 对于所有使用它的平台/应用程序都是相同的。
oAuth
我将继续提出我对 oAuth 的反对意见,因为我知道这可能是提供的第一个解决方案。对于移动应用程序(或更具体地说是非 Web 应用程序),离开应用程序(转到 Web 浏览器)进行身份验证似乎是错误的。此外,浏览器无法(我知道)将回调返回给应用程序(尤其是跨平台)。我知道有几个应用程序可以做到这一点,但它只是感觉不对劲,并且会影响应用程序的用户体验。
要求
- 用户在应用程序中输入用户名/密码。
- 每个 API 调用都由调用应用程序标识。
- 开销保持在最低限度,身份验证方面对开发人员来说很直观。
- 该机制对最终用户(他们的登录凭据未公开)和开发人员(他们的应用程序凭据未公开)都是安全的。
- 如果可能,不需要 https(绝不是硬性要求)。
我目前对实施的看法
外部开发人员将请求一个 API 帐户。他们将收到一个 apikey 和 apisecret。每个请求至少需要三个参数。
- apikey - 在注册时提供给开发人员
- 时间戳 - 兼作给定 apikey 的每条消息的唯一标识符
- hash - 时间戳 + apisecret 的哈希
需要 apikey 来识别发出请求的应用程序。时间戳的作用类似于 oauth_nonce 并避免/减轻重放攻击。哈希确保请求实际上是从给定 apikey 的所有者发出的。
对于经过身份验证的请求(代表用户完成的请求),我仍然不确定是使用 access_token 路由还是使用用户名和密码哈希组合。无论哪种方式,在某些时候都需要用户名/密码组合。因此,当它这样做时,将使用几条信息(apikey、apisecret、时间戳)+密码的哈希值。 我希望得到有关这方面的反馈。仅供参考,他们必须先对密码进行哈希处理,因为我不会在没有哈希的情况下将密码存储在我的系统中。
结论
仅供参考,这不是关于如何构建/构造 API 的一般请求,而是关于如何仅在应用程序内处理身份验证和授权的请求。
随机想法/奖金问题
对于仅需要 apikey 作为请求一部分的 API,您如何防止 apikey 所有者以外的其他人看到 apikey(因为以明文形式发送)并发出过多请求以将其推送到使用限制?也许我只是在想这个,但不应该有一些东西来验证请求是否已向 apikey 所有者验证?就我而言,这就是 apisecret 的目的,它永远不会在未经过哈希处理的情况下显示/传输。
说到哈希,md5 和 hmac-sha1 呢?用足够长的数据(即 apisecret)对所有值进行哈希处理真的很重要吗?
我之前一直在考虑将每个用户/行的盐添加到我的用户密码哈希中。如果我这样做,应用程序如何在不知道所使用的盐的情况下创建匹配的哈希?
标签: authentication oauth mobile-application rest