如何在 Passport 中使用 AWS Cognito 作为提供商?

How to use AWS Cognito as a provider in Passport?

我有一个 Javascript 后端(带有 Express + Passport 的 NestJS)。

我想将身份验证(例如社交身份验证)的复杂性外包给 Cognito,但避免陷入困境。我想知道我是否可以将 Cognito 用作 Passport 中的提供者,类似于社交提供者(Google、脸书等)。这样,我就可以集成许多提供程序,而只需要集成一个。我仍然会在我自己的应用程序中管理用户数据、授权等,因此,如果我将来愿意,我可以在我自己的应用程序中实现 Google、Facebook 等社交身份验证,并摆脱 Cognito。

如果我没看错的话this is possible with Auth0.

理想情况下,我想实现一个 OAuth 流程,其中用户被重定向到一个简单的“注册/登录”Cognito 应用程序,登录,被重定向到我的应用程序中的回调 URL我收到用户数据。如果 AWS 没有为此托管解决方案,我也可以使用他们的 UI 元素来构建和托管此应用程序。

如果作为提供者/策略实施,这可能很简单:

passport.use(new CognitoStrategy({
    key: KEY,
    secret: SECRET,
    callbackURL: "http://www.example.com/auth/cognito/callback"
  },
  function(token, tokenSecret, profile, done) {
      User.findOrCreate({ uuid: profile.id }, function (err, user) {
        return done(err, user);
      });
  }
));

app.get('/auth/cognito', passport.authenticate('cognito'));
app.get('/auth/cognito/callback', 
  passport.authenticate('cognito', { failureRedirect: '/auth/cognito' }),
  function(req, res) {
    res.redirect('/');
  });

有解决办法吗?这在原则上有意义吗?我是否遗漏了多对一想法的任何复杂性?

相关资源:

如果您已经亲自动手管理您的用户数据,我会直接与社交提供商集成。 Cognito 最有用的地方是廉价且肮脏的地方,用于存储用户数据以及托管托管身份验证和授权服务。您已经在存储自己的用户数据,听起来好像只支持社交登录;在这种情况下,Cognito 可能会成为更大的障碍。

此外,没有任何魔法可以支持 cognito 社交登录,如果您直接集成,则必须执行相同的配置步骤,唯一的区别是 cognito 将充当回调端点。

但是,如果您想在避免供应商锁定的同时开拓进取,请将其严格用作 OIDC 服务提供商,并使用带有通行证的通用 OIDC 策略,或者完全删除通行证,因为在这种情况下您并不真正需要它,然后正如 auth0 建议使用 oidc express middleware to protect your endpoints and use something like AppAuth 在您的前端获取访问令牌。

可以通过 OAuth 使用用户池和身份池。 Cognito 甚至有一个自托管 UI,有自己的域名和品牌可用。设置步骤:https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-app-integration.html

我使用了通用的 OAuth2 Passport 策略:https://github.com/jaredhanson/passport-oauth2

端点详细信息:https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-userpools-server-contract-reference.html

设置完成后,可以从 AWS 控制台设置联合身份。

最终未标记的屏幕如下所示: