2013-12-05 4 views
10

Я настраиваю приложение метеорита, которое включает в себя регистрацию с именем пользователя и паролем, а затем, надеемся, подключить эту учетную запись к facebook и twitter.Подключить службу к существующему счету метеоров

У меня есть первая часть, работающая легко, просто с пакетом счетов. Но когда у меня есть зарегистрированный пользовательский вызов Meteor.loginWithFacebook(), он регистрирует их и создает новую учетную запись. То, что я хочу, - это то, что добавляет учетные данные facebook для текущего пользователя.

Метеорные документы имеют это:

{ 
    _id: "bbca5d6a-2156-41c4-89da-0329e8c99a4f", // Meteor.userId() 
    username: "cool_kid_13", // unique name 
    emails: [ 
    // each email address can only belong to one user. 
    { address: "[email protected]", verified: true }, 
    { address: "[email protected]", verified: false } 
    ], 
    createdAt: Wed Aug 21 2013 15:16:52 GMT-0700 (PDT), 
    profile: { 
    // The profile is writable by the user by default. 
    name: "Joe Schmoe" 
    }, 
    services: { 
    facebook: { 
     id: "709050", // facebook id 
     accessToken: "AAACCgdX7G2...AbV9AZDZD" 
    }, 
    resume: { 
     loginTokens: [ 
     { token: "97e8c205-c7e4-47c9-9bea-8e2ccc0694cd", 
      when: 1349761684048 } 
     ] 
    } 
    } 
} 

, который, как представляется, учетная запись с именем пользователя, который также проверку подлинности с Facebook. Но я не уверен, что это просто пример того, чего вы не можете достичь с помощью базового материала Meteor.

То, что я пытаюсь сделать это в основном

Meteor.connectWithExternalAccount(); 

который проходит один и тот же процесс, как Meteor.loginWithExternalAccount(), но только добавляет информацию, вошедшего в систему пользователя.

Если кто-то может просто объяснить базовый пакет учетных записей, чтобы я мог знать, с чего начать, что было бы здорово.

Кроме того, кто-нибудь знает, будет ли это включено в любые будущие версии Meteor?

+0

https://github.com/meteor/meteor/pull/1133 – emgee

+0

emgee, это похоже на то, что я ищу! Проблема в том, что моя папка «account-base» не имеет файла account_client.js. По крайней мере, не там, где я ищу, что находится в файле проекта. Meteor/local/build/app/packages – fnsjdnfksjdb

ответ

3

Так что были работы по решению этой проблемы, но, к сожалению, запрос на извлечение https://github.com/meteor/meteor/pull/1133 никогда не сливался. Вероятно, ваш лучший выбор - проверить группы Meteor-core Google и посмотреть, есть ли какие-либо комментарии к нему, а если нет, посмотрите, можете ли вы заставить основного разработчика прокомментировать это.

Если вы хотите по-прежнему использовать запрос тянущего, что вы могли бы сделать, это удалить различный Метеор accounts-* пакетов, а затем в корневом каталоге вашего проекта, создать папку /packages и скопировать yubozhao-й заплата accounts-* пакетов там (вероятно, смарт append -custom). Затем вы добавили meteor add accounts-base-custom и т. Д., Чтобы добавить их в свой проект.

Обратите внимание, что yubozhao написал это 6-7 месяцев назад, и вам может потребоваться придерживаться любой версии Meteor, которая была текущей, а затем для ее работы.

Обновление апреля 2014: Там в пакет Атмосфера теперь имеет подобный случай использования, которые могут быть полезны: https://atmospherejs.com/package/accounts-merge

+0

Я попробую клонировать файлы из запроса на перенос в пакет и просто надеюсь, что это работает. Если это не так, я думаю, я просто попробую прочитать его и найти то, что сломалось за последние шесть месяцев. Я не мог найти никакого обсуждения этого вопроса в группе meteor google. – fnsjdnfksjdb

+0

Я не мог заставить эту технику работать вообще. Любые другие идеи? – fnsjdnfksjdb

+0

Текущая версия Meteor с момента первоначального написания запроса на изгиб 0.6.4 - может попробовать «meteor run --release 0.6.4» и посмотреть, можете ли вы заставить его работать в этой версии. – emgee

5

Вот код, который работал для меня (внутри папки сервера):

Accounts.onCreateUser(function(options, user) { 
    var email, oldUser, service; 
    /* 
    user.groups = { 
     created: "", 
     invited:"", 
     RSVP:{ 
      coming:"", 
      notComing:"", 
      noReplay:"" 
     } 
    }; 
    */ 
    if (user.profile == null) { 
     user.profile = options.profile 
    } 
    if (user.services != null) { 
     service = _.keys(user.services)[0]; 
     email = user.services[service].email; 
     if (email != null) { 
      oldUser = Meteor.users.findOne({ 
       "emails.address": email 
      }); 
      if (oldUser != null) { 
       if (oldUser.services == null) { 
        oldUser.services = {}; 
       } 
       if (service === "google" || service === "facebook") { 
        oldUser.services[service] = user.services[service]; 
        Meteor.users.remove(oldUser._id); 
        user = oldUser; 
       } 
      } else { 
       if (service === "google" || service === "facebook") { 
        if (user.services[service].email != null) { 
         user.emails = [ 
          { 
           address: user.services[service].email, 
           verified: true 
          } 
         ]; 
        } else { 
         throw new Meteor.Error(500, "" + service + " account has no email attached"); 
        } 
        user.profile.name = user.services[service].name; 
       } 
      } 
     } 
    } 
    return user; 
}); 

userAddOauthCredentials: function(token, userId, service) { 
     var data, oldUser, selector, updateSelector; 
     switch (service) { 
      case "facebook": 
       data = Facebook.retrieveCredential(token).serviceData; 
       break; 
      case "google": 
       data = Google.retrieveCredential(token).serviceData; 
     } 
     selector = "services." + service + ".id"; 
     oldUser = Meteor.users.findOne({ 
      selector: data.id 
     }); 
     if (oldUser != null) { 
      throw new Meteor.Error(500, ("This " + service + " account has already") + "been assigned to another user."); 
     } 
     updateSelector = "services." + service; 
     Meteor.users.update(userId, { 
      $set: { 
       updateSelector: data 
      } 
     }); 
     if (!_.contains(Meteor.user().emails, data.email)) { 
      return Meteor.users.update(userId, { 
       $push: { 
        "emails": { 
         address: data.email, 
         verified: true 
        } 
       } 
      }); 
     } 
    } 

внутри клиента папки: расслоение плотной

var addUserService; 

addUserService = function(service) { 
    if (service === "email") { 
} else { 
    switch (service) { 
     case "facebook": 
      return Facebook.requestCredential({ 
       requestPermissions: ["email", "user_friends", "manage_notifications"] 
      }, function(token) { 
       return Meteor.call("userAddOauthCredentials", token, Meteor.userId(), service, function(err, resp) { 
        if (err != null) { 
         return Meteor.userError.throwError(err.reason); 
        } 
       }); 
      }); 
     case "google": 
      return Google.requestCredential({ 
       requestPermissions: ["email", "https://www.googleapis.com/auth/calendar"], 
       requestOfflineToken: true 
      }, function(token) { 
       return Meteor.call("userAddOauthCredentials", token, Meteor.userId(), service, function(err, resp) { 
        if (err != null) { 
         return Meteor.userError.throwError(err.reason); 
        } 
       }); 
      }); 
    } 
} 

};

же JS файл внутри событий шаблона:

"click a": function(e) { 
     var service; 
     e.preventDefault(); 
     service = $(event.target).data("service"); 
     return addUserService(service); 
    } 

и для HTML только что сделали это:

<div class="social"><a id="fb" data-service="facebook"><img src="/../facebook.png"></a></div> 
    <div class="social"><a id="go" data-service="google"><img src="/../googleplus.png"></a></div> 

главным образом вам необходимо иметь данные-сервис установлен в вашей службе, то шаблон событие click принимает службу данных и выполняет addUserService (данные передаются).

надеюсь, что это сработает, сообщите.

+0

Это зависит от получения электронной почты пользователей при регистрации, правильно? И это не работает с твиттером, потому что вы не можете получить почту пользователей Twitter через api. Это не подходит для моего использования, так как я не прошу электронной почты при регистрации, и твиттер очень важен. – fnsjdnfksjdb

+0

Да, это rilies на получение электронной почты от пользователя, я не знаю о твиттере, но кажется правильным действовать на основе адреса электронной почты, очевидно, потому что его uniqe. –

+0

Я надеюсь на ответ, который просто использует тот факт, что пользователь уже зарегистрировался в учетной записи, выберите, к какой учетной записи добавить. – fnsjdnfksjdb

Смежные вопросы