0

画像にテキストのコメントを追加できる Web サイトでユーザーを認証するeveryauthために使用しようとしています。express現在、Twitter oauth API を使用してユーザーを認証しています。

現在、複数のログイン方法を 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 '/'

findByIdDBにクエリを実行するオブジェクトsaveByIdのメソッドであり、everyauth によって提供されているようです。cradleuserId

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

それは可能ですか?別のアプローチはありますか?私はfindOrCreateUser関数を見ていますが、アプリをクラッシュさせずにそれを変更する方法がわかりません.Promiseの概念をまだ理解していません.

4

2 に答える 2

1

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

私は Passport の開発者ですので、お気軽に質問してください。私は、everyauth を試してみて、promise を含め、提供されたフロー制御に同様に不満を感じた後に書きました。

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);
    });
  }
));

verify コールバック (いわゆる) 内では、Twitter によって発行されたトークンと tokenSecret、および完全な Twitter プロファイルに完全にアクセスできます。その情報を使用して、データベースでユーザーを検索または作成できます。

サインインのトリガーは、アプリにいくつかのルートを追加するのと同じくらい簡単です。

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

app.get('/auth/twitter/callback', 
  passport.authenticate('twitter', { successRedirect: '/',
                                     failureRedirect: '/login' }));
于 2012-03-17T00:38:10.107 に答える
0

さらにいじった後、私が提起した問題の解決策を見つけました。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
于 2012-03-17T21:16:53.940 に答える