如何获得有关Facebook登录的更多信息

时间:2016-05-29 21:14:03

标签: javascript facebook

我正在尝试进行Facebook登录,但我希望获得有关该用户的更多信息,例如姓名,也可能是个人资料图片。

这就是我在做的事情:

.factory('Auth', function($http, $location, $rootScope, $alert, $window) {

    var token = $window.localStorage.token;
    if (token) {
      var payload = JSON.parse($window.atob(token.split('.')[1]));
      $rootScope.currentUser = payload.user;
    }

    // Asynchronously initialize Facebook SDK
    $window.fbAsyncInit = function() {
      FB.init({
        appId : '1234567890',
        responseType : 'token',
        status : true,
        cookie : true,
        xfbml : true,
        version : 'v2.4'
      });
    };

    // Asynchronously load Facebook SDK
    (function(d, s, id) {
      var js, fjs = d.getElementsByTagName(s)[0];
      if (d.getElementById(id)) {
        return;
      }
      js = d.createElement(s);
      js.id = id;
      js.src = "//connect.facebook.net/en_US/sdk.js";
      fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));

    return {
      facebookLogin: function() {
        FB.login(function(response) {
          FB.api('/me', function(profile) {
            var data = {
              signedRequest: response.authResponse.signedRequest,
              profile: profile
            };

            $http.post('/auth/facebook', data).success(function(token) {
              var payload = JSON.parse($window.atob(token.split('.')[1]));
              $window.localStorage.token = token;
              $rootScope.currentUser = payload.user;
              console.log('profile', payload);
              $location.path('/');
            });
          });
        }, { scope: 'email, public_profile' });
      }
    };
});

当我调用函数

FB.login(function(response) {...}

我得到的是这个

{
  "authResponse": {
    "accessToken": "EAAI3lCeCXL",
    "userID": "1062220283817044",
    "expiresIn": 6886,
    "signedRequest": "oVzEDRHPz4e3ammGG"
  },
  "status": "connected"
}

然后当调用后执行

        $http.post('/auth/facebook', data).success(function(token) {
          var payload = JSON.parse($window.atob(token.split('.')[1]));
          $window.localStorage.token = token;
          $rootScope.currentUser = payload.user;
          console.log(angular.toJson($rootScope.currentUser, 'pretty'));
          $location.path('/');

        });

我明白了

{
  "user": {
    "__v": 0,
    "name": "Marcelo Retana",
    "_id": "574b5b48d6742c401106c3f9",
    "facebook": {
      "id": "1062220283817044"
    }
  },
  "iat": 1464556360470,
  "exp": 1465161160470
}

以下是节点部分:

app.post('/auth/facebook', function(req, res, next) {
  var profile = req.body.profile;
  var signedRequest = req.body.signedRequest;
  var encodedSignature = signedRequest.split('.')[0];
  var payload = signedRequest.split('.')[1];

  var appSecret = '1234567890';

  var expectedSignature = crypto.createHmac('sha256', appSecret).update(payload).digest('base64');
  expectedSignature = expectedSignature.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');

  User.findOne({ facebook: profile.id }, function(err, existingUser) {
    if (existingUser) {
      var token = createJwtToken(existingUser);
      return res.send(token);
    }
    var user = new User({
      name: profile.name,
      facebook: {
        id: profile.id,
        email: profile.email
      }
    });
    user.save(function(err) {
      if (err) return next(err);
      var token = createJwtToken(user);
      res.send(token);
    });
  });
});

那么,有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您只需要询问您想要的字段:

FB.api('/me', {fields: 'name,first_name,last_name,picture,email'}, function(profile) {
    ...
});

它被称为“声明字段”,随附Graph API v2.4:https://developers.facebook.com/docs/apps/changelog#v2_4