传统 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 中的身份验证、授权和会话管理 的相关文章

  • SmartGIT 不要求 ssh 密钥

    切换到新计算机后 我必须再次安装 Windows 版 SmartGIT 现在尝试克隆我的 fedorahosted org repository 密钥存储在 C User myusername ssh SmartGIT 附带了全新安装 并且
  • 在 Hyperledger Composer REST API 上使用 Passport-http

    我想知道是否可以使用passport http来保护由composer rest server生成的Hyperledger Composer的REST API 以及什么是导出 COMPOSER PROVIDERS 配置 这个想法是使用先前生
  • 处理 PHP 中的会话劫持

    阅读了 Stackoverflow 上有关会话劫持的许多问题 我发现验证用户会话的唯一 解决方案 是检查用户代理 这是一个薄弱的保护层 我什至懒得去检查实施它 所以 我想知道你们实施了哪些解决方案 您是否使用 PHP 的本机会话或者是否有更
  • JSF中直接更改URL来限制用户访问页面

    我的应用程序中有两种用户 客户和卖家 我正在使用一个PhaseListener在JSF中防止用户在未登录的情况下访问页面 但在登录后我不知道如何防止用户更改地址栏中的URL并访问他也不允许的页面 例如 阻止客户访问卖家页面 有谁知道我如何防
  • 以编程方式获取 Android 设备的所有 RAM 内存,而不仅仅是分配给用户进程的内存

    我有一台设备 我确信它的 RAM 内存为 512 MB 希望能够以编程方式检索该值 512 MB 到目前为止 我在互联网上遇到的主要是这两种方式 https stackoverflow com a 16143065 1521264 http
  • 尝试在 Facebook 中注册成就时出现 OAuthException 2500(未知路径组件)

    我正在尝试为应用程序注册 Facebook 开放图谱成就 我获取应用程序访问令牌并使用开放图 API 资源管理器发布以下请求 请注意 上面的应用程序 ID 和访问令牌不是真实的 但是 我得到以下答复 error message Unknow
  • 使用 Keycloak-proxy 进行 Zabbix HTTP 身份验证

    我尝试使用 keycloak proxy 将 Zabbix UI 与 Keycloak SSO 集成 我的设置如下 Nginx 是入口点 它处理 虚拟主机 将请求转发到 keycloak proxy Keycloak proxy配置了cli
  • Sage One API - unsupported_grant_type

    我正在尝试通过以下方式获取 Sage One API 的访问令牌docs https developers sageone com docs en v1 authentication request access token using G
  • RESTful API:仅用于验证的方法/标头组合

    我希望我的 API 有一个仅验证请求 例如 如果我有一个 URL 例如 http api somesite com users 12345 用户正在客户端上填写一份信息表单 我最终会将其修补 放置 发布到该资源 当用户填写表单时 我可能希望
  • C# SMTP 身份验证失败,但凭据正确

    这是我的问题 我编写了以下程序来测试是否可以发送电子邮件 class Program static void Main string args try Console WriteLine Mail To MailAddress to new
  • laravel 4 登录验证失败

    在 Laravel4 中 我在路由中编写了以下代码 但它总是将我重定向到登录页面 我用谷歌搜索并在堆栈溢出上找到了它 并尝试了所有解决方案但没有成功 我确信这将是一个愚蠢的错误 但请跟踪它 谢谢 Routes Route post logi
  • IB Java API:提取多个合约的股票数据(实时柱)

    我正在对算法交易和 IB API 进行一些自学和实验 我决定使用 Java 但我愿意切换到 C 我浏览了一个在线教程 该教程将引导您完成下面所示的代码 但我想知道是否可以将其扩展到一只股票之外 我想浏览所有 SP500 股票并检查股票数据
  • 如何从 API 转换一些原始数据并将其保存到变量中,以便我可以在 C# 中使用它们

    我正在做一个个人项目 它是一个 C 应用程序 使用 API 与一些 Web 服务进行通信 我终于用这几行得到了第一个原始数据 var client new RestClient https api abcd com token var re
  • 确定用于映射网络驱动器的域和用户名

    使用带有 SP1 的 Windows 7 Enterprise 但我希望得到适用于 Windows XP 2003 2008 Vista 7 的通用答案 从命令提示符处 我执行net use命令将 Z 驱动器映射到另一台计算机上的共享 但我
  • Facebook 通过 API“Boost Post”?

    我一直在浏览文档 发现可以通过 Facebook 广告 API 实现 Boost Post 功能 但是 我在查找 Boost Post 到底有什么作用时遇到了一些困难 即 API 的哪一部分对应 Facebook UI 的 Boost Po
  • 阻止注销页面后的后退按钮

    我有 php 注销页面 当用户单击注销链接时 请参阅此页面并重定向到索引页面 但是当单击后退按钮时 我会看到带有用户数据的上一页 当然 当我刷新页面时 我看不到以前的页面和数据 我在单击注销并单击后退按钮后检查了其他代码 drupal 但我
  • 负载平衡集群中的 PHP 会话 - 如何?

    好的 我得到了这个完全罕见的负载平衡 PHP 网站的独特场景 令人遗憾的是 它过去没有进行负载平衡 现在我们开始遇到问题 目前唯一的问题是 PHP 会话 当然 一开始没有人想到这个问题 因此 PHP 会话配置保留为默认值 因此 两台服务器都
  • SoftLayer_Account::getOperatingSystemReloadImages

    我想在 OSReload 期间使用 API 获取可用操作系统列表 我发现提到了 SoftLayer Account getOperatingSystemReloadImages 方法 但找不到该方法的用法 谁能帮我解决这个问题 谢谢 我找不
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 使用 VB/ASP classic 可以向 API 发出 HTTP 请求吗?

    是否可以使用 ASP classic 向 Web API 发出请求 例如 像 Flickr API 这样简单的东西 或者这种东西很久以前就不支持了 这是很有可能的 Dim req Set req Server CreateObject MS

随机推荐