0

我正在尝试使用everyauthinsideexpress向允许向图像添加文本评论的网站验证用户身份。我目前正在使用 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 '/'

findById并且是查询数据库的对象saveById的方法,看起来是由everyauth提供的。cradleuserId

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

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

4

2 回答 2

1

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

我是 Passport 的开发人员,所以请随时问我任何问题。我在尝试了everyauth 之后写了它,并且对提供的流控制(包括承诺)同样感到沮丧。

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

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' }));
于 2012-03-17T00:38:10.107 回答
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
于 2012-03-17T21:16:53.940 回答