Monday, May 1, 2017

Handling authentication in Nodejs with passport-facebook-token, request coming from frontend Facebook SDK

Leave a Comment

I am working on a Unity App. For login, there are two methods, one using Email and another using Facebook. In case of login separately, I do not have any problem. Registration and Login with Email works perfectly. And Login with Facebook works perfectly as well. Here's the workflow, I created just to make you clear. Login work flow

tl;dr [read update]

There's another schema for account, which is used for login.

var Account = new Schema({   email: String,   password: String,   facebookId: String }); 

Things to know about the backend API.

  1. Passport is used for Authentication
  2. Successful login returns email and token to the client through API.
  3. On client, token is most to play game and use the overall features.

As I said, I have already covered the part when if a client registers and login using email, then client can use the app. But my confusion is handling the logins with Facebook. Facebook SDK is already integrated with the Unity App, and Login is success.

Now, how can I use the Facebook login information that is generated by the Facebook SDK onto my back end, so that I can authorize the user throughout the system, as done in email login.

Going through other questions in SO and Google, I came across passport-facebook-token, I also tried using the plugin but could not came up with the logic and flow for handling the data from SDK into the Nodejs API. Can someone me help understand how it is done?

Update 1: Using passport-facebook-token

Strategy on index.js

passport.use(new FacebookTokenStrategy({     clientID: FACEBOOK_APP_ID,     clientSecret: FACEBOOK_APP_SECRET   }, function(accessToken, refreshToken, profile, done) {     Account.findOrCreate({facebookId: profile.id}, function (error, user) {       return done(error, user);     });   } )); 

Controller API

api.post('/auth/facebook/token', passport.authenticate('facebook-token'), function (req, res) {   console.log(req.user);   // do something with req.user   res.sendStatus(req.user? 200 : 401); } ); 

Now, there is no error shown, but the data is not inserted into Account Schema, I have this findOrCreate() function in Model.

Account.statics.findOrCreate = function findOrCreate(profile, cb){ var userObj = new this(); this.findOne({facebookId : profile.id},function(err,result){     if(!result){         userObj.facebookId = profile.id;         //....         userObj.save(cb);     }else{         cb(err,result);     } }); }; 

1 Answers

Answers 1

you can use facebook-passport for that, you can check the documentation here: https://github.com/jaredhanson/passport-facebook but basically, after you have already set up your developer account and got your keys from the developer site of facebook you can implement a FacebookStrategy object like following where you have to specify your credential and also a callback that in the documentation example is an http request to another resource of an express server where you can then save the data to mongo

passport.use(new FacebookStrategy({     clientID: FACEBOOK_APP_ID,     clientSecret: FACEBOOK_APP_SECRET,     callbackURL: "http://localhost:3000/auth/facebook/callback" }, function(accessToken, refreshToken, profile, cb) {     User.findOrCreate({ facebookId: profile.id }, function (err, user) {     return cb(err, user);    });  }  )); 
If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment