Meteor: внедрить пакет facebook за пределами аккаунтов-facebook

У меня есть приложение Meteor с многоэтапным процессом регистрации. Учетные записи основаны на пакете accounts-password. На этапе, предшествующем созданию учетной записи, пользователю необходимо предоставить некоторую информацию о профиле.

Я хотел бы, чтобы пользователь мог запустить поток Facebook OAuth, который предварительно заполняет поля профиля информацией, полученной из Facebook.

Все это должно произойти до создания учетной записи. Я хочу реализовать это с пакетом facebook, поддерживающим accounts-facebook.

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

Любые указатели относительно того, как это должно работать, будут высоко оценены.

Facebook.requestCredential(function (credentialTokenOrError) {
  if (credentialTokenOrError && credentialTokenOrError instanceof Error) {
    // Error...
    console.log(credentialTokenOrError);
  } else {
    // Credential Token string
    console.log(credentialTokenOrError);
    // Now perhaps a Meteor.call to a server method that
    // 1. Retrieves an access token
    // 2. Hits the graph API to get profile information and returns it to the client
  }
});

Спасибо, Крис


person chriswessels    schedule 09.07.2015    source источник


Ответы (1)


У меня была такая же проблема с преобразованием credentialToken в accessToken, только с Github. Я составил суть с кодом, который должен работать очень похоже. По сути, есть два шага:

  1. В вашей функции обратного вызова Facebook.requestCredential вызовите OAuth._retrieveCredentialSecret(tokenOrError), результатом чего будет credentialSecret. Затем используйте Meteor.call, передавая tokenOrError и credentialSecret, чтобы вызвать Meteor.method, который вы настроите на следующем шаге.

код (на клиенте):

Github.requestCredential({
  loginStyle: 'popup',
  requestPermissions: ['gist']
}, function(tokenOrError) {
  if (tokenOrError && tokenOrError instanceof Error) {
    // Throw a Meteor error
    console.log('error getting the token');
    return;
  }
  var credentialSecret = OAuth._retrieveCredentialSecret(tokenOrError);
  Meteor.call('getGithubAccessToken', tokenOrError, credentialSecret, function(err, accessToken) {});
});
  1. На сервере настройте Meteor.method, который принимает ваши credentialToken и credentialSecret и вызывает Facebook.retrieveCredential. Эта функция возвращает объект учетных данных из коллекции _pendingCredentials Mongo перед его удалением из коллекции. Маркер доступа — credentials.serviceData.accessToken. Объект учетных данных потенциально может быть сохранен в объекте пользователя в коллекции Meteor.users (как в пакетах accounts) или отправлен обратно пользователю.

код (на сервере):

  Meteor.methods({
    getGithubAccessToken: function(credentialToken, credentialSecret) {
      var credentials = Github.retrieveCredential(credentialToken, credentialSecret);
      console.log('accessToken:', credentials.serviceData.accessToken);
      return credentials.serviceData.accessToken;
    }
  });

Я не знаком со спецификой Facebook Graph API, поэтому после этих шагов вы будете предоставлены сами себе. Удачи!

person sunnyg    schedule 26.07.2015