[Web]ノード.js&react会員管理-4
5958 ワード
ログイン/ログアウトAPIの作成
index.js
ログイン時にチェックする要素の順に作成し、チェックした要素がfalseの場合にエラーメッセージを送信し、trueの場合は続行します.
1.記入したメールがDBにあるか
User.findOne
は基本関数です.{email: req.body.email}
postmanに送信されると、本文からキー「email」の値が取得されるconst cookieParser = require('cookie-parser')
app.post('/api/users/login', (req, res) => {
//요청된 이메일을 DB에 있는지 찾고
User.findOne({ email: req.body.email }, (err, user) => {
if(!user) {
return res.json({
loginSucess: false,
message: "제공된 이메일에 해당하는 유저가 없습니다."
})
}
//있으면 비밀번호가 맞는건지 확인
user.comparePassword(req.body.password, (err, isMatch) => {
if(!isMatch)
return res.json({
loginSucess: false,
message: "비밀번호가 잘못되었습니다."
})
})
//같으면 Token 생성
user.generateToken((err, user) => {
if(err) return res.status(400).send(err);
//생성한 토큰을 user에 넣었고, 어딘가에 저장해야함 쿠키나 로컬 스토리지
res.cookie("x_auth", user.token)
.status(200)
.json({loginSuccess: true, userId: user._id})
})
})
})
2.正しいパスワードが入力されている
user.comparePassword
は関数を使用します.jsで作成入力したpasswordを暗号化し、既存の暗号化値を比較して一致するとtrueを返します.
userSchema.methods.comparePassword = function(plainPassword, cb){
bcrypt.compare(plainPassword, this.password, function(err, isMatch) {
if(err) return cb(err)
cb(null, isMatch)
})
}
3.ログイン可能な場合はtokenを作成
認証ページに接続するには、tokenを作成してクッキー内の任意の場所に保存します.tokenが一致する場合にのみ使用できます.
npm install jsonwebtoken --save
インストール
https://www.npmjs.com/package/jsonwebtoken
使用方法は次のとおりです.
このようにしてまずjwtをrequireにインポートする.
sign関数でtokenを生成する
User.jsには以下のように記入します.
const jwt = require('jsonwebtoken');
userSchema.methods.generateToken = function(cb){
var user = this;
//json web token을 이용해서 토큰 생성
var token = jwt.sign(user._id.toHexString(), 'secretToken')
user.token = token
user.save(function(err, user){
if(err) return cb(err)
cb(null, user)
})
}
index.jsが作成したgenerateToken関数を呼び出してtokenを作成生成したタグをクッキーに保存する必要があります.
npm install cookie-parser --save
そしてインデックスjsでタグを作成する部分
user.generateToken((err, user) => {
if(err) return res.status(400).send(err);
//생성한 토큰을 user에 넣었고, 어딘가에 저장해야함 쿠키나 로컬 스토리지
res.cookie("x_auth", user.token)
.status(200)
.json({loginSuccess: true, userId: user._id})
})
そうすればいい4. auth.js検証チェックの使用
自由に管理できますが、authはserver>ミドルウェアフォルダのサブフォルダにあります.jsをしました
auth.jsで作成され、
「Cookieに格納されているトークン」と「ユーザーモジュール」の比較
User.findByToken
関数を使用してCookieに格納されたタグを比較に入れてエラーチェックを行いますconst { User } = require('../models/User')
let auth = (req, res, next) => {
//인증처리를 하는곳
//DB에서 가지고있는 토큰과 캐시에서 가지고 있는 토큰을 비교
//클라이언트 쿠키에서 토큰을 가져옴
let token = req.cookies.x_auth;
//토큰 복호화한 후, 유저 찾기
User.findByToken(token, (err, user) => {
if(err) throw err;
if(!user) return res.json({isAuth: false, error: true});
req.token = token;
req.user = user;
next();
})
}
module.exports = { auth };
User.findByToken
関数はUserです.js端でStaticにするUser.js
userSchema.statics.findByToken = function(token, cb){
var user = this;
//가져온 토큰을 decode => User Id가 나옴
jwt.verify(token, 'secretToken', function(err, decoded){
user.findOne({"_id": decoded, "token":token}, function(err, user){
if(err) return cb(err);
cb(null, user)
})
})
}
jwt.verify()
の2番目の因子は、トークンを最初に生成したときと同じでなければならない.復号タグによって生成された値は、
findOne()
関数を使用してパラメータを検索する論理であるuser IDを生成する.index.jsでauthを呼び出すGET APIを作成して成功、失敗を真にする
app.get('/api/users/auth', auth, (req, res) => {
res.status(200).json({
_id: req.user._id,
isAdmin: req.user.role === 0 ? false : true,
isAuth:true,
email:req.user.email,
lastname:req.user.lastname,
role:req.user.role,
image:req.user.image
})
})
クライアントが画面にアクセスするときにチェックするisAuthとisAdminの値を入力します.5.APIのログアウト
ログインより簡単
もちろんGET APIですが、
auth
を提供しているのは、登録しなければログアウトできないからです!findOneAndUpdate
関数基本関数idを使用してtokenを検索し、tokenを空の文字列に初期化し、idのタグを破棄するapp.get('/api/users/logout', auth, (req, res) => {
User.findOneAndUpdate({_id: req.user._id}
, {token: ""}
, (err, user) => {
if(err) return res.json({success: false, err})
return res.status(200).send({
success: true
})
})
})
6.機能検証
APIのログアウトを呼び出し、tokenが初期化されているかどうかを確認します.
tokenが初期化されているのを見てください.
Reference
この問題について([Web]ノード.js&react会員管理-4), 我々は、より多くの情報をここで見つけました https://velog.io/@upisdown/웹-Node.js-React-회원관리-4テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol