4

Instagram 経由と通常のローカル戦略の 2 つの戦略のいずれかでログインできるユーザー機能を提供したいと思います。ローカルの場合、DB でユーザーを検索し、そのユーザー情報を提供する簡単な関数を作成しました。これがどのように機能するかです:

passport.use(new InstagramStrategy({
    clientID: global.INSTAGRAM_CLIENT_ID,
    clientSecret: global.INSTAGRAM_CLIENT_SECRET,
    callbackURL: "http://**.**.**.**:3000/auth/instagram/callback"
  },
  function(accessToken, refreshToken, profile, done) {
    process.nextTick(function () {
        console.log('Access token: ' + accessToken);
        global.access_token = accessToken;
      return done(null, profile);
    });
  }
));

passport.use(new LocalStrategy(
    function(email, password, done) {
    console.log('chec user');
    process.nextTick(function() {
        db.findByEmail(email, function(err, user) {
            if (!user) {
                console.log('Unknown user ' + email);
                return done(null, false, {
                    message: 'Unknown user ' + email
                });
            }
            if (user.password != crypt.getMD5fromString(password)) {
                console.log('Invalid password');
                return done(null, false, {
                    message: 'Invalid password'
                });
            }
            return done(null, user);
        })
    });
}));

ただし、カスタムのシリアライズおよびデシリアライズ関数は、Instagram 戦略では機能しません。

    /* THESE FUNCTIONS WORK WITH INSTAGRAM STRATEGY
passport.serializeUser(function(user, done) {
  done(null, user);
});

passport.deserializeUser(function(obj, done) {
  done(null, obj);
});*/

    /*THESE ARE FOR LOCAL STRATEGY*/
passport.serializeUser(function(user, done) {done(null, user._id);});
passport.deserializeUser(function(id, done) {db.findById(id, function(err, user) {done(err, user);});});

このバグを回避するには?私の目的は、Instagram でのログインを提供することです。ログイン チェックが成功した後、ユーザーがローカル アカウント (電子メールまたは Instagram のニックネーム) を持っている場合は、DB からデータを取得します。ユーザーは、ローカル戦略を介して Instagram なしでログインできる必要があります。ありがとう。

4

1 に答える 1

4

簡単な答えは次のとおりです。ローカルとサードパーティの検証コールバックの両方に同じユーザー オブジェクト タイプを使用します。これを Instagram の verify コールバックで設定することをお勧めします。呼び出す代わりにdone(null,profile)、新しい User オブジェクト、 assign myUser.instagram = profile、および callbackdone(null, myUser)などを作成することをお勧めします。

複数の認証システムをセットアップする 1 つの方法を示すサンプル コードがあります。ここで見つけることができます: https://github.com/therealplato/passport-multiauth-demo/blob/master/app.js

いくつかの注意点: これは Express 2.x 用に書かれたもので、3 とは異なる方法でサーバーを処理し、応答を送信するための構文が異なります。編集、express 3.x 用に更新されたデモ コード

さらに、ここでの Google メソッドは Oauth 1 です。ローカルホストで Oauth 1 Google 認証を機能させることができず、エラーが発生します...has no method 'CharChodeAt'...

おかしなことに、私は今日、Oauth 2 をローカル ユーザーとうまく連携させる作業に費やしました。時間があれば、Express 3 と Oauth 2 のデモ コードを更新しようと思いますが、約束はありません :)

于 2013-02-19T23:19:24.623 に答える