如何允许用户在 Node JS Passport JS 失败后尝试不同的电子邮件?

Posted

技术标签:

【中文标题】如何允许用户在 Node JS Passport JS 失败后尝试不同的电子邮件?【英文标题】:How to allow user to try a different email after failure in NodeJS PassportJS? 【发布时间】:2015-10-12 17:17:05 【问题描述】:

目前我正在使用以下代码检查用户是否拥有某个域名电子邮件地址。最初,当谷歌身份验证窗口显示时,如果用户已经登录 Chrome,则无法更改其电子邮件地址。当我使用 Google 身份验证登录类似网站时,我似乎记得被允许添加电子邮件地址或类似的东西。

因此,假设用户尝试使用非 lsmsa.edu 电子邮件地址登录,但失败了。目前它显示一个令人讨厌的错误。我将如何使用户可以尝试使用不同的电子邮件地址重新登录。

if ( profile.emails[0].value.indexOf("lsmsa.edu") > -1 ) 

    var newUser = new User()

    newUser.google.id    = profile.id
    newUser.google.token = token
    newUser.google.name  = profile.displayName
    newUser.google.email = profile.emails[0].value

    newUser.save(function(err) 
        if (err) throw err
        return done(null, newUser)
    )

else 
    done(new Error("Invalid Domain. Must use LSMSA email address."))

【问题讨论】:

【参考方案1】:

查看hd parameter。它确保用户只能使用正确的电子邮件登录。

编辑:这不是每个请求的选项。如果您想将它与passport-google-oauth 一起使用,请将您的配置编辑为:

passport.use(new GoogleStrategy(
    returnURL: 'http://www.example.com/auth/google/return',
    realm: 'http://www.example.com/',
    // Add this
    hd: 'example.com'
  ,
  function(identifier, profile, done) 
    // Blah Blah Blah, Blow up Pluto, Milk Cows, Eat Chocolate, Etc.
  
));

编辑:如果出于某种原因您让他们再次登录,而不是使用hd,只需销毁会话( req.session.destroy();),然后将它们重定向到您的身份验证网址(即/auth/google)。但是,使用hd 将获得更好的用户体验。

【讨论】:

@Connorelsea 使用该选项,他们无法使用错误的电子邮件登录。如果您需要他们重新登录,只需照常重定向即可。 @Connorelsea:不,这不是响应参数。如果您的域是“example.com”,则在您的护照选项中输入hd: "example.com", @Connorelsea:请不要对我无礼。如果您查看我编辑的答案,您会在设置时将其作为一个选项传递给护照。然后它会将其与授权请求一起发送给 Google,Google 不会让您使用无效的电子邮件登录 很抱歉,如果它显得粗鲁无礼。我试图尽可能地感激,但我可以看到它是多么的讽刺哈哈。我会在reddit上给你发消息。我现在很难过,因为你认为我试图变得粗鲁。对不起,伙计。 没问题。我一直这样做。

以上是关于如何允许用户在 Node JS Passport JS 失败后尝试不同的电子邮件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 mongo、passport 和 node js 更新用户的个人资料?

Passport-local mongoose node.js 支持多种用户类型

Node.js - JWT、API:如何实现多个 Passport.js 身份验证中间件?

如何正确使用 Passport.js?

登录时如何“记住”用户-passport.js-phonegap

如何使用 Passport.js 访问 Cookie 集