【问题标题】:passport.authenticate('facebook') times out waiting for localhostpassport.authenticate('facebook') 等待本地主机超时
【发布时间】:2016-12-09 04:41:21
【问题描述】:

我正在尝试使用 passport-js 将 facebook 登录实现到现有的快速应用程序中。在documentation 之后,这似乎很前进 - 但现在我遇到了一个我不知道该怎么做的地方。

基本上,一旦我在浏览器中访问路由 /auth/facebook,浏览器就会超时等待服务器。控制台中没有错误 - 我只能看到请求的日志。在护照功能上放置断点也无济于事。

所以我真的不知道我可以在这里调试或尝试更改什么。

这是我的用户模型:

let mongoose = require('mongoose');
let Schema = mongoose.Schema;

let findOrCreate = require('mongoose-findorcreate');

// User schema definition
let UserSchema = new Schema(
    {
      provider: { type: String, required: true },
      id: { type: String, default: 'unknown' },
      disaplyName: { type: String, default: 'unknown' },
      name: { type: Object },
      emails: { type: Array },
      photos: { type: Array },
      createdAt: { type: Date, default: Date.now },
      updatedAt: { type: Date, default: Date.now },
    }
);

UserSchema.plugin(findOrCreate);

// Sets the updatedAt parameter equal to the current time
UserSchema.pre('save', (next) => {
  now = new Date();
  if(!this.updatedAt) {
    this.updatedAt = now;
  }
  next();
});

module.exports = mongoose.model('user', UserSchema);

脸书路线:

let passport = require('passport');
let FacebookStrategy = require('passport-facebook').Strategy;

let User = require('../models/user');

passport.use(new FacebookStrategy({
    clientID: 123456,
    clientSecret: 'mysupersecretsecret',
    callbackURL: 'http://localhost:1337/auth/facebook/callback'
  },
  (accessToken, refreshToken, profile, done) => {
    User.findorCreate((err, user) => {
      if (err) {
        return done(err);
      }
      done(null, user);
    })
  }
));

function redirectFB() {
  passport.authenticate('facebook');
}

function callbackFB() {
  passport.authenticate('facebook'), {
    successRedirect: '/word',
    failureRedirect: '/'
  }
}

module.exports = { redirectFB, callbackFB };

这些路由的服务器使用情况(我只是在这里添加服务器文件的相关部分):

let facebook = require('./app/routes/facebook')

app.route('/auth/facebook')
    .get(facebook.redirectFB);

app.route('auth/facebook/callback')
    .get(facebook.callbackFB);

谁能发现我做错了什么?

【问题讨论】:

    标签: node.js passport.js passport-facebook


    【解决方案1】:

    问题在于您如何定义和使用您的 facebook 路由。 对passport.authenticate 的调用会返回一个请求处理程序,但您不会将它传递给app.route(...).get。你根本不使用它。

    例如redirectFB 应该是:

    function redirectFB() {
      return passport.authenticate('facebook');
    }
    

    app.route('/auth/facebook')
      .get(facebook.redirectFB());
    

    【讨论】:

    • 这不会运行。我得到错误:Route.get() 需要回调函数,但得到了一个 [object Object]。不带括号调用 redirectFB 又会超时。
    • 这看起来很奇怪,我自己尝试了非常简化的示例 - 请查看pastebin.com/Y8D1UJUV(仅redirectFB 部分已修复)当我运行此示例并导航到localhost:3002/auth/facebook时,我成功重定向到脸书。由于凭据无效,它会引发错误,但无论如何。请与您所拥有的进行比较,也许这会给您一个想法。
    • 正如你所说,问题是我没有返回函数。一旦我把它整理好,加上一些小错别字,一切都正常了。谢谢
    猜你喜欢
    • 2011-08-07
    • 2015-02-23
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    相关资源
    最近更新 更多