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进行连接。myfindUserById
的代码如下所示:
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