node.js - 使用 Passport 对 Facebook 进行身份验证不起作用

标签 node.js facebook authentication express passport.js

我正在尝试使用我的应用程序进行 Facebook 身份验证。但到目前为止,我的尝试没有成功。我是 Node 的新手。

当用户单击该 fb 登录按钮时,需要将请求带到/auth/facebook 路由,在那里它们将被传递给 Passport Strategy。他们将在那里被发送到 Facebook 进行身份验证。但它永远不会发生。 Facebook 身份验证窗口永远不会显示。似乎重定向不起作用。我搜索了几个小时,但没有找到解决方案。

enter image description here

以下是我认为对本文很重要的代码部分

我已经把我的 App ID 和 App Secret 放在 config/auth.js

module.exports = {

    'facebookAuth' : {
        'clientID'      : 'my-AppID-here', 
        'clientSecret'  : 'my-App-secret-here', 
        'callbackURL'   : 'http://localhost:8080/auth/facebook/callback'
    }
};

config/passport.js 中使用 Facebook 进行身份验证并处理回调的策略

    var LocalStrategy    = require('passport-local').Strategy;
    var FacebookStrategy = require('passport-facebook').Strategy;

    // load up the user model and auth variables
    var User       = require('../app/models/user');
    var configAuth = require('./auth');

    module.exports = function(passport) {

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

        passport.deserializeUser(function(id, done) {
            User.findById(id, function(err, user) {
                done(err, user);
            });
        });    

        // Facebook Strategy
        passport.use(new FacebookStrategy({

            // pull app id and secret from our auth.js file
            clientID        : configAuth.facebookAuth.clientID,
            clientSecret    : configAuth.facebookAuth.clientSecret,
            callbackURL     : configAuth.facebookAuth.callbackURL

        },

        // facebook will send back the token and profile
        function(token, refreshToken, profile, done) {

            process.nextTick(function() {

                // find the user in the database based on their facebook id
                User.findOne({ 'facebook.id' : profile.id }, function(err, user) {

                    if (err)
                        return done(err);

                    // if the user is found, then log them in
                    if (user) {
                        return done(null, user); 
                    } else {
                        // if there is no user found with that facebook id, create them
                        var newUser            = new User();

                        // set all of the facebook information in our user model
                        newUser.facebook.id    = profile.id; // set the users facebook id                   
                        newUser.facebook.token = token; // we will save the token that facebook provides to the user                    
                        newUser.facebook.name  = profile.name.givenName + ' ' + profile.name.familyName; // look at the passport user profile to see how names are returned
                        newUser.facebook.email = profile.emails[0].value; // facebook can return multiple emails so we'll take the first

                        // save our user to the database
                        newUser.save(function(err) {
                            if (err)
                                throw err;

                            // if successful, return the new user
                            return done(null, newUser);
                        });
                    }

                });
            });

        }));

    };

来自app/routes.js的相关路由

    module.exports = function(app, passport) {

        // route for facebook authentication and login
        app.get('/auth/facebook', passport.authenticate('facebook', { scope : 'email' }));

        // handle the callback after facebook has authenticated the user
        app.get('/auth/facebook/callback',
            passport.authenticate('facebook', {
                successRedirect : '/profile',
                failureRedirect : '/'
            }));

        // route for logging out
        app.get('/logout', function(req, res) {
            req.logout();
            res.redirect('/');
        });

    };

View 中的登录按钮代码

<a href="/auth/facebook" class="btn btn-primary"><span class="fa fa-facebook"></span> Facebook</a>

最佳答案

问题是我没有在 Facebook 应用程序设置中附加域名(在我的例子中是 http://localhost:8080)。

转到“基本”选项卡下的“设置”页面

  1. 点击“+ 添加平台”并选择“网站”
  2. 在您刚刚添加的网站出现的框中:站点 URL:http://localhost:8080/
  3. 在上方的框中(设置 => 基本):应用程序域:localhost
  4. 点击右下角的“保存更改”

完成后我的问题就解决了。

关于node.js - 使用 Passport 对 Facebook 进行身份验证不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25478210/

相关文章:

node.js - npm start 出现问题(错误 : spawn cmd ENOENT)

node.js - RCS 如何与 botframework 结合使用

c# - 在 .net 中获取 facebook 广告 api 错误

python /Django : How to display error messages on invalid login?

android - 多个 GoogleApiClient 未触发 connect()

javascript - 如何使用 Puppeteer 覆盖 native 功能

javascript - 如何让我的 Discord 机器人提及我提到的某人?

android - MessageDialog 使用适用于 Android 的 Facebook SDK 意外关闭

facebook - Canvas 应用程序可以做什么而使用 Facebook 的 SDK 的外部站点不能?

ruby-on-rails - 一起使用设计/Cancan/Rolify