2012-03-17 2 views
0

Я пытаюсь использовать everyauth в пределах express для аутентификации пользователей на веб-сайт, который позволяет добавлять текстовые комментарии к изображениям. В настоящее время я использую twitter oauth api для аутентификации моих пользователей.Everyauth и доступ к данным (twitter) oauth из findUserById

Теперь я пытаюсь создать пользовательскую базу данных пользователя, которая позволяет мне поддерживать несколько способов входа в систему, связанных с одной записью в CouchDB. У меня возникают проблемы, когда я хочу добавить нового пользователя в БД, когда он изначально подключается через твиттер. Код моего 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, но я понятия не имею, как изменить это, не разбивая мое приложение - я еще не понимаю концепцию обещания.

ответ

0

После возиться дальше, я нашел решение этой проблемы я поставленный. Для того, чтобы получить доступ к полной информации пользователя, который передается с запросом OAuth относительно Promise-структуры everyauth, вызов 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 
1

Я не могу предоставить какие-либо рекомендации относительно того, как решить вашу проблему, используя everyauth. Однако рассмотрели ли вы использование для проверки подлинности 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); 
    }); 
    } 
)); 

Внутри проверить обратный вызов (как его известно), у вас есть полный доступ к токен и токен Secret, выпущенный Twitter, а также полный профиль Twitter. Вы можете использовать эту информацию для поиска или создания пользователя в своей базе данных.

Срабатывание знак в это так же просто, как добавление пары маршрутов в вашем приложении:

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

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

Спасибо за подробное объяснение. Я действительно был так же смущен частью обещания, и из того, что я читал, эта парадигма осталась за узлом. Но паспорт выглядит очень многообещающим, я буду использовать его в своем следующем крупном проекте :) – arvidkahl

 Смежные вопросы

  • Нет связанных вопросов^_^