[TIL]1210
Express.jsとMongoDBを使用したWebサービス2の作成
会員登録の実施-パスワードの保存-Hash
Hashは文字列を返すことができないように暗号化する方法
->hash出力値でユーザーパスワードを認識できません
パスワードのハッシュ値をデータベースに保存します.
ハッシュログイン時に渡されたパスワードでログインを処理し、保存した値と比較する
SHA 1-使用方法
const hash = crypto.createHash("sha1");
hash.update(password);
hash.digest("hex");
Passport.jsとは何ですか。
passport-local
ログイン機能の実装-passport-localポリシー
const config = {
usernameField: "email",
passwordField: "password",
};
// 아이디 패스워드 필드 설정 필수!
const local = new LocalStrategy(config, async (email, password, done) => {
try {
const user = await User.findOne({ email });
if (!user) {
throw new Error("회원을 찾을 수 없습니다.");
}
// user에 저장한 password는 hash 값이기 때문에 hash(pass)를 사용해야함
if (user.password !== password) {
throw new Error("비밀번호가 일치하지 않습니다.");
}
// 세션에 저장되는 유저 정보의 최소화
done(null, {
shortId: user.shortId,
email: user.email,
name: user.name,
});
} catch (err) {
done(err, null);
}
});
ログイン機能-passportを実装します。jsの設定
const local = require("./strategies/local");
passport.use(local);
passportはログイン機能-passportを実装します。jsを使用してPOST要求を処理する
// routes/auth.js
router.post("/", passport.authenticate("local"));
// app.js
const session = require("express-session");
app.use(
session({
secret: "secret",
resave: false,
saveUninitialized: true,
})
);
app.use(passprot.initialize());
app.use(passport.session());
app.use("/auth", authRouter);
passport.authenticate関数をhttpルーティングに接続するとpassportは
対応するポリシーを使用したリクエストハンドラの自動生成
express-ssessionとpassport.セッション()を使用してpassportにログインする場合
ユーザー情報をセッションに保存し、インポート操作を自動的に実行
ログイン機能の実装-セッションユーザーの使用
passport.serializeUser((user, callback) => {
callback(null, user);
});
passport.deserializeUser((obj, callback) => {
callback(null, obj);
});
ログアウト
router.get('/logout', ... {
req.logout();
res.redirect('/');
});
ログイン検証ミドルウェア
function loginRequired(req, res, next) {
if (!req.user) {
res.redirect("/");
return;
}
next();
}
app.use("/posts", loginRequired, postsRouter);
Session Store
セシオンとは?
Webサーバは,クライアント内の情報をクライアントごとに分割してサーバに格納する.
クライアント要求時にセッションIDを使用してクライアント情報を再チェックする技術
クライアントが情報を格納し、要求時に情報を送信するCookieとは逆
セッションの動作原理
Express.jsのセッション
セッション・ストレージの使用方法
セッション・ストレージの構成
セッションストレージとしてMongoDBを使用
connect-mongo
const MongoStore = require("connect-mongo");
app.use(
session({
secret: "SeCrEt",
resave: false,
saveUninitialized: true,
store: MongoStore.create({
mongoUrl: "mongoUrl",
}),
})
);
会員と投稿の関連付け-index
作成者への索引の設定
author: {
type: Schema.Types.ObjectId,
ref: 'User',
required: true,
index: true,
}
PostSchemaのauthorプロパティでindex:trueオプションを使用します.
mongoseは自動的にMongoDBにインデックスを作成します
インデックスを追加する時間が長くなると、MongoDBが応答できなくなる可能性があります.
->インデックスの事前追加を推奨
CSRの実装方法
クライアントにリソースを宣言する-HTML Template
MongoDB Aggregation
Aggregationとは?
集約を使用する理由
これは、
集約の例
db.posts.aggregate([
{ $group: { _id: '$author', count: { $sum: 1 } } },
{ $match: { sum: { $gt: 10}}},
{ $lookup: { from: 'users', localField: '_id', foreignField: '_id', as: 'users'} },
]);
Aggregation Reference
Reference
この問題について([TIL]1210), 我々は、より多くの情報をここで見つけました https://velog.io/@sza0203/TIL1210テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol