如何通过mrt:accounts-ui-bootstrap-dropdown使用Meteor.loginWithGoogle [英] How to use Meteor.loginWithGoogle with mrt:accounts-ui-bootstrap-dropdown

查看:134
本文介绍了如何通过mrt:accounts-ui-bootstrap-dropdown使用Meteor.loginWithGoogle的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

输入我的Google用户名和密码后,弹出的对话框变为以下图像。我想我应该使用Meteor.loginWithGoogle拦截登录,方式与



至于拦截外部服务登录,Accounts.onCreateUser()是做它的地方。

  isProdEnv = function(){
if(process.env.ROOT_URL == http:// localhost:3000){
return false;
} else {
return true;



Accounts.loginServiceConfiguration.remove({
service:'google'
});

Accounts.loginServiceConfiguration.remove({
service:'facebook'
});

Accounts.loginServiceConfiguration.remove({
service:'twitter'
});

Accounts.loginServiceConfiguration.remove({
service:'github'
});

if(isProdEnv()){
Accounts.loginServiceConfiguration.insert({
service:'github',
clientId:'00000',
秘密:'00000'
});
Accounts.loginServiceConfiguration.insert({
service:'twitter',
consumerKey:'00000',
secret:'00000'
});
Accounts.loginServiceConfiguration.insert({
service:'google',
appId:'00000',
secret:'00000'
});
Accounts.loginServiceConfiguration.insert({
service:'facebook',
appId:'00000',
secret:'00000'
});
} else {
// dev environment
Accounts.loginServiceConfiguration.insert({
service:'github',
clientId:'11111',
秘密:'11111'
});
Accounts.loginServiceConfiguration.insert({
service:'twitter',
consumerKey:'11111',
secret:'11111'
});
Accounts.loginServiceConfiguration.insert({
service:'google',
clientId:'11111',
secret:'11111'
});
Accounts.loginServiceConfiguration.insert({
service:'facebook',
appId:'11111',
secret:'11111'
});


Accounts.onCreateUser(function(options,user){
if(user.services){
if(options.profile){
user.profile = options.profile
}
var service = _.keys(user.services)[0];
var email = user.services [service] .email; $ b $如果(!email){
if(user.emails){
email = user.emails.address;
}
}
if(!email){
email = options.email;
}
if(!email){
//如果电子邮件未设置,则无法将其与其他帐户关联
返回用户;
}

//查看是否有现有用户拥有此电子邮件地址,否则创建新
var existingUser = Meteor.users.findOne({'emails.address ':email});
if(!existingUser){
//在其他服务中检查电子邮件
var existingGitHubUs呃= Meteor.users.findOne({'services.github.email':email});
var existingGoogleUser = Meteor.users.findOne({'services.google.email':email});
var existingTwitterUser = Meteor.users.findOne((''services.twitter.email':email});
var existingFacebookUser = Meteor.users.findOne({'services.facebook.email':email});
var doesntExist =!existingGitHubUser&& !existingGoogleUser&& !existingTwitterUser&& !existingFacebookUser;
if(doesntExist){
//返回用户,因为他不存在于数据库中但
返回用户;
} else {
existingUser = existingGitHubUser ||现有的GoogleUser || existingTwitterUser || existingFacebookUser;
if(existingUser){
if(user.emails){
//用户通过电子邮件登录,我们需要将其设置为现有用户
existingUser.emails = user.emails;
}
}
}
}

//预防措施,这些将存在于帐户密码(如果使用
)((如果存在用户密码)服务){
existingUser.services = {resume:{loginTokens:[]}};
}

//复制新服务信息
existingUser.services [service] = user.services [service];
existingUser.services.resume.loginTokens.push(
user.services.resume.loginTokens [0]
);

//甚至更糟hackery
Meteor.users.remove({_ id:existingUser._id}); //删除现有记录
返回existingUser; //记录重新插入
}
});

此代码来源于此博文


The dialog box that pops up becomes the following image after I entered my Google username and password. I think I should be intercepting the login using Meteor.loginWithGoogle in a similar fashion to https://www.eventedmind.com/feed/meteor-customizing-login

However, I have no idea where to do that, since unlike in the video tutorial I am not building my own login event listener. I am simply using mrt:accounts-ui-bootstrap-dropdown. Any ideas? Thank you in advance.

解决方案

Turns out that the error message has nothing to do with the accounts-ui-bootstrap-dropdown. See this posting for the answer to this problem (as well as other problems) during external service login: Meteor JS accounts-google package not working for me

As for intercepting the external service login, Accounts.onCreateUser() is the place to do it. See the nice code example below.

isProdEnv = function () {
    if (process.env.ROOT_URL == "http://localhost:3000") {
        return false;
    } else {
        return true;
    }
}

Accounts.loginServiceConfiguration.remove({
    service: 'google'
});

Accounts.loginServiceConfiguration.remove({
    service: 'facebook'
});

Accounts.loginServiceConfiguration.remove({
    service: 'twitter'
});

Accounts.loginServiceConfiguration.remove({
    service: 'github'
});

if (isProdEnv()) {
    Accounts.loginServiceConfiguration.insert({
        service: 'github',
        clientId: '00000',
        secret: '00000'
    });
    Accounts.loginServiceConfiguration.insert({
        service: 'twitter',
        consumerKey: '00000',
        secret: '00000'
    });
    Accounts.loginServiceConfiguration.insert({
        service: 'google',
        appId: '00000',
        secret: '00000'
    });
    Accounts.loginServiceConfiguration.insert({
        service: 'facebook',
        appId: '00000',
        secret: '00000'
    });
} else {
    // dev environment
    Accounts.loginServiceConfiguration.insert({
        service: 'github',
        clientId: '11111',
        secret: '11111'
    });
    Accounts.loginServiceConfiguration.insert({
        service: 'twitter',
        consumerKey: '11111',
        secret: '11111'
    });
    Accounts.loginServiceConfiguration.insert({
        service: 'google',
        clientId: '11111',
        secret: '11111'
    });
    Accounts.loginServiceConfiguration.insert({
        service: 'facebook',
        appId: '11111',
        secret: '11111'
    });
}

Accounts.onCreateUser(function (options, user) {
    if (user.services) {
        if (options.profile) {
            user.profile = options.profile
        }
        var service = _.keys(user.services)[0];
        var email = user.services[service].email;
        if (!email) {
            if (user.emails) {
                email = user.emails.address;
            }
        }
        if (!email) {
            email = options.email;
        }
        if (!email) {
            // if email is not set, there is no way to link it with other accounts
            return user;
        }

        // see if any existing user has this email address, otherwise create new
        var existingUser = Meteor.users.findOne({'emails.address': email});
        if (!existingUser) {
            // check for email also in other services
            var existingGitHubUser = Meteor.users.findOne({'services.github.email': email});
            var existingGoogleUser = Meteor.users.findOne({'services.google.email': email});
            var existingTwitterUser = Meteor.users.findOne({'services.twitter.email': email});
            var existingFacebookUser = Meteor.users.findOne({'services.facebook.email': email});
            var doesntExist = !existingGitHubUser && !existingGoogleUser && !existingTwitterUser && !existingFacebookUser;
            if (doesntExist) {
                // return the user as it came, because there he doesn't exist in the DB yet
                return user;
            } else {
                existingUser = existingGitHubUser || existingGoogleUser || existingTwitterUser || existingFacebookUser;
                if (existingUser) {
                    if (user.emails) {
                        // user is signing in by email, we need to set it to the existing user
                        existingUser.emails = user.emails;
                    }
                }
            }
        }

        // precaution, these will exist from accounts-password if used
        if (!existingUser.services) {
            existingUser.services = { resume: { loginTokens: [] }};
        }

        // copy accross new service info
        existingUser.services[service] = user.services[service];
        existingUser.services.resume.loginTokens.push(
            user.services.resume.loginTokens[0]
        );

        // even worse hackery
        Meteor.users.remove({_id: existingUser._id}); // remove existing record
        return existingUser;                  // record is re-inserted
    }
});

This code is sourced from this blogpost.

这篇关于如何通过mrt:accounts-ui-bootstrap-dropdown使用Meteor.loginWithGoogle的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆