2

私は generator-angular-fullstack に基づいた小さなアプリを持っています。現在ログインしているユーザーに、新しいアカウント (Withings) の資格情報を追加したいと考えています。ログインしているユーザーは、Withings または Twitter または Facebook を使用してログインする他の方法を追加することもできます。

それらは私のルートです:

router
.get('/', passport.authorize('withings', { 
    failureRedirect: '/'
}))

.get('/callback', passport.authorize('withings', {
    successRedirect : '/settings',
    failureRedirect : '/'
}));

そして、これはコールバックの実装です:

passport.use(new WithingsStrategy({
    consumerKey: config.withings.clientID,
    consumerSecret: config.withings.clientSecret,
    callbackURL: config.withings.callbackURL,
    passReqToCallback: true
  },
  function(req, token, tokenSecret, profile, done) {

    console.log('user' + req.user);

    return done(null, null);

  }
));

ポイントは、関数に戻ると、ログに記録された場合でもreq.user常にundefined.

誰にもアイデアはありますか?deserializeUserandのような関数がいくつか必要だと読みましたserializeUserが、それらは呼び出されません。

アイデア?私はこの種のことは初めてで、3〜4泊するとイライラします:(

PS: これは私の構成です

  app.set('views', config.root + '/server/views');
  app.engine('html', require('ejs').renderFile);
  app.set('view engine', 'html');
  app.use(compression());
  app.use(bodyParser.urlencoded({ extended: false }));
  app.use(bodyParser.json());
  app.use(methodOverride());
  app.use(cookieParser());
  app.use(passport.initialize());
  app.use(passport.session()); //persistent login session




  // Persist sessions with mongoStore
  // We need to enable sessions for passport twitter because its an oauth 1.0 strategy
  app.use(session({
    secret: config.secrets.session,
    resave: true,
    saveUninitialized: true,
    store: new mongoStore({ mongoose_connection: mongoose.connection })
  }));

  if ('production' === env) {
    app.use(favicon(path.join(config.root, 'public', 'favicon.ico')));
    app.use(express.static(path.join(config.root, 'public')));
    app.set('appPath', config.root + '/public');
    app.use(morgan('dev'));
  }

  if ('development' === env || 'test' === env) {
    app.use(require('connect-livereload')());
    app.use(express.static(path.join(config.root, '.tmp')));
    app.use(express.static(path.join(config.root, 'client')));
    app.set('appPath', 'client');
    app.use(morgan('dev'));
    app.use(errorHandler()); // Error handler - has to be last
  }
4

1 に答える 1

3

この質問が古いことは知っていますが、他の誰かがそれを乗り越えた場合、2 つの問題が発生します。

まず、コールバックの実装で次のように言います。

return done(null, null);

の APIdonedone([err], [user]). コードは、nulldone の 2 番目の引数として渡すことで、ユーザーが見つからなかったことを示しているため、passport はユーザーをログインさせていません。実際には、次のように言う必要があります。

return done(null, profile);

次に、次の行を移動する必要があります。

app.use(passport.initialize());
app.use(passport.session());

app.use(session({...}))あなたの呼び出しの下に。パスポートはエクスプレスセッションに依存するため、パスポートを初期化する前にエクスプレスセッションをセットアップする必要があります。

お役に立てれば!

于 2015-07-16T17:54:40.530 に答える