1

我正在尝试在我的机车项目中配置护照推特。

问题是点击 /auth/twitter 网址后什么也没有发生。

编辑:我点击了控制器,但似乎没有调用 twitter。

我所做的是在 routes.js 上设置匹配 /auth/twitter 并将其映射到 auth_controller.js

类似于下面的代码:

  • 路由.js

    this.match('auth/twitter/', 'auth#twitter');
    
    this.match('auth/twitter/callback/', 'auth#callback');
    
  • auth_controller.js

     var locomotive = require('locomotive')
    , Controller = locomotive.Controller
    , passport = require('passport');
    
    var AuthController = new Controller();
    
    AuthController.twitter = function() {
    
    console.log('[##] AuthController.twitter [##]');     
    
    passport.authenticate('twitter'), function(req, res) {};  
    }
    
    AuthController.callback = function() {
    console.log('[##] AuthController.callback [##]');
    
    passport.authenticate('twitter', { failureRedirect: '/show' }),
      function(req, res) {
        res.redirect('/list');
      };    
     } 
    
    module.exports = AuthController;
    

我真的不知道这是否是在机车上使用它的正确方法,任何帮助将不胜感激。

干杯,法比奥

4

1 回答 1

6

需要先配置护照。可以在此处找到有关如何执行此操作的示例。在 LocomotiveJS 的情况下,放置该配置的明显位置是初始化程序:

// config/initializers/10_passport_twitter.js <-- you can pick filename yourself
module.exports = function(done) {    
  // At least the following calls are needed:
  passport.use(new TwitterStrategy(...));
  passport.serializeUser(...);
  passport.deserializeUser(...);
};

接下来,配置会话并初始化 Passport:

// config/environments/all.js
module.exports = {
  ...
  // Enable session support.
  this.use(connect.cookieParser());
  this.use(connect.session({ secret: YOUR_SECRET }));
  // Alternative for the previous line: use express.cookieSession() to enable client-side sessions
  /*
    this.use(express.cookieSession({
     secret  : YOUR_SECRET,
     cookie  : {
       maxAge  : 3600 * 6 * 1000 // expiry in ms (6 hours)
     }
    }));
  */

  // Initialize Passport.
  this.use(passport.initialize());
  this.use(passport.session());
  ...
};

接下来,配置路由:

// config/routes.js
this.match('auth/twitter/', 'auth#twitter');
this.match('auth/twitter/callback/', 'auth#callback');

因为是中间件,所以在控制器中使用钩子passport.authenticate更容易:before

// app/controllers/auth_controller.js
...
AuthController.twitter = function() {
  // does nothing, only a placeholder for the following hook.
};
AuthController.before('twitter', passport.authenticate('twitter'));

AuthController.callback = function() {
  // This will only be called when authentication succeeded.
  this.redirect('/list');
}
AuthController.before('callback', passport.authenticate('twitter', { failureRedirect: '/auth/twitter' })};

免责声明:我没有测试上面的代码,我是基于我最近在一个项目中使用的我自己的代码,它使用passport-local而不是passport-twitter. 但是,除了passport-local.

于 2013-02-19T09:53:13.067 回答