Login 限制Google登录Meteor中的.edu帐户

Login 限制Google登录Meteor中的.edu帐户,login,meteor,iron-router,google-login,Login,Meteor,Iron Router,Google Login,我正试图将我的Google+登录按钮限制为只允许@something.edu帐户登录。我该怎么做呢。这是我目前的代码: Template.googleLogin.events({ 'click #gLogin': function(event) { Meteor.loginWithGoogle({}, function(err){ if (err) { throw new Meteor.Error("Google l

我正试图将我的Google+登录按钮限制为只允许@something.edu帐户登录。我该怎么做呢。这是我目前的代码:

Template.googleLogin.events({
    'click #gLogin': function(event) {
        Meteor.loginWithGoogle({}, function(err){
            if (err) {
                throw new Meteor.Error("Google login didn't work!");
            }
            else {
                Router.go('/home')
            }


        });
    }
})

Template.primaryLayout.events({
    'click #gLogout': function(event) {
        Meteor.logout(function(err){
            if (err) {
                throw new Meteor.Error("Hmm looks like your logout failed. ");
            }
            else {
                Router.go('/')
            }
        })
    }
})

您可以使用
Accounts.config
(在根目录中,因此它同时在客户端和服务器上运行)来完成此操作

如果您需要更定制的内容,如果您需要细化您的需求,您可以使用方法替换
something.edu
,例如,对于任何
.edu
域:

Accounts.config({ restrictCreationByEmailDomain: function(address) {
        return new RegExp('\\.edu$', 'i')).test(address)
    }
});

accounts软件包允许通过以下方式配置帐户创建域:

Accounts.config({
  restrictCreationByEmailDomain: 'something.edu' 
})
但对于谷歌来说,这有一些局限性:

  • 这只是客户端,只允许对登录表单进行适当的样式设置,以表示域的徽标等。但是,手工制作google oauth signin url可以很容易地克服这一问题
  • 如果您需要配置额外的选项,例如允许多个域或一个域以及一些外部用户(可能是第三方承包商或软件公司的支持等),那么这将不起作用。对于google帐户,软件包会检查
    restrictCreationByEmailDomain
    是否是一个字符串,如果它是一个函数,它只会丢弃它
  • 因此,为了能够正确、安全地使用这些功能,您需要使用官方的
    帐户。validateNewUser
    回调:

    Accounts.validateNewUser(function(newUser) {
      var newUserEmail = newUser.services.google.email;
      if (!newUserEmail) throw new Meteor.Error(403,'You need a valid email address to sign up.');
      if (!checkEmailAgainstAllowed(newUserEmail)) throw new Meteor.Error(403,'You need an accepted organization email address to sign up.');
      return true;
    });
    
    var checkEmailAgainstAllowed = function(email) {
      var allowedDomains = ['something.edu'];
      var allowedEmails = ['someone@example.com'];
      var domain = email.replace(/.*@/,'').toLowerCase();
      return _.contains(allowedEmails, email) || _.contains(allowedDomains, domain);
    };
    

    如果您想格外小心,您可以对
    帐户.validateLogInTest
    帐户.onCreateUser
    回调实现相同的操作

    如果在服务器端运行
    Accounts.config
    ,它的验证方式是否与放置隐式
    validateNewUser
    规则相同嗯,实际上我一直在想,但从来没有看过
    validateNewUser
    的源代码。哇!谢谢你指出这一点!我不得不否决这一点,因为这两种说法都是错误的。虽然客户端脚本仅使用
    restrictCreationByEmailDomain()
    进行样式设置是正确的,但无论您返回字符串还是函数,服务器上仍会进行适当的验证。从客户端脚本的注释():
    注意,这只会改变谷歌的用户界面——accounts base/accounts\u server.js在OAuth对话后仍然会检查服务器是否有正确的电子邮件地址。
    这种方法对我不起作用。日志中并没有错误,但不知何故它并没有工作,用户(不需要的)能够登录。
    Accounts.validateNewUser(function(newUser) {
      var newUserEmail = newUser.services.google.email;
      if (!newUserEmail) throw new Meteor.Error(403,'You need a valid email address to sign up.');
      if (!checkEmailAgainstAllowed(newUserEmail)) throw new Meteor.Error(403,'You need an accepted organization email address to sign up.');
      return true;
    });
    
    var checkEmailAgainstAllowed = function(email) {
      var allowedDomains = ['something.edu'];
      var allowedEmails = ['someone@example.com'];
      var domain = email.replace(/.*@/,'').toLowerCase();
      return _.contains(allowedEmails, email) || _.contains(allowedDomains, domain);
    };