Explorar o código

feat:add passwords hash

Sergey %!s(int64=3) %!d(string=hai) anos
pai
achega
23d8dc138a
Modificáronse 3 ficheiros con 59 adicións e 33 borrados
  1. 45 28
      backend/app.js
  2. 1 1
      backend/db/models/User.js
  3. 13 4
      frontend/src/components/loginForm/LoginForm.js

+ 45 - 28
backend/app.js

@@ -6,6 +6,13 @@ const mongoose = require('mongoose');
 const socket = require("socket.io");
 const User = require('./db/models/User');
 const jwt = require('jsonwebtoken');
+const bcrypt = require('bcrypt');
+
+
+
+
+
+
 
 const server = http.createServer(app);
 const jsonParser = express.json();
@@ -41,7 +48,14 @@ app.get('/', (req, res) => {
 
 
 
-const KEY = '777'
+const TOKEN_KEY = 'rturutrrtrtu 45747547'; //change
+
+const HASH_KEY = 7;
+
+
+
+
+ 
 
 const generateToken = (id, userName, isAdmin) => {
     const payload = {
@@ -49,55 +63,58 @@ const generateToken = (id, userName, isAdmin) => {
         userName,
         isAdmin
     }
-    return jwt.sign(payload, KEY, {expiresIn: '12h'});
+    return jwt.sign(payload, TOKEN_KEY, {expiresIn: '12h'});
 
 }
 
 
-
 app.post('/login', jsonParser, async (req, res) => {
     try {
-        const {
-            userName,
-            password
-        } = req.body;
-
-        const allUsers = await User.find({}).exec();
-        const isFirst = !allUsers.length;
-        const dbUser = await User.findOne({
-            userName
-        })
-        
+        const {userName,password} = req.body;
+
+        const hashPassword =await bcrypt.hash(password, HASH_KEY);
+
+        const usersCount = await User.count().exec();//count users rename
 
+        const isFirst = !usersCount;
+
+        const dbUser = await User.findOne({userName})
 
         if (isFirst) { // if first create as admin
             const newUser = new User({
-                userName,
-                password,
-                isAdmin: true
-            });
+                                userName,
+                                hashPassword,
+                                isAdmin: true
+                            });
+            //trycatch?     
+
             const user = await newUser.save();
-            console.log(user);
+            const token = generateToken(user._id, userName, user.isAdmin);
+            res.json(token)
+            return;
             
-            res.send(JSON.stringify(user))
-        } else if (dbUser) { //if find must login
-            console.log('find user - must login it')
-            res.send(JSON.stringify(dbUser))
+            } 
+        if (dbUser) { //if find must login
+                try {
+                    const token = generateToken(user._id, userName, user.isAdmin);
+                    res.json({token})
+                } catch (e) {
+                    console.log(e)
+                }
+
         } else { //create new user in db
             const newUser = new User({
                 userName,
-                password,
+                hashPassword,
                 isAdmin: false
             });
+            
             const user = await newUser.save();
             console.log(user);
             const token = generateToken(user._id, userName, user.isAdmin);
-            console.log(token)
-            res.send(JSON.stringify(token))
+            res.json({token})
         }
 
-        //res.send(JSON.stringify(dbUser))
-
     } catch (e) {
         console.log(e)
     }

+ 1 - 1
backend/db/models/User.js

@@ -3,7 +3,7 @@ const {model, Schema} = require('mongoose');
 
 const User = new Schema({
     userName: {type: String, unique: true, required: true},
-    password: {type: String, required: true},
+    hashPassword: {type: String, required: true},
     isAdmin: {type: Boolean, default: false}
 
 })

+ 13 - 4
frontend/src/components/loginForm/LoginForm.js

@@ -8,17 +8,26 @@ import { sendForm } from './utils/sendForm';
 
 
 
+
 export const LoginForm = () => {
 
     const [userData, setUserdata] = useState({userName:'', password: ''});
 
     const POST_URL = 'http://localhost:5000/login';
 
+
+    const isValidPayload = ({userName, password}) => {
+        return (userName.trim().length > 2 && password.trim().length > 4) 
+    }
+
+
     const handleSubmit = (e) => {
         e.preventDefault();
-    //    console.log(userData)
-        sendForm(POST_URL, userData);
-        setUserdata({userName:'', password: ''});
+        if(isValidPayload({...userData})){
+            sendForm(POST_URL, userData);
+            setUserdata({userName:'', password: ''});
+        } else console.log('too short') // later do user alert 
+        
     }
 
     
@@ -43,7 +52,7 @@ export const LoginForm = () => {
                 autoComplete="email"
                 autoFocus
                 value={userData.userName}
-                onChange={e => setUserdata({...userData, userName: e.target.value})}
+                onChange={e => setUserdata({...userData, userName: e.target.value})}//
                 
                 />
                 <TextField