2

パスポート jsを使用して認証を処理しています。ただし、角度のある $route サービスも使用して、クライアント側でテンプレートを処理しています。このため、doc ページの例はサーバー側のテンプレートを想定しているため、passport の使用方法がわかりません。例えば、

app.post('/login',
    passport.authenticate('local', { 
        successRedirect: '/',
        failureRedirect: '/login',
        failureFlash: true
    })
);

したがって、これに基づいて、「/」と「/login」は、RESTful クエリなどへの応答だけでなく、テンプレートを提供することを意図しているようです。私のやり方では、テンプレート化はクライアント側で行われます。すべてをセットアップする角度ファイルで

$routeProvider
    .when('/', {
        templateUrl: 'templates/login.html',
        controller: 'MainCtrl'
    })
    .when('/home', {
        templateUrl: 'templates/home.html',
        controller: 'MainCtrl'
    });

私は混ぜ合わせようとしているように見えますが、どちらの方法もよく理解していません。

ですから、これまでひどい言い方をしてきたことは承知していますが、私がやりたいことは次のようなことです

html (login.html)

<h3> Login </h3>
<form action= "login" method="post">
    Username:<br>
    <input type="text" name="username" value="">
    <br>
    Password:<br>
    <input type="password" name="password" value="">
    <br><br>
    <input type="submit" value="Submit">
</form>

ノード バックエンド

私は何も認証していないことに気づきましたが、これはまだ私にとってはうまくいきません

passport.use(new LocalStrategy(
    function (username, password, done) {
        console.log(username);      // this does not fire
        return done(null, null);
    }
));

app.post('/login',
    passport.authenticate('local', { 
        successRedirect: '/home',
        failureRedirect: '/',
        failureFlash: true
    })
);

したがって、パスポートを使用して認証したいのですが、クライアント側のテンプレート/ルーティングを使用して、単一ページのアプリケーションの感触を維持します。

誰かが私を正しい方向に向けることができますか? または、私がしていることが完全に間違っているかどうか教えてください。

編集:私のコードで発生しているエラーは

TypeError: undefined is not a function

これはおそらく皆さんの役に立つには十分ではありませんが、必要に応じてさらに詳しく説明できます。特定のエラーメッセージは、私が尋ねようとしていたことの精神ではありません。

4

2 に答える 2

1

Passportがカスタムコールバックを呼び出すものを使用できます

app.get('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) { return next(err); }
    if (!user) { return res.status(401).end('wrong credentials'); }

    //If you use session, skip if you dont
    req.logIn(user, function(err) {
      if (err) { return next(err); }
      return res.status(200).end('user authenticated' + user.username); //That, or hand them a session id or a JWT Token
    });

    // If you don't use session just response directly to client
    res.status(200).end(jwt.createToken(user));
  })(req, res, next);
});

http://passportjs.org/docs/authenticate#custom-callback
したがって、ここではサーバー側のリダイレクトはなく、すべてのルーティング ロジックをフロントエンドで実行できます。

于 2016-10-07T09:48:14.437 に答える
-2

パスポート js を使用するには、このコードを app.js に含める必要があります。

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

あなたのコード

passport.use(new LocalStrategy(
    function (username, password, done) {
        console.log(username);      // this does not fire
        return done(null, null);
    }
));

あなたが呼ぶ地元の名前を持っていませんpassport.authenticate

使用する

passport.use('login', new LocalStrategy(
    function (username, password, done) {
        console.log(username);      // this does not fire
        return done(null, null);
    }
));

シリアル化と逆シリアル化の場合でも、パスポートのシリアル化と逆シリアル化メソッドを実装する必要があります

passport.serializeUser(function (user, done) {
    done(null, user);
});
passport.deserializeUser(function (id, done) {
    done(null, id);
});

`

LocalStrategy リターンで

if (valid) {
    return done(null, username);
} else {
    return done(null, false, {"message": "User not found."});
}
于 2015-12-06T07:32:03.633 に答える