Everyauth并从findUserById中访问(twitter)oauth数据

时间:2012-03-17 00:02:17

标签: node.js express everyauth promise

我正在尝试在everyauth中使用express来验证用户是否允许向图片添加文字评论的网站。我目前正在使用twitter oauth api来验证我的用户。

现在我正在尝试建立一个自定义用户数据库,它允许我保持多种登录方式连接到CouchDB中的单个条目。当我最初通过twitter连接时,我想在数据库中添加新用户时遇到了麻烦。我findUserById的代码如下:

everyauth.everymodule.findUserById (userId, callback) ->  
    users.findById userId, (err,res) ->
        if res.id    
        # id returned, so there is an entry in the DB
            callback null, res
        else         
        # no entry in the DB, add a new one
            users.saveById JSON.stringify(userId), {"name":"test"}, (saveErr, saveRes) ->
                callback null, saveRes

everyauth.twitter
    .consumerKey(config.twitterConsumerKey)
    .consumerSecret(config.twitterConsumerSecret)
    .findOrCreateUser((session, token, secret, user) ->
         promise = @.Promise().fulfill user
    ).redirectPath '/'

findByIdsaveById是查询数据库的cradle对象的方法,userId由everyauth提供,如图所示。

我的问题在于{"name":"test"}部分。这是我想将req.session.auth.twitter对象中的数据添加到数据库的位置。 如何从findUserById功能

中访问这些值?

这甚至可能吗?有不同的方法吗?我正在查看findOrCreateUser函数,但我不知道如何更改它而不会崩溃我的应用程序 - 我还没有掌握Promise的概念。

2 个答案:

答案 0 :(得分:1)

我无法就如何使用Everyauth解决您的问题提供任何指导。但是,您是否考虑过使用Passport进行身份验证?

我是Passport的开发者,所以请随时问我任何问题。我在尝试了所有的事情并且同样受到所提供的流量控制(包括承诺)的挫败感之后写下了它。

使用passport-twitter模块,Passport有一个使用Twitter(或任何其他OAuth提供商)处理登录的简单机制:

passport.use(new TwitterStrategy({
    consumerKey: TWITTER_CONSUMER_KEY,
    consumerSecret: TWITTER_CONSUMER_SECRET,
    callbackURL: "http://127.0.0.1:3000/auth/twitter/callback"
  },
  function(token, tokenSecret, profile, done) {
    User.findOrCreate({ twitterId: profile.id }, function (err, user) {
      return done(err, user);
    });
  }
));

在验证回调中(如已知),您可以完全访问Twitter发布的令牌和tokenSecret,以及完整的Twitter个人资料。您可以使用该信息在数据库中查找或创建用户。

触发登录就像添加几条路线到您的应用一样简单:

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

app.get('/auth/twitter/callback', 
  passport.authenticate('twitter', { successRedirect: '/',
                                     failureRedirect: '/login' }));

答案 1 :(得分:0)

在进一步摆弄之后,我找到了解决我提出的问题的方法。要访问与OAuth请求一起传输的关于Everyauth的Promise结构的完整用户数据,everyauth.twitter调用应如下所示:

everyauth.twitter
 .consumerKey(config.twitterConsumerKey)
 .consumerSecret(config.twitterConsumerSecret)
 .findOrCreateUser((session, token, secret, user) ->
   users.findByTwitterId user.id, (err,res) ->
     if res.id
       user=res.value
     else
       newUser = {id:user.id,name:user.name,twitter:user}
       user = newUser
       users.saveById JSON.stringify(user.id), user, (saveErr, saveRes) -> 
   promise = @.Promise().fulfill user
 ).redirectPath '/'

findByTwitterId调用是一个函数,用于查询CouchDB查找包含twitter.id字段的文档的视图。

req.user对象由此填充:

everyauth.everymodule.findUserById (userId, callback) ->  
 users.findByTwitterId userId, (err,res) ->
    if res.id
        callback null, res.value
    else
        callback null, null