我在一些公司的REST web服务文档中看到,在步骤1中,请求APIkey,他们会返回服务器时间和到期时间以及auth_key作为响应。在步骤2中,对于登录用户名密码和apikey和auth_key的md5,它将返回会话ID。在剩下的步骤中,用户只发送会话ID。这怎么可能?按会话?我很困惑,请任何人帮我。
他们实际上并没有像PHP session_start()
那样使用session
。他们真正在做什么可以通过几个步骤来解释:
- 您要求提供API密钥:
- 然后,该服务生成一个具有生存期的
auth_key
- 将生成的
api key
、auth_key
和expiry
保存到数据库表中。api key
很可能是表上的唯一索引 - 向用户发送包含生成的密钥的
api key
、auth_key
和expiry
的响应
- 然后,该服务生成一个具有生存期的
- 您发送登录详细信息和
md5(api_key . auth_key)
:我预计您可能也会在标题中发送api key
。- 它首先使用接收到的
api key
查询数据库表 - 检索
auth_key
值和有效期 - 检查
auth_key
是否未过期;如果没有 - 计算
md5(api_key . auth_key)
- 将其与您请求中的
md5(api_key . auth_key)
进行比较 - 如果相同,则会检查您的登录详细信息
- 如果登录详细信息正确,它将生成与
authenticated account
关联的唯一session_id
- 它将这些详细信息保存到另一个数据库表:
session_id
、account_id
。我在这里使用帐户id,因为它是最有可能使用的 - 它将此
session_id
返回给您的客户端
- 它首先使用接收到的
- 之后,您使用
session_id
发送的每个请求都是这样工作的:- 它从请求中检索
session_id
- 它尝试从数据库中检索与
session_id
关联的帐户 - 如果找到/有效,并且您有执行该操作的访问权限,它将执行该命令
- 它从请求中检索
总之,这就是整个流程;这就是为什么我之前说过,当你进行session_start()
时,它不会以会话的工作方式使用会话;这意味着他们不能做类似$_SESSION
的事情。您还应该知道,尝试为RESTful API使用session_start
进行会话不是RESTful。
根据Rajan的评论更新
这个答案只是基于这个问题的解释;你不应该想太多。回答你的问题;将API密钥和Auth密钥视为帮助识别用户的过程的两部分:
- 一个公共:API密钥
- 一个私钥:Auth密钥
每次发送请求时,都会发送公钥以及公钥和私钥组合生成的字符串。服务器获取公钥,搜索有效的私钥,并尝试使用相同的公式计算值,然后最终将其生成的内容与您生成的内容进行比较。
如果它们相同,它将继续处理;如果它们不同,则终止执行。
上面的会话id的有效性可以是任何您想要的,通常它是长期的(可能持续30天)。