我正在尝试在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 '/'
findById
和saveById
是查询数据库的cradle
对象的方法,userId
由everyauth提供,如图所示。
我的问题在于{"name":"test"}
部分。这是我想将req.session.auth.twitter
对象中的数据添加到数据库的位置。 如何从findUserById
功能
这甚至可能吗?有不同的方法吗?我正在查看findOrCreateUser函数,但我不知道如何更改它而不会崩溃我的应用程序 - 我还没有掌握Promise的概念。
答案 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