Showing
5 changed files
with
270 additions
and
46 deletions
| ... | @@ -3,4 +3,5 @@ json_datas.json | ... | @@ -3,4 +3,5 @@ json_datas.json |
| 3 | client/public/images | 3 | client/public/images |
| 4 | client/node_modules | 4 | client/node_modules |
| 5 | client/src/config | 5 | client/src/config |
| 6 | -database.json | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 6 | +database.json | ||
| 7 | +jwt_key.json | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| 1 | -import React from 'react'; | 1 | +import React, { useState } from 'react'; |
| 2 | import { Button, Form, FormGroup, Label, Input} from 'reactstrap'; | 2 | import { Button, Form, FormGroup, Label, Input} from 'reactstrap'; |
| 3 | - | ||
| 4 | import {FacebookLoginButton} from 'react-social-login-buttons'; | 3 | import {FacebookLoginButton} from 'react-social-login-buttons'; |
| 5 | 4 | ||
| 5 | + | ||
| 6 | + | ||
| 6 | const SigninPage = (props) => { | 7 | const SigninPage = (props) => { |
| 8 | + | ||
| 9 | +// const [userName, setUserName] = useState(''); | ||
| 10 | +// const [userPw, setuserPw] = useState(''); | ||
| 11 | + | ||
| 12 | +// const signinApi = (user) => { | ||
| 13 | +// return fetch('/api/signin', { | ||
| 14 | +// method: 'POST', | ||
| 15 | +// headers: { | ||
| 16 | +// 'Content-Type': 'application/json' | ||
| 17 | +// }, | ||
| 18 | +// body: JSON.stringify(user) | ||
| 19 | +// }).then(response => response.json()) | ||
| 20 | +// } | ||
| 21 | + | ||
| 22 | +// const handleSubmit = async (e) => { | ||
| 23 | +// e.preventDefault(); | ||
| 24 | +// if (!userId || !userPw) { | ||
| 25 | +// return; | ||
| 26 | +// } | ||
| 27 | +// try { | ||
| 28 | +// const response = await loginApi({ | ||
| 29 | +// user_id: userId, | ||
| 30 | +// user_pw: userPw | ||
| 31 | +// }); | ||
| 32 | + | ||
| 33 | +// if (response.result === 'ok') { | ||
| 34 | +// setToken(); | ||
| 35 | +// } else { | ||
| 36 | +// throw new Error(response.error); | ||
| 37 | +// } | ||
| 38 | +// } catch (err) { | ||
| 39 | +// alert('로그인에 실패했습니다.'); | ||
| 40 | +// setUserId(''); | ||
| 41 | +// setUserPw(''); | ||
| 42 | +// console.error('login error', err); | ||
| 43 | +// } | ||
| 44 | +// }; | ||
| 45 | +// }; | ||
| 7 | return ( | 46 | return ( |
| 8 | <> | 47 | <> |
| 9 | <Form style={{ | 48 | <Form style={{ | ... | ... |
| ... | @@ -105,6 +105,11 @@ | ... | @@ -105,6 +105,11 @@ |
| 105 | "concat-map": "0.0.1" | 105 | "concat-map": "0.0.1" |
| 106 | } | 106 | } |
| 107 | }, | 107 | }, |
| 108 | + "buffer-equal-constant-time": { | ||
| 109 | + "version": "1.0.1", | ||
| 110 | + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", | ||
| 111 | + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" | ||
| 112 | + }, | ||
| 108 | "bytes": { | 113 | "bytes": { |
| 109 | "version": "3.1.0", | 114 | "version": "3.1.0", |
| 110 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", | 115 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", |
| ... | @@ -265,6 +270,14 @@ | ... | @@ -265,6 +270,14 @@ |
| 265 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", | 270 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", |
| 266 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" | 271 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" |
| 267 | }, | 272 | }, |
| 273 | + "ecdsa-sig-formatter": { | ||
| 274 | + "version": "1.0.11", | ||
| 275 | + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", | ||
| 276 | + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", | ||
| 277 | + "requires": { | ||
| 278 | + "safe-buffer": "^5.0.1" | ||
| 279 | + } | ||
| 280 | + }, | ||
| 268 | "ee-first": { | 281 | "ee-first": { |
| 269 | "version": "1.1.1", | 282 | "version": "1.1.1", |
| 270 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", | 283 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", |
| ... | @@ -545,6 +558,49 @@ | ... | @@ -545,6 +558,49 @@ |
| 545 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", | 558 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", |
| 546 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" | 559 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" |
| 547 | }, | 560 | }, |
| 561 | + "jsonwebtoken": { | ||
| 562 | + "version": "8.5.1", | ||
| 563 | + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", | ||
| 564 | + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", | ||
| 565 | + "requires": { | ||
| 566 | + "jws": "^3.2.2", | ||
| 567 | + "lodash.includes": "^4.3.0", | ||
| 568 | + "lodash.isboolean": "^3.0.3", | ||
| 569 | + "lodash.isinteger": "^4.0.4", | ||
| 570 | + "lodash.isnumber": "^3.0.3", | ||
| 571 | + "lodash.isplainobject": "^4.0.6", | ||
| 572 | + "lodash.isstring": "^4.0.1", | ||
| 573 | + "lodash.once": "^4.0.0", | ||
| 574 | + "ms": "^2.1.1", | ||
| 575 | + "semver": "^5.6.0" | ||
| 576 | + }, | ||
| 577 | + "dependencies": { | ||
| 578 | + "ms": { | ||
| 579 | + "version": "2.1.2", | ||
| 580 | + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", | ||
| 581 | + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" | ||
| 582 | + } | ||
| 583 | + } | ||
| 584 | + }, | ||
| 585 | + "jwa": { | ||
| 586 | + "version": "1.4.1", | ||
| 587 | + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", | ||
| 588 | + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", | ||
| 589 | + "requires": { | ||
| 590 | + "buffer-equal-constant-time": "1.0.1", | ||
| 591 | + "ecdsa-sig-formatter": "1.0.11", | ||
| 592 | + "safe-buffer": "^5.0.1" | ||
| 593 | + } | ||
| 594 | + }, | ||
| 595 | + "jws": { | ||
| 596 | + "version": "3.2.2", | ||
| 597 | + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", | ||
| 598 | + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", | ||
| 599 | + "requires": { | ||
| 600 | + "jwa": "^1.4.1", | ||
| 601 | + "safe-buffer": "^5.0.1" | ||
| 602 | + } | ||
| 603 | + }, | ||
| 548 | "locate-path": { | 604 | "locate-path": { |
| 549 | "version": "3.0.0", | 605 | "version": "3.0.0", |
| 550 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", | 606 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", |
| ... | @@ -559,6 +615,41 @@ | ... | @@ -559,6 +615,41 @@ |
| 559 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", | 615 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", |
| 560 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" | 616 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" |
| 561 | }, | 617 | }, |
| 618 | + "lodash.includes": { | ||
| 619 | + "version": "4.3.0", | ||
| 620 | + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", | ||
| 621 | + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" | ||
| 622 | + }, | ||
| 623 | + "lodash.isboolean": { | ||
| 624 | + "version": "3.0.3", | ||
| 625 | + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", | ||
| 626 | + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" | ||
| 627 | + }, | ||
| 628 | + "lodash.isinteger": { | ||
| 629 | + "version": "4.0.4", | ||
| 630 | + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", | ||
| 631 | + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" | ||
| 632 | + }, | ||
| 633 | + "lodash.isnumber": { | ||
| 634 | + "version": "3.0.3", | ||
| 635 | + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", | ||
| 636 | + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" | ||
| 637 | + }, | ||
| 638 | + "lodash.isplainobject": { | ||
| 639 | + "version": "4.0.6", | ||
| 640 | + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", | ||
| 641 | + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" | ||
| 642 | + }, | ||
| 643 | + "lodash.isstring": { | ||
| 644 | + "version": "4.0.1", | ||
| 645 | + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", | ||
| 646 | + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" | ||
| 647 | + }, | ||
| 648 | + "lodash.once": { | ||
| 649 | + "version": "4.1.1", | ||
| 650 | + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", | ||
| 651 | + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" | ||
| 652 | + }, | ||
| 562 | "media-typer": { | 653 | "media-typer": { |
| 563 | "version": "0.3.0", | 654 | "version": "0.3.0", |
| 564 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", | 655 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", | ... | ... |
| ... | @@ -20,6 +20,7 @@ | ... | @@ -20,6 +20,7 @@ |
| 20 | "concurrently": "^5.2.0", | 20 | "concurrently": "^5.2.0", |
| 21 | "express": "^4.17.1", | 21 | "express": "^4.17.1", |
| 22 | "iconv-lite": "^0.5.1", | 22 | "iconv-lite": "^0.5.1", |
| 23 | + "jsonwebtoken": "^8.5.1", | ||
| 23 | "mysql": "^2.18.1" | 24 | "mysql": "^2.18.1" |
| 24 | } | 25 | } |
| 25 | } | 26 | } | ... | ... |
| 1 | -const express = require('express'); | 1 | +const express = require("express"); |
| 2 | -const bodyParser = require('body-parser'); | 2 | +const bodyParser = require("body-parser"); |
| 3 | -const fs = require('fs'); | 3 | +const fs = require("fs"); |
| 4 | -const mysql = require('mysql'); | 4 | +const mysql = require("mysql"); |
| 5 | -const iconv = require('iconv-lite'); | 5 | +const iconv = require("iconv-lite"); |
| 6 | +const jwt = require("jsonwebtoken"); | ||
| 6 | 7 | ||
| 7 | -const bcrypt = require('bcrypt'); | 8 | +const bcrypt = require("bcrypt"); |
| 8 | -const saltRounds = 10; | 9 | +const saltRounds = 10; |
| 9 | 10 | ||
| 10 | const app = express(); | 11 | const app = express(); |
| 11 | const port = process.env.PORT || 5000; | 12 | const port = process.env.PORT || 5000; |
| 12 | 13 | ||
| 13 | -const dataBuffer = fs.readFileSync('json_datas.json') | 14 | +const dataBuffer = fs.readFileSync("json_datas.json"); |
| 14 | 15 | ||
| 16 | +const jwt_key = fs.readFileSync("./jwt_key.json"); | ||
| 17 | +const jwt_secret_key = JSON.parse(jwt_key); | ||
| 15 | 18 | ||
| 16 | // db connection | 19 | // db connection |
| 17 | -const data = fs.readFileSync('./database.json'); | 20 | +const data = fs.readFileSync("./database.json"); |
| 18 | const conf = JSON.parse(data); | 21 | const conf = JSON.parse(data); |
| 19 | 22 | ||
| 20 | const connection = mysql.createConnection({ | 23 | const connection = mysql.createConnection({ |
| 21 | - host: conf.host, | 24 | + host: conf.host, |
| 22 | - user: conf.user, | 25 | + user: conf.user, |
| 23 | - password: conf.password, | 26 | + password: conf.password, |
| 24 | - port: conf.port, | 27 | + port: conf.port, |
| 25 | - database: conf.database | 28 | + database: conf.database, |
| 26 | }); | 29 | }); |
| 27 | 30 | ||
| 28 | connection.connect(); | 31 | connection.connect(); |
| ... | @@ -30,40 +33,129 @@ connection.connect(); | ... | @@ -30,40 +33,129 @@ connection.connect(); |
| 30 | app.use(bodyParser.json()); | 33 | app.use(bodyParser.json()); |
| 31 | app.use(bodyParser.urlencoded({ extended: true })); | 34 | app.use(bodyParser.urlencoded({ extended: true })); |
| 32 | 35 | ||
| 33 | -app.get('/api/hello', (req, res) => { | 36 | +app.get("/api/hello", (req, res) => { |
| 34 | - res.send('Hello skrrrr!'); | 37 | + res.send("Hello skrrrr!"); |
| 35 | }); | 38 | }); |
| 36 | 39 | ||
| 37 | // datas 전달 | 40 | // datas 전달 |
| 38 | -app.get('/api/datas', (req, res) => { | 41 | +app.get("/api/datas", (req, res) => { |
| 39 | - iconv.extendNodeEncodings(); | 42 | + iconv.extendNodeEncodings(); |
| 40 | - res.header("Access-Control-Allow-Origin", "*"); | 43 | + res.header("Access-Control-Allow-Origin", "*"); |
| 41 | - res.send(iconv.decode(dataBuffer, 'EUC-KR').toString()); | 44 | + res.send(iconv.decode(dataBuffer, "EUC-KR").toString()); |
| 42 | -}) | 45 | +}); |
| 43 | 46 | ||
| 47 | +// ???? ???? ?? | ||
| 44 | // signup | 48 | // signup |
| 45 | -app.post('/api/signup', (req, res) => { | 49 | +app.post("/api/signup", (req, res) => { |
| 46 | - let sql = 'INSERT INTO USER (name, pw) VALUES(?, ?)'; | 50 | + let sql = "INSERT INTO USER (name, pw) VALUES(?, ?)"; |
| 47 | - let plainPassword = req.body.password; | 51 | + let plainPassword = req.body.password; |
| 48 | - bcrypt.hash(plainPassword, saltRounds, function(err, hash) { | 52 | + bcrypt.hash(plainPassword, saltRounds, function (err, hash) { |
| 53 | + const params = [req.body.username, hash]; | ||
| 54 | + connection.query(sql, params, (err, rows, fields) => { | ||
| 55 | + if (err) { | ||
| 56 | + console.log(err); | ||
| 57 | + res.send({ | ||
| 58 | + code: 400, | ||
| 59 | + message: "error", | ||
| 60 | + }); | ||
| 61 | + } else { | ||
| 62 | + res.send({ | ||
| 63 | + code: 200, | ||
| 64 | + message: "success", | ||
| 65 | + }); | ||
| 66 | + } | ||
| 67 | + }); | ||
| 68 | + }); | ||
| 69 | +}); | ||
| 70 | + | ||
| 71 | +// ???? | ||
| 72 | +// res.send({ | ||
| 73 | +// "code":200, | ||
| 74 | +// "message": "success" | ||
| 75 | +// }) | ||
| 76 | +// ???? | ||
| 77 | +// jwt_secret_key.value | ||
| 78 | +// signin | ||
| 79 | +app.post("/api/signin", (req, res) => { | ||
| 80 | + // ???? | ||
| 81 | +// res.send('aa'); | ||
| 82 | + const name = req.body.username; | ||
| 83 | + let sql = `SELECT name, pw FROM USER WHERE name='${req.body.username}';`; | ||
| 84 | + | ||
| 85 | + connection.query(sql, (err, rows, fields) => { | ||
| 86 | + | ||
| 87 | + if (!rows) { | ||
| 88 | + res.send({ | ||
| 89 | + code: 400, | ||
| 90 | + message: "failed", | ||
| 91 | + }); | ||
| 92 | + return ; | ||
| 93 | + } | ||
| 49 | 94 | ||
| 50 | - const params = [req.body.username, hash]; | 95 | + else{ |
| 51 | - connection.query(sql, params, (err, rows, fields) => { | 96 | + |
| 52 | - if(err){ | 97 | + bcrypt.compare(req.body.password, rows[0].pw, function (err, result){ |
| 53 | - console.log(err); | 98 | + const pw = rows[0].pw; |
| 54 | - res.send({ | 99 | + if(result) { |
| 55 | - "code":400, | 100 | + |
| 56 | - "message": "error" | 101 | + try { |
| 57 | - }) | 102 | + // jwt.sign() ???: ?? ?? |
| 58 | - } | 103 | + const token = jwt.sign( |
| 59 | - else { | 104 | + { |
| 60 | - res.send({ | 105 | + name, |
| 61 | - "code":200, | 106 | + pw, |
| 62 | - "message": "success" | 107 | + }, |
| 63 | - }) | 108 | + jwt_secret_key.value, |
| 64 | - } | 109 | + { |
| 65 | - }) | 110 | + expiresIn: "60m", // 60? |
| 111 | + issuer: "admin", | ||
| 112 | + } | ||
| 113 | + ); | ||
| 114 | + | ||
| 115 | + return res.json({ | ||
| 116 | + code: 200, | ||
| 117 | + message: '??? ???????.', | ||
| 118 | + token, | ||
| 119 | + }); | ||
| 120 | + | ||
| 121 | + } catch (error) { | ||
| 122 | + console.error(error); | ||
| 123 | + return res.status(500).json({ | ||
| 124 | + code: 500, | ||
| 125 | + message: '?? ??', | ||
| 126 | + }); | ||
| 127 | + } | ||
| 128 | + | ||
| 129 | + } else { | ||
| 130 | + res.send({ | ||
| 131 | + code: 400, | ||
| 132 | + message: "failed", | ||
| 133 | + }); | ||
| 134 | + } | ||
| 135 | + }) | ||
| 136 | + } | ||
| 66 | }) | 137 | }) |
| 67 | -}) | 138 | +}); |
| 139 | +// else { | ||
| 140 | +// bcrypt.compare(req.body.password, rows[0].pw, function (err, res) { | ||
| 141 | +// console.log(res); | ||
| 142 | +// if(!res) { | ||
| 143 | +// res.send({ | ||
| 144 | +// code: 400, | ||
| 145 | +// message: "failed", | ||
| 146 | +// }); | ||
| 147 | +// } | ||
| 148 | +// else { | ||
| 149 | +// // ???? ??? ? | ||
| 150 | +// const pw = rows[0].pw; | ||
| 151 | + | ||
| 152 | +// } | ||
| 153 | +// }); | ||
| 154 | + | ||
| 155 | +// } | ||
| 156 | + | ||
| 157 | +// }); | ||
| 158 | + | ||
| 159 | + | ||
| 68 | 160 | ||
| 69 | -app.listen(port, () => console.log(`Listening on port ${port}`)); | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 161 | +app.listen(port, () => console.log(`Listening on port ${port}`)); | ... | ... |
-
Please register or login to post a comment