如何通过mrt:accounts-ui-bootstrap-dropdown使用Meteor.loginWithGoogle [英] How to use Meteor.loginWithGoogle with mrt:accounts-ui-bootstrap-dropdown
问题描述
输入我的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屋!