0

ユーザーが「Twitterにサインアップ」できる認証システムを作りたいのですが、これは、Twitterアカウントを認証し、登録フォームにTwitterユーザー名を事前に入力するだけです。次に、ユーザーは電子メールとパスワード(または代替ユーザー名)を入力するように求められます。

したがって、登録時に、ユーザーは自分のTwitterアカウントへのアクセスを認証し、アクセストークンをデータベースに保存できます。後で、これを使用してTwitterAPIにアクセスします。

などのノードモジュールは、OAuthを使用して多くの面倒な作業を行いますが、メソッドを提供しているように見えますeveryauth。これは、私が行う必要のあること、つまり、にリダイレクトするための多くの呼吸スペースを提供しません。ユーザーを登録する前に登録フォームを作成するか、ユーザーが見つかった場合は、通常どおりログインしてください。passportfindOrCreateUser

4

2 に答える 2

3

これに対する可能なアプローチの簡単なスケッチは次のとおりです。

findOrCreateUserPassportはメソッドを提供しないことに注意してください。すべてのデータベース管理とレコード作成は、アプリケーションによって定義されます(必要に応じて)。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) {
    // Create a user object in your database, using the profile data given by
    // Twitter.  It may not yet be a "complete" profile, but that will be handled
    // later.
    return done(null, user);
  }
));

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

app.get('/auth/twitter/callback', 
  passport.authenticate('twitter', { failureRedirect: '/login' }),
  function(req, res) {
    // The user has authenticated with Twitter.  Now check to see if the profile
    // is "complete".  If not, send them down a flow to fill out more details.
    if (req.user.isCompleteProfile()) {
      res.redirect('/home');
    } else {
      res.redirect('/complete-profile');
    }
  });

app.get('/complete-profile', function(req, res) {
  res.render('profile-form', { user: req.user });
});

app.post('/update-profile', function(req, res) {
  // Grab the missing information from the form and update the profile.
  res.redirect('/home');
});
于 2013-02-19T15:41:59.937 に答える
0

少し説明します。テスト「if(req.user.isCompleteProfile())」は次のようになります。

if(req.user.isCompleteProfile)

つまり、Twitterステップでユーザーレコードを作成するときにフィールド「isCompleteProfile」を作成し、ユーザーについて知っていることに応じて、trueまたはfalseのマークを付けます。

または:関数の呼び出しであるため、

if(isCompleteProfile(req))

この場合、作成/変更したばかりのユーザーの状態をテストする別の関数があります。したがって、次のようになります。

function isCompleteProfile(req){if(typeof req.user.local.email === "undefined")はfalseを返します; それ以外の場合はtrueを返します。}

そして、私はJaredの称賛と、passportjsでの認証に関するこの素晴らしいチュートリアルをエコーし​​ます。

于 2015-08-15T14:04:12.113 に答える