如何使用第三方开放ID连接提供商(如Google或Microsoft)为单页应用程序创建无缝登录流,然后从外部提供商返回的现有提供商生成新的jwt令牌而不刷新页面?
例如,我希望用户能够登录Google,然后返回到我使用IdentityServer4验证令牌服务器端的站点,然后提取某些声明并生成新的JWT(我自己的逻辑)。
是否有现有的IdentityServer4端点在重定向中验证来自Open Id Providers的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 auth服务器或MVC服务器,并生成一个新令牌,同时对事实配置的干扰最小。
Google建议服务器必须验证令牌(https://developers.google.com/identity/protocols/OAuth2UserAgent#validate-access-token)。一种可能的解决方案是在验证后在重定向回调中生成我的新令牌。但是,IdentityServer4是不是应该验证令牌,还是我必须自己在服务器上执行此操作? IdentityServer4在令牌验证中扮演的角色是什么。我不想自己动手编写这一步。
答案 0 :(得分:0)
我最终使用Identity Server端点创建自己的授权类型,只是为了将第三方身份验证cookie交换为基于内部JSON-bearer的令牌。