[211011]
10์์ ์ฒ์์ผ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ๋ง๋ค์ด๋ณด๋ฉด์ ๊ฐ๋ตํ๊ฒ ์ ์๋ ๊ธฐ๋ก๋ค์ด๋ค. ํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ๋ฅผ ๊ฐ์คํ๋ฉด์ ๊ทธ๋๋ก ์ฎ๊ธด ๊ธ. ์ด๋๋ ์ด์ฌํ ์ข ์ธ๊ฑธ ๊ทธ๋ฌ๋ค.
์ฝ๋๋ฅผ ๋์์ธํ ๋ฐฉ๋ฒ์ด ์ ์์ ์ธ ๋ฐฉ๋ฒ์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ด์ฐ ๋๋ ๋์๊ฐ๊ธฐ๋ ํ๋ค.
๋ง๋ค์ด์ง ํ์คํฐ๋ฅผ ์ด๋ฏธ์ง๋ก ๋ณํํด์ ํ์ผ๋ก ๋ค์ด๋ฐ์ ์ ์๊ณ , ์๋ฒ์ ์ ๋ก๋ํด์ ๋ณผ ์ ์๋ค. sns ํผ๋์ฒ๋ผ ๋ง๋ค๊ณ ์ถ์ด์ ํ์๊ฐ์ ๊ณผ ๋ก๊ทธ์ธ๋ ๊ฐ๋จํ ๊ตฌํํ๋ค.
ํ์๊ฐ์
์ ๋ ฅํ ์ ๋ณด๋ฅผ ๊ทธ๋ฅ json ํ์์ผ๋ก ๋ณด๋๋ค. ์ด๋ฏธ ์๋ id๋ฉด ๊ทธ๋ฅ ๋ฆฌํดํ๊ณ ์ id์ธ ๊ฒฝ์ฐ์ ํ์๊ฐ์ ์ ์งํํ๋ค. bcrypt ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด์ ์ํธํ๋ฅผ ํด์ db์ ์ ์ฅํ๋ค. ์๊พธ ์ค๋ฅ๊ฐ ๋๋๋ฐ ๋ฐ์ด๋๋ฆฌ ํ์์ผ๋ก ๋์ค๋ํด์ str์ผ๋ก ๋์ฝ๋ฉํด์ ๋ณด๋ด๋๊น ์ค๋ฅ๋ ์๋๋ค.
@app.route('/api/join', methods=['POST'])
def post_join():
data = request.get_json()
findID = db.user.find_one({"join_id":data['join_id']})
if findID:
return jsonify({'msg':"invalid"})
password = data['join_password']
bpw = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
str_bpw = bpw.decode('utf-8')
data['join_password'] = str_bpw
print(data)
db.user.insert_one(data)
return jsonify({'msg':"registered"})
๋ก๊ทธ์ธ
@app.route('/api/login', methods=['POST'])
def post_login():
data = request.get_json()
password = data['login_password']
findID = db.user.find_one({"join_id":data['login_id']},{'_id': False})
if findID:
db_bpw = findID['join_password']
db_id = findID["join_id"]
checkpw = bcrypt.checkpw(password.encode('utf-8'), db_bpw.encode('utf-8'))
print(checkpw)
if checkpw:
jwt_token = jwt.encode({"id":db_id, 'exp':datetime.utcnow() + timedelta(weeks=5)}, app.config['JWT_SECRET_KEY'], algorithm)
str_jwt = jwt_token.decode('utf-8')
db.user.update({'join_id':db_id}, {'$set':{'jwt':str_jwt}})
return jsonify({'msg':"allowed", "name":db_id,"access_token":str_jwt })
print(data)
return jsonify({'msg':"tryagain"})
๋ฐ์์จ ๋ฐ์ดํฐ์ ๋น๋ฐ๋ฒํธ์ db์ ์๋ ๋น๋ฐ๋ฒํธ๋ฅผ ๋น๊ตํ๋ค. db์ ์๋ ๊ฐ์ ์ํธํ๋ ๊ฐ. checkpw๊ฐ true๋ผ๋ฉด ๋ก๊ทธ์ธ ๊ณผ์ ์ ์งํํ๋ค. jwt ํ ํฐ์ ๋ฐ๊ธํด์ ๋ค์ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ด์ฃผ์. ํ ํฐ์ payload์๋ ์ ์ id๊ฐ ๋ด๊ฒจ์๊ณ , ์ ํจ๊ธฐ๊ฐ์ 5์ฃผ๋ก ์ผ๋จ ํด ๋์๋ค. ์ด์ธ์ค ํ ํฐ๊ณผ ๋ฆฌํ๋ ์ฌ ํ ํฐ์ ๋ํด์ ์กฐ๊ธ ๋ ๊ณต๋ถํด ๋ณด์์ผ๊ฒ ๋ค.
if (msg == "allowed") {
context.setUser({
name: response.data.name,
id: details.id,
});
const access_token = response.data.access_token;
cookies.set("jwt", access_token, {
path: "/",
maxAge: 60 * 60 * 24 * 30, //httponly ์ต์
์ ์์ ๋๊น ๋๋ค,,
});
} else if (msg == "tryagain") {
setError("ID์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ํํ ์
๋ ฅํด ์ฃผ์ธ์. ");
}
ํด๋ผ์ด์ธํธ์์๋ ๋ฐ์์จ jwt ํ ํฐ์ ์ฟ ํค์ ์ ์ฅํ๋ค. universal-cookie ๋ผ๋ ํจํค์ง๋ฅผ ์ด์ฉํ์. httpOnly ์ต์ ์ ๋ฃ์๋๋ ์ฟ ํค๊ฐ ์์ฑ์ด ์๋๋ค. ํน์ ๋ชฐ๋ผ์ ๋บ๋๋ ๋๋๋ผ. ์๊ทธ๋ด๊น ์ฐพ์๋ดค๋๋ ๋๋ฉ์ธ์ด .com ๊ฐ์ ๋ฅ๊ฐ ์๋๋ฉด ๋ง๋๋จ๋ค..
html-to-image
dom ์์๋ฅผ ์ด๋ฏธ์ง๋ก ๋ณํํ ์ ์๋ค. ๋ค์ํ ํํ์ ์ด๋ฏธ์งํ์ผ์ ์ป์ ์ ์๋ค.
const onSave = useCallback(() => {
console.log(canvas.current.firstChild.style.width);
if (canvas.current === null) {
return;
}
toPng(canvas.current.firstChild, {
cacheBust: true,
})
.then((dataUrl) => {
console.log(dataUrl);
const link = document.createElement("a");
link.download = "my-topster.png";
link.href = dataUrl;
link.click();
})
.catch((err) => {
console.log(err);
});
}, [canvas]);
useRef ํ
์ผ๋ก ํด๋น dom์ ๊ฐ์ ธ์์ toPng ํจ์์ ๋งค๊ฐ๋ณ์๋ก ๋๊ฒผ๋ค. ์ด๋ฏธ์ง๋ฅผ dataUrl ํ์์ผ๋ก ๋ฐํํ๋๋ฐ ๊ทธ๋๋ก ์ด๋ฏธ์ง ํ์ผ๋ก ์ ์ฅ์ด ๋๋๋ผ. data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAk0AAAIpC...
๋์ถฉ ์ด๋ฐ ํํ์ด๋ค.