如何使用第三方开放 ID 连接提供程序(例如 Google 或 Microsoft)为单页面应用程序创建无缝登录流程,然后从外部提供程序返回的现有令牌生成新的 jwt 令牌而不刷新页面?
例如,我希望用户能够登录 Google,然后被带回我的站点,在那里我使用 IdentityServer4 验证令牌服务器端,然后提取某些声明并生成新的 JWT(我自己的逻辑)。
是否有一个现有的 IdentityServer4 端点在重定向时验证来自 Open Id 提供者的 JWT 令牌,然后注入我自己的令牌创建流程的最佳方法是什么?最终结果是一个理想的 cookie,其中包含我的新 JWT 令牌,现在将在我的 SPA 发出的每个 http 请求上发送。
我最好的猜测是使用 oidc js 客户端并为 Google 设置一个用户管理器,例如:
var mgr = new Oidc.UserManager({
authority: "https://accounts.google.com/.well-known/openid-configuration",
client_id: "---",
redirect_uri: "http://localhost:60720/account/callback",
response_type: "id_token token",
scope: "openid profile email",
post_logout_redirect_uri: "http://localhost:60720/spa",
});
/*...*/
mgr.signinRedirect();
但是,在重定向时,我需要 Google 向我的控制器发送一个 cookie,然后控制器将使用 IdentityServer 验证令牌,提取一些声明,如用户 ID,然后为我的 API 生成一个新令牌。这假设我正在使用 IdentityServer 来托管我自己的身份提供者。我如何使用 IdentityServer4 来完成最后一部分?
这对于 MVC 模式来说很简单,因为令牌是在调用重定向回调之后在回发时生成的。在 SPA 中,应该有最少的重定向,理想情况下没有显示弹出窗口以允许用户登录,然后 SPA 接管。我一直无法弄清楚如何从外部身份提供者重定向到我的 IdentityServer4 身份验证服务器或 MVC 服务器,并生成一个新令牌,同时最大限度地减少对事实上的配置的干扰。
Google 建议服务器必须验证令牌 ( https://developers.google.com/identity/protocols/OAuth2UserAgent#validate-access-token )。一种可能的解决方案是在验证后在重定向回调中生成我的新令牌。但是,IdentityServer4 不应该验证令牌,还是我必须自己在服务器上执行此操作?IdentityServer4 在令牌验证中扮演什么角色。我不想自己编写这一步的代码。