Facebook登录和node js服务器

Facebook login and node js server

本文关键字:js 服务器 node 登录 Facebook      更新时间:2023-09-26

我正在尝试创建一个类似于Tinder的android应用程序。

到目前为止,我所拥有的是登录facebook,它的工作原理是这样的:用户发送访问令牌到我的服务器(在node js中编写),然后它使用paspport-facebook-token库授权他。

现在我需要创建一个使用mongoose的用户数据库。我应该怎么做,在哪里做?如何保存用户,如果我只有facebook登录?我需要用什么来拯救用户群?

这是我的服务器路由。js代码:

    module.exports = function(app) {

    app.use(passport.initialize());
    app.use(passport.session());
    app.use(bodyParser.urlencoded({ extended: false }));
    app.use(bodyParser.json());


    app.get('/', function(req, res) {
        res.end("Node-Android-Chat-Project"); 
    });


    passport.use(new FacebookStrategy({
            clientID: *****1246,
            clientSecret: "******",
            callbackURL: "http://localhost:8080/auth/facebook/callback"
        },
        function(accessToken, refreshToken, profile, done) {
            console.log("accesToken ", accessToken)
            console.log ("refreshToken", refreshToken)
            console.log ("profile", profile)
            user = {} // find or create a user in your database
            done(null, user)
        }
    ));
    app.get('/auth/facebook/callback',
        passport.authenticate('facebook', {
            successRedirect : '/profile',
            failureRedirect : '/'
        }));
// Redirect the user to Facebook for authentication.  When complete,
// Facebook will redirect the user back to the application at
//     /auth/facebook/callback
    app.post('/auth/facebook/token', function(req, res, next) {
        passport.authenticate(['facebook-token'], function(err, user, info) {
            if (err) {
                return next(err); // will generate a 500 error
            }
            // Generate a JSON response reflecting authentication status
            if (! user) {
                console.log(req.user);
                return res.send({ success : false, message : 'authentication failed' });
            }
            console.log("Success!!");
                return res.send({ success : true, message : 'authentication succeeded' });
        })(req, res, next);
    });

    /*app.post('/auth/facebook/token',
        passport.authenticate('facebook-token'),
        function (req, res) {
            console.log(req)
            // do something with req.user
            res.send(req.user? 200 : 401);
        }
    ); */
    //app.get('/auth/facebook', passport.authenticate('facebook'));
//app.get(, );
// Facebook will redirect the user to this URL after approval.  Finish the
// authentication process by attempting to obtain an access token.  If
// access was granted, the user will be logged in.  Otherwise,
// authentication has failed.
    app.get('/auth/facebook/callback',
        passport.authenticate('facebook', { successRedirect: '/',
            failureRedirect: '/login' }));

    passport.serializeUser(function(user, done) {
        done(null, user);
    });
    passport.deserializeUser(function(user, done) {
        done(null, user);
    });
};

您几乎准备好了,现在需要做的就是将该用户保存到db中。我为猫鼬使用了一个漂亮的小插件findOneOrCreate,其中为findAndModify提供了一个快捷方法,它实际上是连续查找和创建(查看这个堆栈溢出答案以获得真正的findAndModify)。您可以使用upsert选项来获得此行为)

下面的代码将初始化User mongoose模式。把它放在node js服务器的init部分。
var mongoose = require('mongoose');
var findOneOrCreate = require('mongoose-find-one-or-create');
var User = new mongoose.Schema({
    facebookId: {
        type: 'String',
        unique: true,
        sparse: true
    },
    firstName: {
        type: 'String',
        match: mongo.nameRegex
    },
    lastName: {
        type: 'String',
        match: mongo.nameRegex
    },
    birthday: {type: 'Date'}
}, { collection: 'users' });
User.plugin(findOneOrCreate);

然后使用以下代码:

passport.use(new FacebookStrategy({
        clientID: *****1246,
        clientSecret: "******",
        callbackURL: "http://localhost:8080/auth/facebook/callback"
    },
    function(accessToken, refreshToken, profile, done) {
        console.log("accesToken ", accessToken)
        console.log ("refreshToken", refreshToken)
        console.log ("profile", profile)
        var user = {
             facebookId: profile.id,
             firstName: profile._json.first_name,
             lastName: profile._json.last_name,
             birthday: profile._json.birthday
        };
        //the same User variable from above
        User.findOneOrCreate({facebookId: profile.id}, user, function (err, user) {
             return done(err, user, {type: 'facebook'});
        });
    }
));

之后,在你的路由处理程序中,你将有权访问当前在req.user中认证的用户。

,

app.get('/me', passport.authenticate('facebook-token'), function(req, res) {
    res.status(200).send(req.user);
});

Facebook登录已经转移到一个新的GraphQL api。您可以在这里看到如何将Facebook登录与Node.js服务器集成:https://medium.com/authpack/facebook-auth-with-node-js-c4bb90d03fc0