SPA + API + OIDC:仅提供 ACCESS 令牌时如何验证 API 调用者?

     2023-03-27     288

关键词:

【中文标题】SPA + API + OIDC:仅提供 ACCESS 令牌时如何验证 API 调用者?【英文标题】:SPA + API + OIDC: How to authenticate an API caller when it's only providing an ACCESS token? 【发布时间】:2019-03-28 00:21:41 【问题描述】:

假设您正在开发一个客户端 JavaScript SPA 应用程序 (Angular)、该应用程序的后端 API(在我的例子中为 ASP.NET Core),并且您使用实现 Open ID Connect 协议的身份提供程序(我正在使用身份服务器4)。

显然,保护应用的推荐方法是在 JavaScript 应用和身份提供者之间使用 OIDC 隐式流,如果成功,JavaScript 应用会获得一个 id 令牌和一个访问令牌。 p>

现在根据this documentation,JavaScript 应用程序应该在调用 API 时在标头中传递 访问令牌。而且我不确定 id 令牌 在这种情况下有什么用途(除了在您的 JavaScript 应用程序中自定义 UI)?

但这是令人困惑的部分:文档还说您永远不应该使用访问令牌进行身份验证。但这是我的 API 在请求标头中收到的令牌,那么它如何验证用户身份呢?如果我的 API 接收到Post(newRecord),并且 API 需要在内部修复newRecord 上的一些审计信息(即newRecord.CreatedBy = CurrentUsername),它如何在不验证调用者的情况下做到这一点?

我想我漏掉了一块拼图。非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

简答/建议

使用访问令牌访问 API 端点。从 API 端点,您必须使用token introspection 端点来验证令牌有效性(活动状态)以及获取在授权服务器上进行身份验证的主体。 IdentityServer 对此提供支持。文档可从here 获得。

说明

ID 令牌旨在供接收客户端使用。它将允许您的客户端对最终用户进行身份验证并提供用户特定的定制。这就是 OpenID Connect (OIDC) 的全部目的。另一方面OAuth 2.0 提供了一个授权框架。它将用户凭证替换为访问令牌,从而提高 API 访问安全性(与基本身份验证和随处存储用户凭证相比)。因此 OIDC 建立在 OAuth 2.0 之上,您可以通过 OIDC 流程获得 ID 令牌和访问令牌。

但正如您已经知道(并且之前提到的),ID 令牌是为客户设计的。可能存在 ID 令牌在客户端和服务器之间传递的特殊情况。这主要是当两者都由同一方控制时。但是访问令牌是正确访问 API 端点的关键。

访问令牌可以是不透明的字符串或 JWT。当它是 JWT 时,API 可以读取和理解令牌(自包含)。当它不透明时,在 API 端点验证令牌的唯一方法是使用令牌自省端点。如果 API 可以验证令牌的有效性,那么它可以授予访问(授权)请求。此外,如果用户详细信息(主题)可用(通过 JWT 或作为自省响应),则可以执行特定于用户的检查。这进一步扩展到令牌范围值。但归根结底,您是在授权 API 请求,而不是在 API 端点对用户进行身份验证。这就是亮点。希望现在一切都清楚了!

【讨论】:

假设 SPA 从身份提供者那里接收到 Id 令牌和访问令牌。然后 SPA 完成了任务并验证了 id 令牌的签名。现在,如果用户是恶意的,他/她可以使用 SPA 保留的这些令牌做任何事情(因为它是 SPA 并且本质上是开放的)。所以用户可以随意用其他任何东西替换访问令牌。因此,当 API 从 SPA 接收访问令牌并使用其中的声明来确保这是 Joe 时,它​​似乎依赖于访问令牌进行身份验证 这就是为什么我这辈子都不明白为什么身份提供者首先要发送两个令牌,这似乎毫无意义。以及为什么他们在文档中强调访问令牌不适用于身份验证 对于会话也可以这样说。想想一个简单的网络应用程序依赖于一个会话。如果他/她真的想要,最终用户可以使用这些值来做任何事情。但是从服务提供商的角度来看,会话可以从第三方获得。由于协议的设计方式,存在两个令牌。 OIDC 基于 OAuth 2.0 构建。因此,OIDC 具有用于客户端应用程序身份验证的 ID 令牌和用于受保护资源访问的访问令牌。 ID 令牌不打算共享 除了这个讨论过时,最近 OAuth 工作组决定不推荐隐式流 - medium.com/@torsten_lodderstedt/… 。这证明了你的一些怀疑。

将 OIDC 添加到我的 SPA 后反向代理错误网关

】将OIDC添加到我的SPA后反向代理错误网关【英文标题】:ReverseProxyBadGatewayafteraddingOIDCtomySPA【发布时间】:2022-01-1411:50:59【问题描述】:我正在将keycloak添加到我公司现有的用Angular编写的SPA中。由于初始身份验证运行良好,我已... 查看详情

使用 .Net 5 WebAPI 的 Vue SPA 的正确 OIDC 流程是啥?

】使用.Net5WebAPI的VueSPA的正确OIDC流程是啥?【英文标题】:What’stherightOIDCflowforVueSPAwith.Net5WebAPI?使用.Net5WebAPI的VueSPA的正确OIDC流程是什么?【发布时间】:2021-12-0412:59:51【问题描述】:我阅读了很多关于OIDC流程的信息,并且带... 查看详情

从 Keycloak 访问 admin/groups OIDC API 时出现错误 403

...cloak-authz-client(6.0.1)(无SpringSecurity),我需要从我的服务提供商处读取用户信息和用户组。在获得正确的访问令牌后,感谢AuthzCli 查看详情

是否有基于 OIDC 的基于 IDaaS 的社交登录的标准模式?

...SPA社交登录。案例1:如果SPA已注册为具有社交身份验证提供程序(例如Google)的OAuth2.0客户端,则OAuth/OIDC角色映射如下:资源 查看详情

ID4 ADFS 3.0 和 oidc-client (vue spa) - 回调实现

】ID4ADFS3.0和oidc-client(vuespa)-回调实现【英文标题】:ID4ADFS3.0andoidc-client(vuespa)-Callbackimplementation【发布时间】:2020-07-1918:46:12【问题描述】:要在我们的SPA中添加ADFS3.0身份验证,我们使用javascriptsample和一个(wsfed)externalidentitypro... 查看详情

React SPA with Express Backend API - 将 JWT 存储在本地存储中并限制 API 仅访问 SPA 的 Web 服务器 IP

】ReactSPAwithExpressBackendAPI-将JWT存储在本地存储中并限制API仅访问SPA的Web服务器IP【英文标题】:ReactSPAwithExpressBackendAPI-StoringJWTinlocalstorageandlimitingAPIaccesstoSPA\'swebserverIPonly【发布时间】:2021-02-1520:41:12【问题描述】:我正在处理一... 查看详情

提供 SPA 和 API 的 PHP App Engine Flex

】提供SPA和API的PHPAppEngineFlex【英文标题】:PHPAppEngineFlexservingSPAandAPI【发布时间】:2018-06-2506:59:32【问题描述】:我的目标是在同一个站点上提供SPA和PHPapi。我希望能够在mywebsite.com上浏览网站,并在mywebsite.com/api/上请求api调用... 查看详情

如何在没有 SPA 或图形界面的情况下,仅通过 POSTMAN 访问 Laravel Sanctum 的 API 路由?

】如何在没有SPA或图形界面的情况下,仅通过POSTMAN访问LaravelSanctum的API路由?【英文标题】:HowcanIaccesstheAPIrouteswithLaravelSanctumwithoutaSPAorgraphicinterface,onlybyPOSTMAN?【发布时间】:2021-01-0716:30:11【问题描述】:我是第一次使用LaravelSa... 查看详情

为啥 quarkus.oidc.credentials.secret 被忽略?

】为啥quarkus.oidc.credentials.secret被忽略?【英文标题】:Whyisquarkus.oidc.credentials.secretbeingignored?为什么quarkus.oidc.credentials.secret被忽略?【发布时间】:2021-11-0610:27:27【问题描述】:我有一个SPA(Vue.js),它通过REST与Quarkus资源API进行... 查看详情

带有 vuex-oidc 的 Vue.js SPA 在发布版本上有重定向循环

】带有vuex-oidc的Vue.jsSPA在发布版本上有重定向循环【英文标题】:Vue.jsSPAwithvuex-oidchasredirectloopsonreleaseversion【发布时间】:2019-07-2000:17:10【问题描述】:我有一个在Vue.js2.5中构建的单页应用程序,它还使用IdentityServer4+vuex-oidc支... 查看详情

Oauth + SPA + API 后端

...正在设置一项服务,该服务需要授权现有的Gitlab作为OAuth提供者。该服务是一个SPA,由开发模式下的webpack开发服务器和生产模式下的nginx服务器提供服务。我还设置了一个外部API,它应该处理数据库并向给定的gitlab实例发出请求... 查看详情

如何在 SPA 中实现 OAuth 隐式流?

...器(SpringSecurityOAuth)一个SPA客户端(Angular6/路由/angular-oauth-oidc库)我正在使用 查看详情

OIDC 身份提供者

】OIDC身份提供者【英文标题】:OIDCidentityprovider【发布时间】:2021-09-1205:53:18【问题描述】:我们希望使用OIDC将AzureActiveDirectory(AzureAD)与AWSEKS身份提供商配置集成。目前,我不确定TerraformAWS提供程序模块是否具有OIDC直接与AzureAD... 查看详情

Blazor OIDC 身份验证弹出窗口

...器的内容打开一个弹出窗口。相比之下,AddMsalAuthentication提供了一个options.Provi 查看详情

保护 SPA 后面的 REST API 防止数据被盗

...道我对HTML抓取无能为力,但至少我不想为这些数据窃贼提供用户体验和我们发送到SPA的JSON的全部功能。关 查看详情

订阅 OIDC 提供商的证书更改

】订阅OIDC提供商的证书更改【英文标题】:subscribetoOIDCprovider\'scertificatechanges【发布时间】:2021-11-2501:23:09【问题描述】:根据我读过的一些文章,.net核心中的AddJwtBearer()将密钥缓存在OIDC提供程序的发现文档中,并使用它来验... 查看详情

oidc-client-js 针对 Auth0 的 signoutRedirect 不返回结束会话端点

...-client-js库来验证我的SPA应用程序,其中Auth0作为我的身份提供者。但是 查看详情

Django - 从静态文件夹提供 SPA

】Django-从静态文件夹提供SPA【英文标题】:Django-servingaSPAfromstaticfolder【发布时间】:2017-08-2503:19:47【问题描述】:我们的django服务器是我们的API以及操作后端。我正在通过编写一个慢慢替换现有操作后端的VueSPA来改进我们的操... 查看详情