如何在REST API中使用会话


How to make use of session in REST API

我在一些公司的REST web服务文档中看到,在步骤1中,请求APIkey,他们会返回服务器时间和到期时间以及auth_key作为响应。在步骤2中,对于登录用户名密码和apikey和auth_key的md5,它将返回会话ID。在剩下的步骤中,用户只发送会话ID。这怎么可能?按会话?我很困惑,请任何人帮我。

他们实际上并没有像PHP session_start()那样使用session。他们真正在做什么可以通过几个步骤来解释:

  1. 您要求提供API密钥:
    1. 然后,该服务生成一个具有生存期的auth_key
    2. 将生成的api keyauth_keyexpiry保存到数据库表中。api key很可能是表上的唯一索引
    3. 向用户发送包含生成的密钥的api keyauth_keyexpiry的响应
  2. 您发送登录详细信息和md5(api_key . auth_key):我预计您可能也会在标题中发送api key
    1. 它首先使用接收到的api key查询数据库表
    2. 检索auth_key值和有效期
    3. 检查auth_key是否未过期;如果没有
    4. 计算md5(api_key . auth_key)
    5. 将其与您请求中的md5(api_key . auth_key)进行比较
    6. 如果相同,则会检查您的登录详细信息
    7. 如果登录详细信息正确,它将生成与authenticated account关联的唯一session_id
    8. 它将这些详细信息保存到另一个数据库表:session_idaccount_id。我在这里使用帐户id,因为它是最有可能使用的
    9. 它将此session_id返回给您的客户端
  3. 之后,您使用session_id发送的每个请求都是这样工作的:
    1. 它从请求中检索session_id
    2. 它尝试从数据库中检索与session_id关联的帐户
    3. 如果找到/有效,并且您有执行该操作的访问权限,它将执行该命令

总之,这就是整个流程;这就是为什么我之前说过,当你进行session_start()时,它不会以会话的工作方式使用会话;这意味着他们不能做类似$_SESSION的事情。您还应该知道,尝试为RESTful API使用session_start进行会话不是RESTful。

根据Rajan的评论更新

这个答案只是基于这个问题的解释;你不应该想太多。回答你的问题;将API密钥和Auth密钥视为帮助识别用户的过程的两部分:

  • 一个公共:API密钥
  • 一个私钥:Auth密钥

每次发送请求时,都会发送公钥以及公钥和私钥组合生成的字符串。服务器获取公钥,搜索有效的私钥,并尝试使用相同的公式计算值,然后最终将其生成的内容与您生成的内容进行比较。

如果它们相同,它将继续处理;如果它们不同,则终止执行。

上面的会话id的有效性可以是任何您想要的,通常它是长期的(可能持续30天)。