使用 OIDC 在每个 API 请求中发送哪些信息

2024-01-27

I'm writing an API back-end that I want to use OpenID Connect (OIDC) to secure. I've been reading the documentation but I'm still a bit confused what process applies to each and every API request. The Open ID Connect code flow appears to be: OpenID Connect code flow Which I'm fine with, as a one-time process. My back-end API sees an authorization code in the HTTP headers, and sends a request to the authorization server to get the id token. Assuming this validates OK, the data requested is returned in the API response.

但假设同一用户将向该 API 发出大量请求,后续请求中会发生什么情况?此机制中是否创建了某种会话?我会继续收到相同的授权码吗?我是否必须继续向授权服务器发送这些反向通道请求?

或者我什至应该将 JWT id 令牌作为 cookie 输出?通过这种方式,我可以在将来的请求中返回自包含的 id 令牌,而不需要服务器端会话或进一步的往返。


我一直在阅读文档,但我仍然有点困惑 流程适用于每个 API 请求

它不是应该遵循 OpenID 连接协议的 API。应该由客户来做这件事。

我的后端 API 在 HTTP 标头中看到授权代码,并且 向授权服务器发送请求以获取 id 令牌。 假设验证成功,请求的数据将在 API 中返回 回复。

授权代码必须由客户端应用程序使用,而不是由 API 端点使用。此外,授权代码绝不能暴露给其他实体。

您应该使用通过 OpenID Connect 发送的 id 令牌对客户端应用程序中的最终用户进行身份验证。要访问 API,您应该使用访问令牌。

在 API 端点中做什么?

我想这就是你挣扎的地方。您的客户端应用程序应发送有效的访问令牌才能访问 API 端点。从 API 端点,您可以使用 OAuth 2.0 自省端点来验证令牌。

RFC7662 - OAuth 2.0 令牌自省 https://www.rfc-editor.org/rfc/rfc7662

该规范定义了一个协议,允许授权 受保护资源查询授权服务器确定 由以下人员提供给他们的给定令牌的元数据集 OAuth 2.0 客户端。

请注意,OpenID Connect 构建于 OAuth 2.0 之上。这意味着您可以使用 OAuth 2.0 中定义的任何内容,包括内省端点。使用此端点来验证访问令牌的有效性。

如果您想要最终用户详细信息怎么办?

OpenID Connect 定义用户信息端点

用户信息端点 http://openid.net/specs/openid-connect-core-1_0.html#UserInfo

UserInfo 端点是 OAuth 2.0 受保护资源,它返回有关经过身份验证的最终用户的声明。为了获取所请求的有关最终用户的声明,客户端使用通过 OpenID Connect 身份验证获得的访问令牌向 UserInfo 端点发出请求。这些声明通常由 JSON 对象表示,该对象包含声明的名称和值对的集合。

在这里,您还可以使用访问令牌从此端点获取用户信息。该响应将让您知道颁发此令牌的最终用户。

根据您的具体 API 要求,您可以进行令牌自省或从用户信息端点获取用户信息。完成后,您可以继续验证会话。如果您需要所有可用信息,您可以使用这两个端点。

或者(而不是会话)您的 API 可以维护访问令牌缓存。这将消除在每个 API 调用中验证令牌的需要。但请注意,令牌有过期时间。如果您选择此解决方案,则必须考虑令牌过期问题。

p.s - 客户端与资源服务器

在 OpenID Connect 和 OAuth 2.0 术语中,客户端可以是简单的网页、桌面应用程序,甚至可以是服务器托管的应用程序。

client代表受保护资源请求的应用程序 资源所有者及其授权。 “客户”一词确实 不暗示任何特定的实现特征(例如, 应用程序是否在服务器、桌面或其他设备上执行 设备)。

获取令牌并使用它们是客户端应用程序的职责。

另一方面,资源服务器包含受保护的资源,

资源服务器托管受保护资源的服务器,能够接受 并使用访问令牌响应受保护的资源请求。

资源服务器交换其资源来访问令牌。如果我们将相同的场景与基本身份验证相匹配,则访问令牌将替换随身份验证标头发送的用户名/密码。

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

使用 OIDC 在每个 API 请求中发送哪些信息 的相关文章

  • Zend 框架会话丢失

    我有一个注册表单 当用户注册时 它会将他重定向到他的页面 在 Firefox 和 Chrome 中一切正常 但在 Internet Explorer 中则正常 看起来保存用户信息后 会话就关闭了 并且不会将用户重定向到他的页面 我该如何解决
  • Identity Server 4:添加访问令牌的声明

    我正在使用 Identity Server 4 和隐式流 并且想要向访问令牌添加一些声明 新的声明或属性是 tenantId 和 langId 我已将 langId 添加为我的范围之一 如下所示 然后通过身份服务器请求 但我也获得了tena
  • 会话超时(session.setMaxInactiveInterval)在 Google Appengine 中不起作用

    我尝试使用以下命令为特定用户设置会话超时session setMaxInactiveInterval 30 60 30分钟 但默认情况下它被分配为 86400 秒 24 小时 也在 Web xml 中尝试过
  • Session_set_save_handler 未设置

    我在设置 session set save handler 时遇到问题 我将 php ini 配置为 session handler user 这个简单的测试失败了 Define custom session handler if sess
  • 会话劫持和 PHP

    让我们只考虑服务器对用户的信任 会话固定 为了避免我使用的固定session regenerate id 仅在身份验证中 login php 会话侧劫持 整个站点的 SSL 加密 我安全吗 阅读 OWASPA3 破坏的身份验证和会话管理 h
  • PHP:会话.auto_start

    我在同一台服务器上有两个项目 它们的设置在 session auto start 中冲突 相关post https stackoverflow com questions 1378324 php setting variables in i
  • Magento 外部登录不会创建会话 cookie

    我正在尝试从外部站点替换 Magento 的相当笨拙的 ajax 登录 该网站使用 Magento 作为商店 站点和 magento 商店都有自己的登录信息 因此当用户登录时 两者同步非常重要 这是通过每次页面重新加载时进行 ajax 调用
  • 有没有办法清除所有会话中的一些会话数据?

    一般来说 我有以下场景 从数据库中获取产品及其相关数据 将获取的数据转换为 php product 对象 在会话中缓存产品对象 缓存是只读的 即客户在网站上查看产品 但也有类似的电话getProductIdsByCategory categ
  • 在 keycloak 令牌中使用“sub”声明作为内部数据库中的用户 ID 是否安全

    我正在开发一个将来可能支持社交登录的应用程序 除了我们自己的 keycloak 用户名 电子邮件注册之外 我正在尝试确定使用 keycloak ID 令牌中的 sub 声明作为我们内部 mongo 数据库中用户的主键 id 字段 是否安全
  • Tomcat 如何保持会话完整性?

    HttpServletRequest s 获取会话 布尔值 http download oracle com javaee 6 api javax servlet http HttpServletRequest html getSessio
  • PHP - 按后退按钮时 Session_Destroy

    这是我的问题 我有一个名为login php 的登录页面 不包含HTML 代码 当用户正确输入其凭据时 他会被重定向到特定页面 在本例中我们将使用 test php 该页面上的唯一链接会注销当前会话 并将用户返回到index html 我的
  • IdentityServer 3返回invalid_client

    我正在使用 IdentityServer3 和 EF 我有 API 项目 我想使用以下方式验证其访问权限access token 所以基于sample https identityserver github io Documentation
  • 身份服务器刷新令牌资源所有者密码凭证流程

    我正在使用 IdentityServer 来控制对 API 的访问 我有一个单独的身份验证 API 它发出令牌并验证访问请求以确保 API 的安全 我让用户能够通过安全的 Web 应用程序生成访问令牌 我正在使用资源所有者密码凭证流程 有没
  • UseOpenIdConnectAuthentication - 无法取消对消息的保护。状态错误消息

    我正在尝试将 Google 和 Azure Active Directory 权限添加为我的应用程序中的 OpenIdConnect 选项 如果我单独添加它们 它就可以正常工作 但如果我将它们都添加 我会收到以下错误消息 无法取消对消息的保
  • 用户可以更改 PHP 中 $_SESSION 的值吗?

    这是我的想法 我想知道是否可能 将信息存储在 PHP 的 SESSION 变量中有多安全 在 SESSION 变量中存储变量有两个潜在的 不安全 风险 另一个答案所描述的第一个称为 会话固定 这里的想法是 由于会话 ID 存储在 cooki
  • 会话cookie太大烧瓶应用程序[重复]

    这个问题在这里已经有答案了 我正在尝试使用会话 本地 加载某些数据 并且它已经工作了一段时间 但是现在我收到以下警告 并且不再加载通过会话加载的数据 b session cookie 太大 该值是 13083 字节 但是 标头需要 44 个
  • 为什么LocalSessionFactoryBean不实现getCurrentSession,而SessionFactory的实例却可以调用该方法?

    这是我的 Spring Bean 配置
  • Google 公钥端点返回什么?

    我正在我的应用程序中使用 OpenID Connect 我从 Google 正确获取了 JWT 令牌 我需要使用签名来验证它 为了实现这一点 我需要公钥 Google 提供了一个包含其所有公共证书的 URL https www google
  • 如何使用 PHP 正确添加跨站请求伪造 (CSRF) 令牌

    我正在尝试为我网站上的表单添加一些安全性 其中一个表单使用 AJAX 另一个表单是简单的 联系我们 表单 我正在尝试添加 CSRF 令牌 我遇到的问题是令牌有时只显示在 HTML 值 中 其余时间 该值为空 这是我在 AJAX 表单上使用的
  • ini_set 'session.gc_maxlifetime' 为 1 天

    If I do ini set session gc maxlifetime 86400 这是否意味着用户可以将浏览器留在同一页面 非活动状态 最多 1 天 而不必担心会话被垃圾收集并被注销 如果服务器配置不支持此功能会发生什么 它会给我一

随机推荐

  • 在Python中拦截subprocess.Popen调用

    我正在为一个遗留的 Python 脚本编写一个功能测试 这样我就可以对其进行一行更改 而不会因恐惧而瘫痪 有问题的脚本使用 wget 1 调用子进程 Popen下载一个 XML 文件 然后对其进行解析 def download files
  • Android Room嵌入关系忽略SQL where条件

    我是一个 SQL 菜鸟 不明白为什么我的语句会这样 它在 Android Room DAO 中使用并返回不需要的结果 I have this sample data in two tables 我有这样的声明 Transaction Que
  • Google 图书 API 和 API 密钥的必要性

    因此 Google 声称 为了使用他们的 Google Books Api 您必须注册并获取 API 密钥 但您可以在没有 api 密钥的情况下发出请求 e g https www googleapis com books v1 volum
  • 将字符串参数从 SQL Server 传递到链接的 Oracle Server 过程

    我有一个名为的 Oracle 过程P CREATE USER 需要一个varchar2范围 create or replace PROCEDURE P CREATE USER P USERID varchar2 我可以从 Oracle 运行
  • 什么是 PHP 框架?

    我以前从未听说过这个 而且我已经用 PHP 编码很长一段时间了 我实际上觉得问这个问题有点愚蠢 但是 什么是 PHP 框架 它对我有什么帮助 我该如何使用它 一般来说 框架是一个类和函数的集合 让您更快地实现目标开发中 Symfony Ca
  • 从多维数组中搜索并删除

    如果我的值 ID 等于 1 并搜索一个数组 我希望从数组本身中删除 如果找到的话 ID 为 1 Array 0 gt Array id gt 1 1 gt Array id gt 4 2 gt Array id gt 5 3 gt Arra
  • 填写表格 ms-word VBA / 通过 Word 最有效的智能导航

    Summary 我的公司向客户发送信件 并希望我编写一个宏来填写在 Word 文档中设置的不同文本表单字段 因为发送的不同信件之间的变化非常有限 我在 excel 中做过宏 但这是我第一次遇到 ms word 宏 Problem 我很难通过
  • 如何打包面向通用 Windows 平台的 .NET 库?

    如何以现代通用方式打包通用 Windows 平台库以通过 NuGet 发布 假设我有一个用 C 编写的 AnyCPU 程序集 它导出一些代码和 XAML 用户控件 这是一系列问题和解答 记录了我对现代 NuGet 包创作主题的发现 特别关注
  • setContentView 上的 ViewCompat$OnUnhandledKeyEventListener

    该错误是由以下命令触发的 setContentView R layout activity item list 此代码是由 android studio 在使用 主 从流程 创建新的 android 项目时生成的 看起来布局已渲染 但仍然出
  • 从 Access 获取最后的插入 ID

    我熟悉MySQL函数LAST INSERT ID 是否有类似的函数可以通过 ODBC 对 MS Access 数据库执行相同的查询 在我的具体情况下 我使用 PHP PDO 将行插入 Access 数据库 并且想知道每次插入执行时的最后一个
  • JavaScript mootools 添加事件

    我正在尝试找出我的代码有什么问题 Mootools 核心文件附加到 HTML 头并且运行良好 如果我添加代码 myElement addEvent click function alert clicked 就在 div Click me d
  • exit 在这个 ruby​​ if fork 块中做什么

    一些代码如下 def start if fork do something exit 0 end end fork 复制一个子进程 我说得对吗 但我的问题是哪个进程做了exit 0真的退出吗 父进程还是子进程 fork http ruby
  • 使用 Javascript 的递归方法[重复]

    这个问题在这里已经有答案了 我正在尝试复制 json stringify 方法 但使用递归 我已经能够通过很多测试用例 但是当涉及到嵌套数组时 我似乎遇到了问题 如果数组内有任何空数组 我会得到类似 7 9 而不是 7 9 的内容 另外 如
  • 在 C 中创建字符串堆栈

    我想要一个接受字符串的堆栈 我希望能够推入和弹出字符串 以及清除整个堆栈 我认为 C 有一些方法可以做到这一点 那么C呢 未经测试的快速示例 采用单链表结构 元素被推入列表头部或从列表头部弹出 include
  • 将工作表传递给函数(excel vba)

    我一直在尝试将工作簿中的一张工作表传递给函数 但它似乎不起作用 函数是 Private Sub passToSheet theData As Variant Optional mySheet As Worksheet 我试过做 Dim my
  • 从 azure 部署的机器人向 MS 团队发送主动消息

    我已经将机器人部署到 azure 当连接到 azure 中的 MS 团队频道时 我能够 ping 机器人并接收消息 这很好 我还在机器人中添加了主动消息传递 其中通道中每隔一分钟就会触发一条消息 它在模拟器中工作 但在网络聊天和 MS 团队
  • 相当于 R 中的“this”或“self”

    我正在寻找 R 中 python 的 self 关键字或 java 的 this 关键字的等效项 在下面的示例中 我从另一个 S4 对象的方法创建一个 S4 对象 并且需要将一个指针传递给我自己 该语言中有什么东西可以帮助我做到这一点吗 M
  • 在django中扩展User模型后,如何创建ModelForm?

    我扩展了 django 中的用户模型以包含其他几个变量 例如位置和雇主 现在我正在尝试创建一个具有以下字段的表单 First name from User Last name from User Location from UserProf
  • WebAuthN 是否可以查看可用的平台验证器?

    我的任务是为 webauthn 创建自定义注册屏幕 我们想要向用户展示faceid将用于验证他们的身份 或者他们的指纹将被使用 拥有设备表并从中派生的解决方案似乎是一场可持续发展的噩梦 我更愿意从 navigator credentials
  • 使用 OIDC 在每个 API 请求中发送哪些信息

    I m writing an API back end that I want to use OpenID Connect OIDC to secure I ve been reading the documentation but I m