javascript - que - Conecte el servicio a la cuenta de meteoros existente
onclick void 0 (2)
Aquí hay un código que funcionó para mí (dentro de la carpeta del servidor):
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
}
}
});
}
}
dentro de la carpeta del cliente js:
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);
}
});
});
}
}
};
mismo archivo js dentro de los eventos de plantilla:
"click a": function(e) {
var service;
e.preventDefault();
service = $(event.target).data("service");
return addUserService(service);
}
y para el html acaba de hacer esto:
<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>
principalmente necesita tener el servicio de datos configurado para su servicio, luego el evento de clic de plantilla toma el servicio de datos y ejecuta addUserService (data-passed).
Espero que funcione, por favor avíseme.
Estoy configurando una aplicación de meteoritos que implica registrarse con un nombre de usuario y contraseña, y luego con suerte conectar esa cuenta con Facebook y Twitter.
Tengo la primera parte en funcionamiento fácilmente, solo con el paquete de cuentas. Pero cuando tengo un usuario conectado, llamo Meteor.loginWithFacebook (), los desconecta y crea una nueva cuenta. Lo que quiero es algo que agregue las credenciales de Facebook al usuario que está conectado actualmente.
Los meteorólogos tienen esto:
{
_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 }
]
}
}
}
que parece ser una cuenta con un nombre de usuario que también está autenticado con Facebook. Pero no estoy seguro de si ese es solo un ejemplo que en realidad no puedes lograr con material básico de Meteor.
Lo que intento hacer es básicamente
Meteor.connectWithExternalAccount();
que ejecuta el mismo proceso que Meteor.loginWithExternalAccount (), pero simplemente agrega la información al usuario que ha iniciado sesión actualmente.
Si alguien pudiera explicar un poco el paquete de base de cuentas, así podría saber por dónde empezar, sería genial.
Además, ¿alguien sabe si esto se incluirá en cualquier versión futura de Meteor?
Así que ha habido trabajo para resolver este problema, pero lamentablemente la solicitud de extracción https://github.com/meteor/meteor/pull/1133 nunca se fusionó. Probablemente su mejor opción es consultar los Grupos de Google de núcleo de meteoros y ver si hubo algún comentario al respecto y, de no ser así, ver si puede obtener un desarrollador central para comentar sobre él.
Si desea seguir utilizando la solicitud de extracción, lo que podría hacer es eliminar los diversos paquetes de accounts-*
Meteor accounts-*
, luego en la raíz de su proyecto, crear una carpeta /packages
y copiar los paquetes de accounts-*
parcheadas de yubozhao allí (probablemente sea inteligente para anexar -custom
). A continuación, meteor add accounts-base-custom
, etc. para agregarlas a su proyecto.
Sin embargo, tenga en cuenta que yubozhao escribió esto hace 6-7 meses y es posible que tenga que seguir con la versión de Meteor actual para que funcione.
Actualización de abril de 2014: ahora hay un paquete de Atmosphere que tiene un caso de uso similar que podría ser útil: https://atmospherejs.com/package/accounts-merge