【问题标题】:How to use AWS Cognito as a provider in Passport?如何在 Passport 中使用 AWS Cognito 作为提供程序?
【发布时间】:2021-07-18 09:59:21
【问题描述】:

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

我想将复杂的身份验证(例如社交身份验证)外包给 Cognito,但要避免被锁定。我想知道我是否可以使用 Cognito 作为 Passport 中的提供者,类似于社交提供者(谷歌、Facebook 等) .这样一来,我就可以整合许多供应商,而只需整合一个供应商。我仍然会在我自己的应用程序中管理用户数据、授权等,因此,如果我将来想这样做,我可以在我自己的应用程序中实现 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('/');
  });

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

相关资源:

【问题讨论】:

标签: oauth-2.0 passport.js amazon-cognito idp


【解决方案1】:

可以通过 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 控制台设置联合身份。

最后一个无品牌的屏幕是这样的:

【讨论】:

    【解决方案2】:

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

    此外,cognito 社交登录并没有什么神奇的功能,如果您直接集成,则必须执行相同的配置步骤,唯一的区别是 cognito 将充当回调端点。

    但是,如果您想在避免供应商锁定的同时继续前进,请将其严格用作 OIDC 服务提供商,并使用带有护照的通用 OIDC 策略,或者干脆完全删除护照,因为在这种情况下您并不真正需要它,那么由于 auth0 建议使用 oidc express middleware 来保护您的端点,并使用类似 AppAuth 的东西在您的前端获取访问令牌。

    【讨论】:

    • 谢谢@Andrew!最后,我设法通过 OAuth 解决了这个问题。在找到正确的文档后,它就像设置一个单一的社交提供者一样简单,所以我认为这是值得的。这样我也有可能使用电子邮件 + 密码注册(以与 Cognito 更加耦合为代价)和 UI 开始。
    猜你喜欢
    • 2022-07-28
    • 2019-05-15
    • 1970-01-01
    • 2021-09-04
    • 2015-02-06
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 2017-11-07
    相关资源
    最近更新 更多