2012-03-17 18 views
0

expresseveryauthを使用して、画像にテキストコメントを追加できるウェブサイトへのユーザーを認証しようとしています。私は現在、ユーザーを認証するためにtwitter oauth apiを使用しています。findauthとfindUserById内から(ツイッター)oauthデータにアクセスする

私はCouchDB内の1つのエントリに複数のログイン方法を保持できるカスタムユーザデータベースを確立しようとしています。 Twitterに初めて接続したときにDBに新しいユーザーを追加したいときに問題に遭遇しています。私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 '/' 

findByIdsaveByIdは、DBを照会cradleオブジェクトのメソッドですそれはそうと、userIdは、everyauthによって提供されます。

私の問題は{"name":"test"}部分にあります。これは、req.session.auth.twitterオブジェクトのデータをDBに追加する場所です。 findUserById機能内からこれらの値にアクセスするにはどうすればよいですか?

これは可能ですか?別の方法がありますか?私はfindOrCreateUser関数を見ていますが、私は自分のアプリをクラッシュせずにそれをどのように変更するのか分かりません。私はまだPromiseの概念を理解していません。

答えて

0

周りにさらにいじった後、私は私が提起した問題への解決策を発見しました。 everyauthの約束構造に関して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 
1

everyauthを使用して問題を解決する方法に関するガイダンスは提供できません。ただし、認証にPassportを使用すると考えましたか?

私はPassportの開発者ですので、お気軽にお問い合わせください。私は、すべてのオートを試してみて、それと同様に、約束を含めて、提供されているフロー制御に不満を持って書きました。

パスポートpassport-twitterモジュールを使用して、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によって発行されたtokenとtokenSecret、および完全なTwitterプロファイルこの情報を使用して、データベース内のユーザーを検索または作成することができます。サインインをトリガ

アプリにカップルのルートを追加するのと同じくらい簡単です:

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

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

は、詳細な説明をありがとうございました。私は確かにPromiseの部分と私が読んだところから混乱していましたが、その種のパラダイムはノードによって残されました。しかし、パスポートは非​​常に有望に見える、私は私の次の大きなプロジェクトでそれを使用します:) – arvidkahl

関連する問題