Node-Auth
Node-Auth
Code Github
Blog
目次概要 需要 に必要なツールおよびパッケージ プロジェクト設定 MongoDBデータベースとユーザーモデル設定 User Signup User Login トークンを用いるログインユーザ情報 をインポートする.
1.紹介
認証(Authentication)-ユーザーの一貫性を検証するプロセス
認証(Authorization)-タスクが認証されているかどうかを確認し、認証します.
2.必要
3.必要なツールとパッケージ
express
express
ExpressはNodeです.JS Webアプリケーションフレームワーク
express-validator
express-validator
Expressフレームワークのサーバ上のデータを検証するサーバ側リポジトリ
body-parser
body-parser
PostリクエストからBodyデータを割り当てるためのノード.jsのミドルウェア
bcryptjs
bcryptjs
パスワードをハッシュしてデータベースに保存すると、管理者もこれらのライブラリにアクセスできません.
jsonwebtoken
jsonwebtoken
登録用のデータplayload(使用用のデータを送信)を暗号化してトークンを返し、トークンはセキュリティページの検証に使用したり、トークンの有効時間を設定したりすることができます.
mongoose
mongoose
MongoDB Ojbectモデリングツールとして、承諾とコールバックをサポートする非同期環境です.
4.設定項目
$ npm init -y
$ npm install express express-validator body-parser bcryptjs jsonwebtoken mongoose --save
MongoDB
MongoDB Doc
データベースの作成
≪クラスタ|Cluster|Eas≫-データベースの作成:ユーザー・セットの作成
データベース接続情報の取得
Clusters-CONNECT-Connect Your application
ユーザー・モデルの設定
ユーザーモデル の作成
Postmanを使用する場合は、「Headers」タブで「KEY:Content-Type」を「VALUE:アプリケーション/json」に変更します.
auth
ヘッダーのマークでuserに戻ることができます.
findByIdはfindOneより便利な関数です.
サンプルソース
authミドルウェアはトークンを検証し,トークンペイロードに基づくユーザを検索して取得する.
郵便配達人(GETリクエスト)
Code Github
Blog
目次
1.紹介
認証(Authentication)-ユーザーの一貫性を検証するプロセス
認証(Authorization)-タスクが認証されているかどうかを確認し、認証します.
2.必要
node js
を取り付ける必要があります.3.必要なツールとパッケージ
express
express
ExpressはNodeです.JS Webアプリケーションフレームワーク
express-validator
express-validator
Expressフレームワークのサーバ上のデータを検証するサーバ側リポジトリ
body-parser
body-parser
PostリクエストからBodyデータを割り当てるためのノード.jsのミドルウェア
bcryptjs
bcryptjs
パスワードをハッシュしてデータベースに保存すると、管理者もこれらのライブラリにアクセスできません.
jsonwebtoken
jsonwebtoken
登録用のデータplayload(使用用のデータを送信)を暗号化してトークンを返し、トークンはセキュリティページの検証に使用したり、トークンの有効時間を設定したりすることができます.
mongoose
mongoose
MongoDB Ojbectモデリングツールとして、承諾とコールバックをサポートする非同期環境です.
$ npm init -y
$ npm install express express-validator body-parser bcryptjs jsonwebtoken mongoose --save
// index.js
const express = require("express");
const MongoServer = require("./config/db");
// 몽고서버 시작
MongoServer();
const app = express();
// 포트
const PORT = process.env.PORT || 3000;
// 미들웨어
app.use(bodyParser.json());
app.get("/", (req, res) => {
res.json({ message: "API working" });
});
app.listen(PORT, (req, res) => {
console.log(`Server Started at PORT ${PORT}`);
});
5.MongoDBデータベースとユーザーモデルの設定MongoDB
MongoDB Doc
データベースの作成
≪クラスタ|Cluster|Eas≫-データベースの作成:ユーザー・セットの作成
データベース接続情報の取得
Clusters-CONNECT-Connect Your application
mongodb+srv://devPark:<password>@react-boiler-plate.ovbtd.mongodb.net/<dbname>?retryWrites=true&w=majority
ユーザー・モデルの設定
// config/db.js
const mongoose = require("mongoose");
const MongoURI = "Mongo URI";
const MongoServer = async () => {
try {
await mongoose.connect(MongoURI, {
useNewUrlParser: true,
});
console.log("Connected to MongoDB !!");
} catch (e) {
console.log(e);
throw e;
}
};
module.exports = MongoServer;
// models/User.js
const mongoose = require("mongoose");
const UserSchema = mongoose.Schema({
username: {
type: String,
required: true,
},
email: {
type: String,
required: true,
},
password: {
type: String,
required: true,
},
createAt: {
type: Date,
default: Date.now(),
},
});
module.exports = mongoose.model("User", UserSchema);
6. User SignupPostmanを使用する場合は、「Headers」タブで「KEY:Content-Type」を「VALUE:アプリケーション/json」に変更します.
// routes/user.js
const express = require("express");
const { check, validationResult } = require("express-validator");
const bcrypt = require("bcryptjs");
const jwt = require("jsonwebtoken");
const router = express.Router();
const User = require("../model/User");
/**
* @method - POST
* @param - /signup
* @description - User SignUp
*/
router.post(
"/signup",
[
check("username", "유효한 username을 입력해주세요.").not().isEmpty(),
check("email", "유효한 email을 입력해주세요.").isEmail(),
check("password", "유효한 password를 입력해주세요.").isLength({ min: 6 }),
],
async (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({
errors: errors.array(),
});
}
const { username, email, password } = req.body;
try {
let user = await User.findOne({
email,
});
if (user) {
return res.status(400).json({
msg: "유저가 이미 존재합니다.",
});
}
user = new User({
username,
email,
password,
});
const salt = await bcrypt.genSalt(10);
user.password = await bcrypt.hash(password, salt);
await user.save();
const payload = {
user: {
id: user.id,
},
};
jwt.sign(payload, "secret", { expiresIn: 10000 }, (err, token) => {
if (err) throw err;
res.status(200).json({
token,
});
});
} catch (err) {
console.log(err.message);
res.status(500).send("데이터를 저장하는데 에러가 생겼습니다.");
}
}
);
module.exports = router;
// index.js
const express = require("express");
const MongoServer = require("./config/db");
const bodyParser = require("body-parser"); // 새로 추가
const user = require("./routes/user"); // 새로 추가
// 몽고서버 시작
MongoServer();
const app = express();
// 포트
const PORT = process.env.PORT || 3000;
// 미들웨어
app.use(bodyParser.json());
app.get("/", (req, res) => {
res.json({ message: "API working" });
});
/**
* Router Middleware
* Router - /user/*
* Method - *
*/
app.use("/user", user); // 새로 추가
app.listen(PORT, (req, res) => {
console.log(`Server Started at PORT ${PORT}`);
});
7. User Login// routes/user.js
router.post(
"/login",
[
check("email", "유효한 eamil을 입력해주세요.").isEmail(),
check("password", "유효한 비밀번호를 입력해주세요.").isLength({
min: 6,
}),
],
async (req, res) => {
const erros = validationResult(req);
if (!erros.isEmpty()) {
return res.status(400).json({
erros: erros.array(),
});
}
const { email, password } = req.body;
try {
let user = await User.findOne({ email });
if (!user)
return res.status(400).json({
message: "유저가 존재하지 않습니다.",
});
const isMatch = await bcrypt.compare(password, user.password);
if (!isMatch)
return res.status(400).json({
message: "비밀번호가 일치하지 않습니다!",
});
const payload = {
user: {
id: user.id,
},
};
jwt.sign(payload, "secret", { expiresIn: 3600 }, (err, token) => {
if (err) throw err;
res.status(200).json({ token });
});
} catch (e) {
console.error(e);
res.status(500).json({
message: "서버 에러",
});
}
}
);
8.トークンを使用してログインユーザ情報をインポートするauth
ヘッダーのマークでuserに戻ることができます.
// routes/user.js
const auth = require("../middleware/auth");
/**
* @method - GET
* @description - Get LoggedIn User
* @param - /user/me
*/
router.get("/me", auth, async (req, res) => {
try {
// 미들웨어에서 토큰 인증을 하면 req.user를 가져올수있다.
const user = await User.findById(req.user.id);
res.json(user);
} catch (e) {
res.send({ message: "유저정보를 가져오는데 실패했습니다." });
}
});
findByID vs findOnefindByIdはfindOneより便利な関数です.
サンプルソース
Model.findById = function findById(id, fields, options, callback) {
return this.findOne({ _id: id }, fields, options, callback);
};
ミドルウェアauthミドルウェアはトークンを検証し,トークンペイロードに基づくユーザを検索して取得する.
// middleware/auth.js
const jwt = require("jsonwebtoken");
module.exports = function (req, res, next) {
const token = req.header("token");
if (!token) return res.status(401).json({ message: "인증 에러" });
try {
const decoded = jwt.verify(token, "secret");
req.user = decoded.user;
next();
} catch (e) {
console.error(e);
res.status(500).send({ message: "유효하지않는 토큰입니다." });
}
};
テスト郵便配達人(GETリクエスト)
localhost:3000/user/me
会員加入後、登録してトークンを取得し、コピーしてリーダーに入れます.(KEY:token,VALUE:取得したトークン)Reference
この問題について(Node-Auth), 我々は、より多くの情報をここで見つけました https://velog.io/@blackb0x/Node-Authテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol