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

Node.js Everyauth并从findUserById中访问(twitter)oauth数据,node.js,express,everyauth,promise,Node.js,Express,Everyauth,Promise,我正在尝试使用express中的everyauth对允许向图像添加文本注释的网站的用户进行身份验证。我目前正在使用twitter oauth api对我的用户进行身份验证 现在我正在尝试建立一个自定义用户数据库,它允许我将多种登录方式连接到CouchDB中的单个条目。当我想在DB中添加一个新用户时,我遇到了麻烦,他最初通过twitter进行连接。myfindUserById的代码如下所示: everyauth.everymodule.findUserById (userId, callback)

我正在尝试使用
express
中的
everyauth
对允许向图像添加文本注释的网站的用户进行身份验证。我目前正在使用twitter oauth api对我的用户进行身份验证

现在我正在尝试建立一个自定义用户数据库,它允许我将多种登录方式连接到CouchDB中的单个条目。当我想在DB中添加一个新用户时,我遇到了麻烦,他最初通过twitter进行连接。my
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
是查询数据库的
bradle
对象的方法,
userId
似乎是由everyauth提供的

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


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

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

我是Passport的开发者,所以请随时问我任何问题。我是在尝试了everyauth之后写的,同样对提供的流控制感到失望,包括承诺

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

在verify回调中(众所周知),您可以完全访问Twitter发布的token和tokenSecret,以及完整的Twitter配置文件。您可以使用该信息在数据库中查找或创建用户

触发登录非常简单,只需在应用程序中添加几个路由:

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

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

在进一步闲逛之后,我找到了解决我提出的问题的办法。要访问与everyauth的Promise结构相关的OAuth请求传输的完整用户数据,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

谢谢你的详细解释。我确实被承诺部分弄糊涂了,从我读到的内容来看,node留下了这种范式。但是passport看起来很有前途,我将在我的下一个大项目中使用它:)
everyauth.everymodule.findUserById (userId, callback) ->  
 users.findByTwitterId userId, (err,res) ->
    if res.id
        callback null, res.value
    else
        callback null, null