如何使用Github Oauth作为Nodejs?

时间:2015-01-02 04:36:25

标签: node.js authentication express

我已经从Github,npm模块和SO上的类似问题的指令中剪切并粘贴了每个代码块。无论如何,解决方案都没有成功。我正在使用Ubuntu 14.04,Nodejs Express和Postgresql。我想我现在不知道我在做什么。这是我目前得到的错误: Terminal Error Message

我倾向于认为我的代码存在问题,而且这个错误是由于这个而不是实际模块的失败。为了以防万一,我已经向作者报告过了。这是来自app.js的代码:

// POSTGRESQL AUTHORIZATION FUNCTION
var findOrCreate = function(username,id) {
if (db.query("SELECT EXISTS(select username from users where github_id="+id)) {
    passport.authenticate('local');
    res.redirect('/', { user: req.user });
} else {
    db.query("INSERT INTO users (username, github_id) VALUES ($1, $2)"), [username, id], function(err, res) {
        if (!err) {
            passport.authenticate('local');
            res.render('/', { user: req.user });
        }
        console.log(err);
    };
}
};

// GITHUB AUTHENTICATION
passport.use(new GitHubStrategy({
    clientID: GITHUB_CLIENT_ID,
    clientSecret: GITHUB_CLIENT_SECRET,
    callbackURL: "http://localhost:5000/auth/github/callback"
  },
  function(accessToken, refreshToken, profile, done) {
    process.nextTick(function() {
        console.log("Access Token: " + accessToken);
        console.log(profile.username);
        findOrCreate(profile.username, profile.id);
        return done(null, profile);
    });
}));

在谷歌浏览器的控制台中,我尝试使用Github登录时收到ERR_CONNECTION_REFUSED

我正在尝试通过Github授权登录,检查我的数据库中的users表的Github凭据。如果在数据库中找到用户,请使用找到的凭据登录。如果没有,请存储他们的用户数据并登录。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

我假设你正在使用node-postgres模块pg,pg.query接受回调,所以让我们利用这个功能并实际分离关注点:

我还真的建议使用passport-github2模块来维护github oauth策略并保持最新状态:

var findByGithubId= function(githubId, callback) {
  return db.query('SELECT * FROM "users" WHERE github_id = $1', [githubId], callback);
};

并创建:

var createOne = function(username, githubId, callback){
  return  db.query("INSERT INTO users (username, github_id) VALUES ($1, $2)", [username, githubId], callback);
};

为github定义护照处理程序:

var passportGithubHandler = function(accessToken, refreshToken, profile, done) {
  findByGithubId( profile._json.id, function(err, user) {
    if (!user) {
      createOne(profile._json.name , profile._json.id , function(err, result){
        if (err) done(err);
        user= result.rows[0]; // not sure about this one please investigate, console.log might help 
        return done(err, user);
      })
    } else {
      return done(err, user);
    }
  });
};

传递处理程序:

passport.use(new GitHubStrategy({
  clientID: GITHUB_CLIENT_ID,
  clientSecret: GITHUB_CLIENT_SECRET,
  callbackURL:"http://localhost:5000/auth/github/callback"
},
passportGithubHandler));

然后定义要验证的路由

app.get('/auth/github',
  passport.authenticate('github'));

回调路线

app.get('/auth/github/callback', 
  passport.authenticate('github', { failureRedirect: '/login' }),
  function(req, res) {
      // render or redirect or do whatever you have access to req.user now
    res.redirect('/'); 
  });