Everyauth и доступ к данным (Twitter) oauth из findUserById - PullRequest
0 голосов
/ 17 марта 2012

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

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

Ответы [ 2 ]

1 голос
/ 17 марта 2012

Я не могу дать каких-либо указаний о том, как решить вашу проблему, используя Everyauth. Однако рассматривали ли вы возможность использования Паспорт для проверки подлинности?

Я разработчик Passport, поэтому не стесняйтесь задавать мне любые вопросы. Я написал это после того, как попробовал все и все так же разочаровался в предложенном управлении потоком, включая обещания.

Паспорт имеет простой механизм для обработки входа в систему с помощью Twitter (или любого другого поставщика OAuth), используя модуль passport-twitter :

* * 1010

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

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

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

app.get('/auth/twitter/callback', 
  passport.authenticate('twitter', { successRedirect: '/',
                                     failureRedirect: '/login' }));
0 голосов
/ 18 марта 2012

Поработав дальше, я нашел решение поставленной мной проблемы. Чтобы получить доступ к полным пользовательским данным, которые передаются с запросом OAuth относительно структуры Promise каждого элементаaa, вызов 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 заполняется следующим образом:

* * 1010
...