REST API授权和认证(Web +移动)
我已经阅读了有关oAuth,AmazonRESTAPI,HTTPBasic/Digest等的信息,但无法将其全部整合为“单个”。这可能是最接近的情况- 为移动应用程序创建API-
身份验证和授权
我想建立以API为中心的网站-服务。因此(一开始)我将在中心拥有一个API,而 (PHP + MySQL)将通过 ,
和
通过它们的网络接口进行连接。所以3个主要客户-3个API密钥。其他开发人员也可以通过API接口进行开发,他们将获得自己的API密钥。根据用户级别的状态,API操作将被接受/拒绝,如果我是管理员,则可以删除任何内容,等等,其他所有操作都只能操作其本地(帐户)数据。
首先,授权-我应该使用oAuth +xAuth还是我自己的某种实现?据我了解,
。在我的服务中,我需要区分标准用户/帐户(在网站上注册的用户)和开发者帐户(应具有其API密钥)。
因此,我首先需要 ,然后再
本身。如果我使用亚马逊的方案来检查开发人员的API密钥(授权他们的应用程序),那么我应该使用哪个sheme进行用户身份验证?
我读到有关通过api.example.org/auth
(通过 ,HTTP
Basic)发布我的用户名和密码,然后在随后的每个请求中转发令牌的方式获得令牌的信息。如果我同时在 和
上登录,如何管理令牌?如果我仅在第一个请求(传输用户名和密码时使用SSL)并且仅在其他请求上使用HTTP时,使用中间人攻击怎么办?
回答:
总而言之,保护密钥的最佳方法是不传输密钥。
也就是说,我们通常使用一种方案,其中每个“ API密钥”都有两个部分:非秘密ID(例如1234)和秘密密钥(例如byte [64])。
- 如果提供API密钥,请将其(加盐和散列)存储在服务的数据库中。
- 如果提供用户帐户(受密码保护),则将密码(加盐和散列)存储在服务的数据库中
现在,当消费者 访问您的API进行连接时,请他
- 发送“用户名”参数(“ john.doe”不是秘密)
- 发送“ APIkeyID”参数(“ 1234”,不是秘密)
还给他
- 数据库中的盐(如果其中一个参数错误,只需返回一些可重复的盐-例如sha1(username +“ notverysecret”)。
- 服务器的时间戳
消费者应在会话期间存储盐,以使事情变得快速顺畅,并且他应计算并保持客户端与服务器之间的时间偏移。
消费者现在应该计算API密钥和密码的哈希值。这样,使用者就可以使用与存储在数据库中的密码和API密钥完全相同的哈希值,而不会遇到任何秘密问题。
现在,当消费者 访问您的API,做实事,让他
- 发送“用户名”参数(“ john.doe”不是秘密)
- 发送“ APIkeyID”参数(“ 1234”,不是秘密)
- 发送“ RequestSalt”参数(字节[64],随机,不是秘密)
- 发送“ RequestTimestamp”参数(根据客户端时间和已知偏移量计算)
- 发送“ RequestToken”参数(哈希(密码哈希+ request_salt + request_timestamp + apikeyhash))
服务器不应接受过去超过2秒钟的时间戳记,以使其免受重放攻击的影响。
服务器现在可以计算与客户端相同的哈希(passwordhash + request_salt + request_timestamp +
apikeyhash),并确保
- 客户端知道API密钥,
- 客户知道正确的密码
以上是 REST API授权和认证(Web +移动) 的全部内容, 来源链接: utcz.com/qa/416509.html