使用OIDC客户端和IdentityServer4将外部身份提供者令牌与内部身份提供者令牌交换

在使用IdentityServer4和OIDC-Client的SPA环境中,使用多个外部提供程序执行以下操作的最安全方法是什么?

基本上,如果用户使用Google登录,我需要登录我的内部系统并创建新的声明 . 这必须在服务器端进行后第三方回调 . IdentityServer4中最安全的配置是什么才能在SPA中执行此操作?

流:

  • 用户在SPA中登录Google(致电oidcManager.signinRedirect)

  • Google重定向回SPA(cal new Oidc.UserManager() . signinRedirectCallback)

  • 将JWT发送回IdentityServer4(但要使用哪种机制?) . 如果用户确实存在于内部系统中,则返回一个新的JWT,其中包含OIDCManager可以管理的自定义声明(替换外部声明) . 如果内部系统中不存在用户,则重定向到资源所有者凭据流接管的登录页面 .

对于#3,我想使用IdentityServer4已经提供的内容而不是滚动我自己的 endpoints . 这种情况是否容易支持?

基本上,我需要完成此操作但不确定IdentityServer4将如何处理此方案:

new Oidc.UserManager().signinRedirectCallback().then(function (externalUser) {
    //TODO: pass externalUser to IdentityServer4 endpoint where it's exchanged for internal user
    window.location = "../Spa/Index";
}).catch(function (e) {
    console.error(e);
});

除了登录流程之外,使用多个外部提供程序进行令牌刷新的最安全方法是什么 . 我假设我需要定期刷新外部令牌,以防我自己的内部令牌过期 .

回答(1)

3 years ago

我们有一个类似的项目,我们的用户可以通过谷歌和Facebook登录 . 我们通过IdentityServer添加了Google和Facebook SignIn,并将ID和电子邮件地址存储在客户端应用程序发送到资源服务器(API)的 access_token 内,因此资源服务器知道哪个用户已登录 .

因此,我建议使用内置于IdentityServer4中的Google SignIn,并将详细信息发送到资源服务器(API) .