基于应用的OIDC内嵌浏览器场景下的令牌安全与实践问询
场景背景
多数OIDC指南都是应用直接作为客户端,通过授权码流与IDP完成令牌交换,且有成熟库支持。但我的场景需要后端Session Manager作为IDP的客户端,IDP颁发的id、access、refresh令牌需全程保密在后端内。
流程简化为:App => Session Manager => IDP,具体执行逻辑:
- Session Manager提供
/login端点,应用通过内嵌浏览器调用该端点,后者重定向至IDP的/authorize端点启动授权流程 - 因使用PKCE,整个授权流程需在浏览器内完成,PKCE的code verifier存储在Cookie中,应用无法访问
- 流程推进至
/signin端点完成令牌交换后,需要生成会话标识(外部令牌)交付给应用,作为后续请求的授权凭证
当前实现是通过Deep Link重定向,将会话标识作为查询参数传递,但受React Native框架限制,应用仅能获取URL及查询参数,无法访问Cookie或请求头。这种传递方式存在安全隐患,因为会话标识可访问系统所有受保护端点。
核心疑问
是否禁用PKCE并通过Deep Link传递授权码是更优方案?
该方案下,应用可获取授权码,再调用Session Manager的/signin端点完成流程,从响应体或请求头中获取会话标识。我的理解是:PKCE主要用于应用作为客户端、无法安全存储密钥的场景,而我的场景中后端作为客户端,授权码为一次性使用,相比有效期至少5分钟的会话标识,关闭PKCE是否更安全?设计上身份认证与授权引擎完全分离,IDP的access token仅能用于调用IDP内部端点获取用户信息,无法将其作为应用的授权凭证。是否有其他基于内嵌浏览器的应用OIDC替代方案或优化建议?
更新补充
核心问题在于我为Web和Mobile设计了共用的Session Manager(作为前端后端OIDC客户端),配置代码如下:
.AddOpenIdConnect(options => { options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.Authority = "url"; options.RequireHttpsMetadata = false; options.ClientId = "ClientId"; options.ClientSecret = "ClientSecret"; options.ResponseType = OpenIdConnectResponseType.Code; options.UsePkce = true; options.CallbackPath = "/signin-oidc"; }
当使用Cookie认证方案时,无法通过重定向URL将授权码传递给应用,因为应用无法获取.NET生成的Cookie。
由此延伸出两个疑问:
- 为Web和Mobile采用不同的OIDC实现方案是否属于常见做法?
- 是否可借助IDP的access token在Session Manager中创建会话?
内容的提问来源于stack exchange,提问作者user3170354

