私はちょうどpassport.jsで開始しました。 this articleから、私はすべてのパスポートメソッドの流れを得て、私のアプリケーションで同じものを実装しています。ここにserver.jsがあり、私はpassport-local
戦略を使用しています。私はそれが私がpassport.jsのdeserializeUserメソッドのメリット
app.use(express.static(__dirname + "/public"));
使用していたとしてのindex.htmlページを提供しており、これは角度のアプリで、理由角度のlocalhost:7000
を打ったときの角度アプリは、同じサーバー
import { registerControllersFromFolder } from 'giuseppe';
import { MessageManager } from './messaging/MessageManager';
import express = require('express');
import bodyParser = require('body-parser');
import session = require("express-session");
import http = require('http');
// class to hold user info
class User {
userId: number;
userName: string;
constructor(userId: number, userName: string) {
this.userId = userId;
this.userName = userName;
}
}
// server class to create http server
export class Server {
// list of apis for which authentication is not required
private static publicApiList: string[] = ["/services/login", "/login", "/favicon.ico"];
// request interceptor that will check user authentication
private static isAuthenticated = (req, res, next) => {
console.log("Authenticating :", req.originalUrl);
if (req.isAuthenticated() || Server.publicApiList.indexOf(req.originalUrl) > -1) {
// express routing
if (req.originalUrl.startsWith("/services")) {
console.log("Express Routing");
return next();
} else { // angular routing -> return index.html
console.log("Angular Routing");
return res.sendFile(__dirname + "/public/index.html");
}
} else {
console.log("User not authenticated.")
res.redirect('/');
}
};
static startServer() {
let userList: User[] = [new User(1, "Sunil"), new User(2, "Sukhi")];
let app = express();
// passport library
let passport = require('passport');
let LocalStrategy = require('passport-local').Strategy;
// middlewares
app.use(express.static(__dirname + "/public"));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(session({ resave: false, saveUninitialized: true, secret: "secretKey123!!" }));
// passport middleware invoked on every request to ensure session contains passport.user object
app.use(passport.initialize());
// load seriliazed session user object to req.user
app.use(passport.session());
// Only during the authentication to specify what user information should be stored in the session.
passport.serializeUser(function (user, done) {
console.log("Serializer : ", user);
done(null, user);
});
// Invoked on every request by passport.session
passport.deserializeUser(function (user, done) {
let validUser = userList.filter(user => user.userId === user.userId)[0];
console.log("D-serializer : ", validUser);
done(null,validUser);
});
// passport strategy : Only invoked on the route which uses the passport.authenticate middleware.
passport.use(new LocalStrategy({
usernameField: 'name',
passwordField: 'password'
},
function (username, password, done) {
console.log("Strategy : Authenticating if user is valid :", username)
let user = userList.filter(user => username === user.userName);
console.log("Valid user : ", user)
if (!user) {
return done(null, false, { message: 'Incorrect username.' });
}
return done(null, user[0]);
}
));
// intercept request for authentication
app.use(Server.isAuthenticated);
app.post('/services/login', passport.authenticate('local', {
successRedirect: '/profile',
failureRedirect: '/login'
}));
app.get('/services/logout', (req: any, res: any) => {
req.logout();
console.log("User Logout");
res.send("{status:'logout'}")
});
// http server creation
let server = http.createServer(app);
registerControllersFromFolder({ folderPath: './api' })
.then(router => {
app.use(router);
/* start express server */
})
.catch(err => {
/* error happened during loading and registering */
});
server.listen(7000,() => {
console.log('Up and running on port 7000');
});
}
}
exports.startServer = Server.startServer;
// Call a module's exported functions directly from the command line.
require('make-runnable');
にAPIを休ませ、ルーティングlogin
モジュールがデフォルトでロードされます。私はリクエスト認証をチェックするミドルウェアを使用しており、真の場合はリクエストプレフィックス(角度または明示)に基づいてルーティングが行われます。
ログインリクエストで定義されたローカル戦略方法が呼び出され、これが真であれば、要求セッションでデータを保存する責任を負うserializer
メソッドが呼び出されます。 sucessRedirect
またはfailureRedirect
が呼び出されます。
私は、req.isAuthenticated
が真であるかどうかをチェックするミドルウェアを使用していました。要求が提供されていないと、ユーザーはログインページにリダイレクトされます。それ以降のリクエストで、メソッドが呼び出され、serializeUser
メソッドによってログイン要求に格納されたオブジェクトが含まれていることがわかりました。ドキュメントごとに、これは有効なユーザーを確認するためにデータベースを呼び出します。
しかし、私は混乱していますが、deserializeUser
メソッドの実際の使用例ですか?私は、要求をecah傍受しreq.isAuthentictedを確認していた場合、どこで、なぜdeserializeUser
方法でデータベースを呼び出すために)(この方法の利点を取ることができ?>
私は 'req.isAuthenticated'を適用するためにチェックする要求を傍受しています。偽であれば、失敗した応答で要求から戻ってきます。とにかくユーザープロファイルはreq.session.passportにあります –
if文で 'req.isAuthenticated()'を呼びますが、あなたが提供したコードで 'req.session.passport'を使用しているとは思われません。あなたの質問をもっと説明できますか? –
私の質問では、私はすべての要求を傍受し、 'req.isAuthenticated'が真であるかどうかをチェックし、その要求に基づいてサービスが提供されているかどうかを確認しました。私はここで 'deSerializerUser'メソッドの役割は何か分かりません。 'deSerializerUser'からどのようなメリットが得られるのか説明できますか? –