传统 Web 应用程序和 API 中的身份验证、授权和会话管理

2024-01-12

如果我错了,请纠正我:在传统的 Web 应用程序中,浏览器会自动将会话信息附加到向服务器发出的请求中,以便服务器可以知道该请求来自谁。实际上到底附加了什么?

但是,在基于 API 的应用程序中,此信息不会自动发送,因此在开发 API 时,我必须检查自己是否请求来自经过身份验证的用户?这通常是如何完成的?


HTTP 协议在设计上是无状态的,每个请求都是单独完成的,并在单独的上下文中执行。

会话管理背后的想法是将来自同一客户端的请求放在同一上下文中。这是通过服务器发出标识符并将其发送到客户端来完成的,然后客户端将保存该标识符并在后续请求中重新发送它,以便服务器可以识别它。

Cookies

在典型的浏览器-服务器情况下;浏览器为每个域管理一个键/值对列表,称为 cookie:

  • 服务器可以使用以下命令来管理 Cookie(创建/修改/删除)Set-CookieHTTP 响应标头。
  • 服务器可以通过解析来访问(读取)cookieCookieHTTP 请求标头。

针对Web的编程语言/框架提供了更高级别的处理c​​ookie的功能,例如PHP提供了setcookie http://php.net/manual/en/function.setcookie.php/$_COOKIE http://www.php.net/manual/en/reserved.variables.cookies.php写入/读取cookie。

Sessions

回到会话,在典型的浏览器-服务器案例中(再次),服务器端会话管理利用客户端 cookie 管理。PHP的会话管理 http://www.php.net/manual/en/ref.session.php设置会话 ID cookie 并使用它来识别后续请求。

网络应用程序API?

现在回到你的问题;由于您负责设计 API 并记录它,因此实施将由您决定。你基本上必须

  1. 给客户一个标识符,可以通过Set-CookieHTTP 响应标头,位于响应正文内(XML/JSON 身份验证响应)。
  2. 具有维护标识符/客户端关联的机制。例如关联标识符的数据库表00112233445566778899aabbccddeeff与客户/用户#1337.
  3. 让客户端在所有后续请求(无论是在 HTTP 中)中重新发送在 (1.) 处发送给它的标识符Cookie请求头,一个?sid=00112233445566778899aabbccddeeff参数(*)。
  4. 使用(2.)中的机制查找接收到的标识符,检查是否有效的身份验证,并被授权执行请求的操作,然后代表经过身份验证的用户继续执行该操作。

当然,您可以在现有基础架构上构建,您可以在应用程序中使用 PHP 的会话管理(这将处理 1./2. 和 4. 的身份验证部分),并要求客户端实现进行 cookie 管理(即将处理 3.),然后您在此基础上完成应用程序逻辑的其余部分。


(*) 每种方法都有优点和缺点,例如,使用 GET 请求参数更容易实现,但可能会产生安全隐患,因为 GET 请求会被记录。您应该对关键(所有?)应用程序使用 https。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

传统 Web 应用程序和 API 中的身份验证、授权和会话管理 的相关文章

随机推荐