我目前正在开发一个连接到一堆webAPI的SPA应用程序。这些API要求用户登录,因此我开始深入研究Openid Conect和OAuth2示例,主要使用IdentityServer。
出于SPA原因,它们都需要使用隐式授权来检索access_tokens。处理令牌刷新使用隐藏的iframe连接到身份验证服务器。
我从这种方法中理解的是,更新access_token是在会话中维护身份验证服务。隐藏的iframe进入身份验证服务器,会话仍处于活动状态,提供了新的access_token。
所有这些对我来说都很好,除了(因为UX原因)我的用户需要被重定向到身份验证服务器页面以提供凭据。
是不是可以让我的SPA应用程序向身份验证服务器发送凭据,获取access_token,然后使用隐藏的iframe进行刷新以进行静默续订(我们显然不希望用户每15分钟或每小时继续通知凭据..)。
如果出于安全原因这是不可接受的,您能解释一下原因吗?
从技术上讲,它可以使用“resource owner password flow”,但在该模型中,身份提供者不能信任您的应用程序,也不会为您的用户创建会话(稍后使用静默更新)。因此,这种非交互式方法不是真正的SSO。 对于2019年,任何Web应用程序(如Angular SPA)的推荐流程都是带有PKCE扩展的代码流程,如here或there所述。
这正是oidc-client-js库所做的。在他们的维基页面中查看automaticSilentRenew设置。可以理解,只有在身份验证服务器上的会话仍处于活动状态时,此方法才有效。