ver tienes servicio permiso para google fue estaba error disabled_client deshabilitado cuenta crear configurar configuracion como clientes cliente claves activar oauth meteor

oauth - tienes - Usando el paquete de cuentas Meteor para enlazar mĂșltiples servicios



error disabled_client el cliente de oauth estaba deshabilitado (2)

Resuelto

¡He resuelto el problema mediante la ingeniería inversa de los paquetes accounts-oauth-X ! La solución óptima que maneja todos los casos de borde es tener una historia para los inicios de sesión y otra para las asociaciones explícitas. Aquí están las soluciones escritas en coffeescript alfabetizado.

Antes de:

Asegúrese de tener los paquetes requeridos:

meteor add google meteor add facebook meteor add oauth

Método para tener inicio de sesión multiservicio:

Esto se une automáticamente a las cuentas si tienen el mismo correo electrónico. Se utiliza mejor para iniciar sesión porque es robusto. Sin embargo, no es bueno para asociaciones explícitas porque si las direcciones de correo electrónico son diferentes, entonces no funcionará. (Y una combinación manual cerrará la sesión del usuario y lo obligará a volver a iniciar sesión). Para asociar explícitamente una cuenta, incluso si tiene un correo electrónico diferente, vea la solución que se encuentra debajo.

Código del lado del servidor:

Accounts.onCreateUser (options, user) -> user.city = null user.networks = [] user.attending =[] user.profile ?= {}

Debemos actuar con lógica adicional si el usuario se registró a través de un servicio de correo electrónico, para que podamos estandarizar la ubicación del nombre y el correo electrónico.

if user.services? service = _.keys(user.services)[0]

Compruebe si alguna cuenta existente ya tiene el correo electrónico asociado con el servicio. Si es así, simplemente incorpora la información del usuario en.

email = user.services[service].email if email? oldUser = Meteor.users.findOne({"emails.address": email})

Asegúrese de que la cuenta antigua tenga el objeto de servicios requerido.

if oldUser? oldUser.services ?= {} if service == "google" or service == "facebook"

Fusione la nueva clave de servicio en nuestro antiguo usuario. También verificamos si hay nuevos correos electrónicos para agregar a nuestro usuario. Luego elimine el usuario anterior de la base de datos, y simplemente devuélvalo de nuevo para volver a crearlo directamente. El supuesto nuevo usuario que se iba a crear se descarta.

oldUser.services[service] = user.services[service] Meteor.users.remove(oldUser._id) user = oldUser

De lo contrario, simplemente cree el usuario como de costumbre, estandarizando los campos de correo electrónico y nombre.

else if service == "google" or service == "facebook" if user.services[service].email? 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

Método para asociaciones explícitas:

Esto agrega servicios al hash de servicios en el registro de Usuario, idéntico a como si fuera creado por el sistema hash incorporado. El código debe ser del lado del cliente (para capturar el servicio o el token), y del lado del servidor (para hacer más llamadas a la API para capturar los datos del usuario y asociarlos con el registro del usuario)

Código del lado del cliente:

Esta función es el punto de entrada para agregar funciones a nuestra cuenta.

addUserService = (service) ->

Necesitamos usar el sistema de verificación de correo electrónico incorporado de Meteor si eligen el correo electrónico.

if service == "email" else switch service

Para los servicios estándar de oauth, solicitamos las credenciales en el lado del cliente y luego las transmitimos al servidor para que realice las llamadas API adicionales para recopilar la información necesaria y agregar esa información a nuestra cuenta.

when "facebook" Facebook.requestCredential( requestPermissions: ["email", "user_friends", "manage_notifications"], , (token) -> Meteor.call "userAddOauthCredentials", token, Meteor.userId(), service, (err, resp) -> if err? Meteor.userError.throwError(err.reason) ) when "google" Google.requestCredential requestPermissions: ["email", "https://www.googleapis.com/auth/calendar"] requestOfflineToken: true, , (token) -> Meteor.call "userAddOauthCredentials", token, Meteor.userId(), service, (err, resp) -> if err? Meteor.userError.throwError(err.reason)

solo tenemos que configurar un enlace simple para pegarlo juntos.

Template.userAddServices.events "click button": (e) -> e.preventDefault() service = $(event.target).data("service") addUserService(service)

Código del lado del servidor:

Aquí definimos los métodos del lado del servidor relacionados con el modelo de usuario.

Meteor.methods

Esto pasa los datos desde el lado del cliente, que ya tomó el token de acceso. Utiliza el token para descubrir el resto de la información sobre el usuario en ese servicio. A continuación, comprueba si esa cuenta ya está registrada y, de no ser así, la agrega a la cuenta actual.

userAddOauthCredentials: (token, userId, service) -> switch service when "facebook" data = Facebook.retrieveCredential(token).serviceData when "google" data = Google.retrieveCredential(token).serviceData selector = "services.#{service}.id" oldUser = Meteor.users.findOne({selector: data.id}) if oldUser? 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 }})

También podemos brillar en el correo electrónico de esta cuenta. Si aún no está en el usuario actual, podemos capturarlo y agregarlo.

if not _.contains(Meteor.user().emails, data.email) Meteor.users.update(userId, {$push: {"emails": {address: data.email, verified: true} }})

Así que Meteor tiene este gran paquete de cuentas que permite un inicio de sesión fácil mediante una contraseña u otros servicios. Sin embargo, actualmente estoy creando un servicio web con múltiples servicios requeridos (facebook / twitter / etc). El enlace aquí: ¿Cómo agregar inicios de sesión de servicios externos a una cuenta ya existente en Meteor? sugiere un "pirateo" creando cuentas duplicadas y simplemente fusionando los datos, pero me parece muy insatisfactorio.

Así que mis preguntas son:

1) ¿Existe una forma más elegante de usar los paquetes Accounts-xxx para crear un usuario pero con múltiples servicios adjuntos?

2) Si no es así, ¿puedo usar los paquetes ahora separados o simplemente para agregar tokens a un usuario? Si, por ejemplo, el token de github se "adjunta" manualmente en un punto posterior, ¿encontraría Accounts.loginWithGithub esa cuenta fusionada manualmente en un punto posterior?

Gracias por tu ayuda.


Eliminar el usuario existente puede crear problemas en algunos senarios. En mi caso de uso, necesito fusionar la cuenta de Google al iniciar sesión en el sistema con otra cuenta de usuario. Esto se puede lograr con las siguientes modificaciones.

Modificar Accounts.onCreateUser

Accounts.onCreateUser (función (opciones, usuario) {

if ( user.services ) service = _.keys( user.services )[0]; // get service type var email = user.services[service].email ; var oldUser = Meteor.users.findOne({ ''emails.address'': email }); if ( oldUser ){ oldUser.services = oldUser.services ? oldUser.services : {}; oldUser.services[service] = user.services[ service ]; return oldUser; } return user;

});

Modificar el paquete de base de cuentas

userId = Meteor.users.insert(fullUser);

La línea en la función Accounts.insertUserDoc de packages / accounts-base / accounts_server.js debe reemplazarse con el siguiente código. Espero que Meteor arregle esto. Hasta que haya que utilizar un paquete personalizado.

if(Meteor.users.findOne(fullUser._id)){ userId = fullUser._id; delete fullUser._id; Meteor.users.update(userId, {$set: fullUser}); } else userId = Meteor.users.insert(fullUser);