プロジェクト1-ログイン機能
8020 ワード
ログイン機能
📕ログイン機能
まずルータにログインする必要があります
このログインルータには3つのことがあります
DBで要求された電子メールを検索
DBに要求された電子メールがある場合は、パスワードが同じかどうかを確認します
パスワードが同じ場合はトークンを作成します
`app.post('/login', (req, res) => { 여기 }`
上記のコードをインデックスします.jsで作成📗DBで要求された電子メールを検索
DBで検索するには、まずユーザモデルをインポートします
その後、MongoDBから提供される方法.findOne()の使用
該当するユーザーがいなければ、JSONでログインに失敗しました.
app.post('./login', (req, res) => {
User.findOne({ email: req.body.email }, (err, user) => {
if(!user) {
return res.json({
loginSuccess: false,
message: "해당 이메일에 해당하는 유저가 없습니다."
})
}
})
}
プレイヤーがいる場合は、次の機能に移動します.📘パスワードが同じであることを確認
パスワードを保存するときにパスワードで暗号化して保存します
一方通行のみのため、暗号化されたパスワードは解読できません
したがって、ユーザが入力欄に入力したPalmanPasswordがDBのパスワードと同じかどうか.
比較のためにplainPasswordを暗号化して比較する必要がある
だからbcrypt比較の使用
そのためにはcomparePasswordというメソッドを作成する必要があります.
パラメータはreqbody.passwordでplainPasswordを入れて、
第二に、コールバック関数を追加します.
エラーが発生した場合、コールバックはerr、暗号化パスワード、純粋なパスワードを返します.
私はisMatchに参加して、正しいかどうかを教えます.
isMatchはtrueとfalseを返します
User.jsでメソッドを先に作成する
userSchema.methods.comparePassword = function(plainPassword, cb) {
bcrypt.compare(plainPassword, this.password, function(err, isMatch) {
if(err) return cb(err)
cb(null, isMatch)
})
}
こうして書き終わったらインデックスjsに次のコードを加えるapp.post('/login', (req, res) => {
User.findOne({ email: req.body.email }, (err, user) => {
if(!user) {
return res.json({
loginSuccess: false,
message: "해당 이메일에 해당하는 유저가 없습니다."
})
}
user.comparePassword(req.body,password, (err, isMatch) => {
if(!isMatch){
return res.json({
loginSuccess: false,
message: "비밀번호가 틀렸습니다."
})
}
})
})
})
isMatchがtrueでない場合、ログインに失敗し、失敗を返します.📙パスワードが同じ場合はトークンを作成します
トークンを生成するには、JSONWEBTOKENライブラリをダウンロードする必要があります.
npm install jsonwebtoken --save
上記のようにトークンを発行する方法を別途作成する必要がありますまた、作り方の過程はサイトをチェックするだけで、過程がよく表示されます.
Userは、参照サイトと同時に使用されます.jsメソッドの作成
userSchema.methods.generateToken = function(cb){
let user = this
let token = jwt.sign(user._id.toHexString(), 'secretToken');
user.token = token
user.save(function(err, user){
if(err) return cb(err)
cb(null, user)
})
}
user._IDとsecretTokenを合わせるとtokenが作成されますtokenを解析するときにsecretTokenを入れるとuser.idを生成する
tokenをuserに戻します
次に、上記の方法をindexとします.jsで使うべき
index.jsが使用するプロセスは以下の通りです.
楽が車に戻されたら、status(400)に戻ります.これは間違いを意味します.
そしてトークンを記憶する必要があり、Cookie、ローカル記憶などを記憶することができる
ビスケットに保存しましょう.
Cookieに保存するには、本体を掘るようにライブラリをダウンロードする必要があります.
クッキーパーサーというライブラリをダウンロードするべきです.
npm install cookie-parser --save
次に、上部にconst cookieParser=require(「cookie-parser」)とapp.useの追加(cookieParser()
それから私たちはビスケットでコインを貯蔵します.
app.post('/login', (req, res) => {
User.findOne({ email: req.body.email }, (err, user) => {
if(!user) {
return res.json({
loginSuccess: false,
message: "해당 이메일에 해당하는 유저가 없습니다."
})
}
user.comparePassword(req.body,password, (err, isMatch) => {
if(!isMatch){
return res.json({
loginSuccess: false,
message: "비밀번호가 틀렸습니다."
})
}
user.generateToken((err, user) => {
if(err) {
return res.status(400).send(err)
}
res.cookie("x_auth", user.token)
.status(200)
.json({
loginSuccess: true,
userId: user._id
})
})
})
})
})
川を上る[email protected]二郎1234 abcd加入会員これを使ってpostmanにログインしましょう.
http://localhost:3000/login
に設定された後の方法その後bodyでraw、JSONを選択し、ここに情報を入力すればよい
{
"email": "[email protected]",
"password": "1234abcd"
}
このままsendしてみよう本物のJSONが見えてきます
コードが混同される可能性があるので、全文を入れます.
📔コード#コード#
index.js
const express = require('express')
const app = express()
const port = 3000
const mongoose = require('mongoose')
const { User } = require("./models/User")
const bodyParser = require('body-parser')
const config = require('./config/key')
const cookieParser = require('cookie-parser')
app.use(bodyParser.urlencoded({extended: true}))
app.use(bodyParser.json())
app.use(cookieParser())
mongoose.connect(config.mongoURI
).then( () => console.log('MongoDB Connected'))
.catch(err => console.log(err))
app.get('/', (req, res) => {
res.send('Hello World! BooKi')
})
app.post('/signup', (req, res) => {
//회원 가입 할 때 작성한 정보들을 가져와 DB에 넣어준다
const user = new User(req.body)
user.save((err, userInfo) => {
if (err) return res.json({ success: false, err})
return res.status(200).json({
success: true
})
})
})
app.post('/login', (req, res) => {
User.findOne({ email: req.body.email }, (err, user) => {
if(!user) {
return res.json({
loginSuccess: false,
message: "해당 이메일에 해당하는 유저가 없습니다."
})
}
user.comparePassword(req.body.password, (err, isMatch) => {
if(!isMatch){
return res.json({
loginSuccess: false,
message: "비밀번호가 틀렸습니다."
})
}
user.generateToken((err, user) => {
if(err) {
return res.status(400).send(err)
}
res.cookie("x_auth", user.token)
.status(200)
.json({
loginSuccess: true,
userId: user._id
})
})
})
})
})
app.listen(port, () => {
console.log(`http://localhost:${port}/`)
})
user.jsconst mongoose = require('mongoose')
const bcrypt = require('bcrypt')
const saltRounds = 10
const jwt = require('jsonwebtoken')
const userSchema = mongoose.Schema({
name: {
type: String,
maxlength: 50
},
email: {
type: String,
trim: true,
unique: 1
},
password: {
type: String,
minlength: 5
},
role: {
type: Number,
default: 0
},
image: String,
token: {
type: String
},
tokenExp:{
type: Number
}
})
userSchema.pre('save', function(next){
let user = this;
if (user.isModified('password')){
bcrypt.genSalt(saltRounds, function (err, salt) {
if(err) return next(err)
bcrypt.hash(user.password, salt, function (err, hash){
if(err) return next(err)
user.password = hash
next()
})
})
} else {
next()
}
})
userSchema.methods.comparePassword = function(plainPassword, cb) {
bcrypt.compare(plainPassword, this.password, function(err, isMatch) {
if(err) return cb(err)
cb(null, isMatch)
})
}
userSchema.methods.generateToken = function(cb){
let user = this
let token = jwt.sign(user._id.toHexString(), 'secretToken');
user.token = token
user.save(function(err, user){
if(err) return cb(err)
cb(null, user)
})
}
const User = mongoose.model('User', userSchema)
module.exports = { User }
Reference
この問題について(プロジェクト1-ログイン機能), 我々は、より多くの情報をここで見つけました https://velog.io/@qnrl3442/프로젝트-1-로그인-기능テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol