반응형

📢Github 으로 로그인하기 PASSPORT

 

📋Passport

Passport 란?

브라우저에서 쿠키를 저장하고 쿠키 캐시를 갖고와서 컨트롤러에 넘기게 도와주는 미들웨어다. facebook,google,인스타그램 등등 각종 유명대기업의 인증도 도와준다. 또한 다른모듈도 다 지원을 해준다.

▼설치법

브라우저에서 쿠키를 저장하고 쿠키 캐시를 갖고와서 컨트롤러에 넘기게 도와주는 미들웨어다. facebook,google,인스타그램 등등 각종 유명대기업의 인증도 도와준다. 또한 다른모듈도 다 지원을 해준다.

npm install passport passport-local

▼사용법

passport는 쿠키도 만들어주고 쿠키를 받고 어느유저가 쿠키를 가지고 있는지 기억하고 이런걸 다 알아서 해준다.

app.post('/login',
    passport.authenticate('local'),
    function(req,res) {
        res.redirect('/users/'+req.user.username);
    });
 

 

📋passport-local-mongoose

▼Passport-local-mongoose

mongoDB에 USER에 관한 왠만한것들을 다 만들어준다. MongoDB 와 MONGOOSE 를 통해 인증을 구현하고자 한다면 이걸 설치하면 된다. 패스워드변경 , 패스워드확인 , 패스워드 생성 , 패스워드 암호화 등 모든것을 만들어준다.

npm install passport-local-mongoose

▼mongoose model

Momgoose 의 model 인 user.js

import mongoose from "mongoose";

const UserSchema = new mongoose.Schema({
    name : String,
    email: String,
    avatarUrl : String,
    facebookId : Number,
    githubId : Number
})

const model = mongoose.Model("User",UserSchema);

export default model;

 

passport.js

import passport from "passport";
import User from "./models/User";

passport.use(User.createStrategy());
//strategy 라는건 로그인 방식

passport.serializeUser(User.serializeUser()); //쿠키에 user.id 를 담는다
//serialization 어떤 정보를 쿠키에게 주느냐를 의미 (어떤 field가 쿠키에 포함될것인지)

passport.deserializeUser(User.deserializeUser()); //그 id로 사용자를 식별한다
//deserialization 어느사용자인지 어떻게 찾는가? 쿠키에 저장되어있는 userid로 어떻게 사용자를찾느냐를 의미

 

UserController.js

import User from "../models/User";

const postjoin = async (req,res) => {
    const{
        body: {name, email, password, password2}
    } = req;
    if(password !== password2){
        res.status(400);
        res.render("join",{pageTitle: "Join"});
        console.log('비밀번호틀림2');
    } else{
        try {
            //const user = await User.create({
                //create는 생성시키고 db에 저장까지 해서
            const user = await User({
                name,
                email
            });
            await User.register(user,password); //회원가입
        } catch (error) {
            console.log(error);
        }
        res.redirect(routes.home);        
    }
};

 

📋express-session 설치

▼설치법

npm install express-session

 

사용법

import session from "express-session";
app.use(session({
    secret: "ajhdfjdanfadf",
    resave: true,
    saveUninitialized : false
})
);

//공개키 암호화 기법

//resave 는 세션을 강제로 저장하게 합니다.
//saveUninitialized 는 초기화 되지 않은 (uninitialized) 세션을 저장소에 저장합니다.
//새로운 세션이지만 변경되지 않은 세션은 초기화 하지 않습니다.
//로그인 session에 이용하려면 false가 좋다

 

📋 passport github 연동

▼설치법

npm install passport-github

 

사용법

먼저 github에서 application 을 생성한다.

https://github.com/settings/applications/new .여기 링크에서 만들면 된다.

사용자가 github에 요청을 하면 github에서 사용자정보를 내가만든 웹에 정보를 줘도 되겠냐고 물어본다 그걸가지고 회원가입을 하는거다.

깃헙 아이디를 만들면 아래와 같이 화면이 뜬다. 비밀키와 아이디를 적어주자

▼ passport.js

import GithubStrategy from "passport-github";

//3번 authenticate("github") 을통해서 passport의 strategy 를 이용
passport.use(new GithubStrategy({
  clientID: (GITHUB_CLIENT_ID 을 적어주자),
  clientSecret: (GITHUB_CLIENT_SECRET 을 적어주자),
  callbackURL: (콜백 url 주소) // 4-2 깃헙페이지로 갔다가 돌아오면서 callbackURL 로 간다.
},githubLoginCallback   /*4-1번 콜백함수*/  
));

const githubLogin = passport.authenticate("github");

const githubLoginCallback = async (accessToken, refreshToken, profile, cb) => { // 5번
    const {_json : { id, avatar_url, name, email}} = profile;
    try {
        const user = await User.findOne({email}); //_json의 email과 몽고db의 email이 같은게 있는가를 찾는다
        console.log(user);
        if(user){
            user.githubId = id;  // 깃헙에서 가져온 ID를 몽고DB에 있는 ID로 바꿔준다
            user.save();
            return cb(null,user); //이걸 쿠키에 저장한다. 자동으로
        } 
            //mongo의 db와 같은게 없으면 새로 아이디를 만든다 github 내용으로 mongoDB 에
            const newUser = await User.create({
                email,                           
                name,
                githubId : id,
                avatar_url : avatar_url
            })
            return cb(null,newUser);

    } catch (error) {
        return cb(error);
    }
//passport 에서 제공하는 github 콜백햄수들을 그냥 콘솔출력
//cb는 passport로부터 제공되는것 함수인데 실행되면 passport에서
//사용자가 성공적으로 로그인되었다고 알려준다.

 

▼라우터.js

import {githubLogin, postGithubLogIn } from "../controllers/userController";

globalRouter.get(routes.github,githubLogin); // /github/login 들어오면  1번

globalRouter.get(routes.githubCallback, //callbackURL 5번
    passport.authenticate("github",{ failureRedirect: "/login"}), //실패시 6번 실패화면
    postGithubLogIn // 성공시 6번
);

▼컨트롤러.js

const githubLogin = passport.authenticate("github"); //2번

const postGithubLogIn = (req,res) =>{ //7번
    res.send(routes.home); //성공시 홈화면
};

정상적으로 github 로그인이 된다면.아래와 같은 화면이 뜰것이다

 

아래는 콘솔에 출력한 깃헙의 profile 객체 내용 이다.

📋passport 로그아웃

req.logout(); // 만써주면 된다 passport에서 지원

 

 

반응형

'프로그래밍 > NodeJS' 카테고리의 다른 글

NODE JS - FaceBook 으로 로그인하기 (passport)  (0) 2022.01.07
NODE JS - ESlint  (0) 2022.01.07
NODE JS - pug(mixin) 사용법  (0) 2022.01.05
NODE JS - multer (파일 업로드)  (0) 2019.04.10
NODE JS - WEBPACK 설치와 사용법  (0) 2019.04.10
반응형

📢NODE JS - pug(mixin) 사용법

📋MIXIN

mixin 은 pug의 함수의 일종이다. 반복적으로 사용되는 html 구조를 mixin의 정의하고 그값을 인자함수로 정의해줌으로써 반복되는 html 안에 변수를 설정해줄수있다. 아래 소스의 +는 mixin을 포함하여 실행한다는 뜻이다.

💻videoBlock.pug

mixin videoBlock(video ={})
    .videoBlock
        video.videoBlock__thumbnail(src=video.videoFile, controls=true)
        h4.videoBlock__title=video.title
        h6.videoBlock__views=video.views

 

💻home.pug

include mixins/videoBlock

each object in videos //for .. in 같은 pug 전용 반복문이다.
    +videoBlock({
        title: object.title,
        description:object.description
    })

💻videoController.js (단지 pug의 videos의 객체를 전달해주기 위함)

const videos = {title : '제목' , description : '내용'};
const home = (req,res) => {
    res.render('home',{videos});
};
반응형

'프로그래밍 > NodeJS' 카테고리의 다른 글

NODE JS - ESlint  (0) 2022.01.07
NODE JS - Github 으로 로그인하기 (passport)  (0) 2022.01.05
NODE JS - multer (파일 업로드)  (0) 2019.04.10
NODE JS - WEBPACK 설치와 사용법  (0) 2019.04.10
NODE JS - express URL 파라미터  (2) 2019.03.28
반응형

◎ PM2 란?

▼ node js를 실행하는 프로세스를 제어할수있다.

다중으로 실행 , 끄기 , 강제로종료해도 프로세스가 다시살아나기 등등을 할수 있는 패키지이다


◎ PM2 패키지 설치법

▼ 내용.

npm install pm2 -g //global 이란 뜻이다. 어디서든 사용할수 있다는 옵션이다

◎ PM2 패키지 사용법

▼ 내용

아래와 같이 실행하면 아래 사진처럼 현재 status를 알려준다

실행되고 다시 콘솔로 오는거 같다

pm2 start app.js pm2 start app.js --watch // 실행할 js파일을 --watch 옵션으로 실행하면 소스 수정후 저장하면 // 자동으로 node를 재시작해줘서 소스적용이 된다. pm2 start app.js --watch --no-daemon //백그라운드로 실행되는 프로그램을 데몬이라고 부릅니다. //nodaemon을 치면 백그라운드 실행이아니라서 실행후 바로 log를 볼수있게됩니다. pm2 start app.js --watch --ignore-watch="(파일경로)" --no-daemon //이렇게 실행할경우 해당 파일경로에 파일들이 수정될때는 서버가 재시작 하지 않는다


◎ PM2 모니터링

▼ 내용

pm2 모니터링 왼쪽 창이 현재 실행중인 프로세스의 목록이다

pm2 monit


◎ pm2 list 확인

▼ 내용

pm2 의 현재 실행중인 프로세스 status 확인

pm2 list



◎ pm2 프로세스 종료

▼ 내용

pm2로 실행한 프로세스를 종료할수 있다.

pm2 stop [App name] // pm2 list 로 확인한 appname 이름을 써주면된다. pm2 kill // pm2 로 시작한 모든 프로세스를 죽인다


◎ pm2 로그확인

▼ 내용

pm2로 실행할경우 console에 아무것도 안찎혀 로그를 안남기는데

실시간으로 log를 보여주는 명령어다

pm2 log




반응형
반응형

middleware 란?

요청 url 의 response를 받기 전에

실행할 함수들? 그런걸

middleware 라고 한다.

java spring의 intecepter 와 똑같은 역할

◎ middleware 의 예제

▼ 내용

아래 소스 처럼 between hom 을 출력하는 함수를 하나 만들어주고

그걸 express의 라우팅 함수의 가운대 인자로 함수를 집어 넣고

함수의 next() 를 넣어주면 handlehome 의 요청 함수로 가기전에

betweenhome 을 실행 시킬수 있다.

이걸로 로그인정보, 파일다운로드 등등 중간에 인터셉터해서 사용할수있다.

안에 middleware는 많은 갯수제한없이 많이 넣을수 있다.

middleware 의 함수에 next() 를 넣어줘야 다음함수로 진행이된다 안넣으면 에러.

만약 middleware 에 next() 를 안넣고 res.send로 다른걸 받아서 연결을 끊을 수도 있다.

const app = express(); const betweenHome = (req,res,next) => { console.log("between hom") next(); }; const handlehome = (req,res) => res.send("Hello From Home"); } app.get('/',betweenHome,handlehome); //요청 url / 에 들어갈떄마다 betweenhome 함수가 실행된다 .

◎ middleware 의 또다른 예제

▼ 내용

middleware 는 app.get 또는 app.post의 인자로 넣어줄수도 있지만

app.use 로 .use 라는 메소드를 통해 모든 요청 url에 대하여 설정해줄수도 있습니다.

라우팅 메소드 전에 써줘야 그 라우팅에 대헤서만 작동하고

app.use 이전에 쓴 라우팅 메소드들에 대헤선 동작하지 않는다

app.get('/profile',handleProfile); app.use(betweenHome); app.get('/',handlehome); // 이럴 경우 /profile 로 들어온건 app.use 가 동작하지 않는다


◎ middleware 의 라이브러리1 (morgan)

▼ 내용

morgan 은 logging 할때 유용한 패키지 이다.

application 에서 발생하는 모든일을 logging (콘솔출력) 해준다

npm install morgan

설치후 사용방법은 app.use(morgan("")); 다

import morgan from "morgan"; app.use(morgan("tiny"))

morgan 의 인자로는 combined , common , dev , short , tiny 를 사용할수 있다.​

tiny : 접속종류(get/post) , http상태코드 , 로딩시간 을 알 수 있다. (ex GET /profile 304 - - 0.397 ms)

combined : 접속종류(get/post) , 브라우저 종류 , 접속날짜 등등

common : 접속날짜 , 접속종류 , 상태코드 등

dev : 상태코드 , 접속종류 , 로딩시간 등

short : 상태코드 접속종류 로딩시간 등





◎ middleware 의 라이브러리2 (helmet)

▼ 내용

node.js 앱의 보안에 도움이되는 라이브러리. 앱을 안전하게 해준다

nosniff , nocache , ieNoOpen , xssFilter 등등 을 지원해준다

설치법

npm install helmet

사용법

import helmet from "helmet"; app.use(helmet());

​기본적으로 해놓는것이 좋다.


◎ middleware 의 라이브러리3 (cookie parser)

▼ 내용

cookie 를 전달받아서 사용할 수 있도록 만들어주는 미들웨어

사용자 인증 같은 곳에서 쿠키를 검사할때 사용

설치법

npm install cookie-parser

사용법

import cookieParser from "cookie-parser";

​기본적으로 해놓는것이 좋다.


◎ middleware 의 라이브러리4 (body parser)

▼ 내용

사용자가 웹사이트로 전달하는 정보들을 검사하는 미들웨어 request 에서 form 이나 json 형태로 된 정보를 접근하는 미들웨어 cookie-parser 와 같이 작동해서 세션에 정보를 담을수 있다.

설치법

npm install body-parser

사용법

import bodyParser from "body-parser"; app.use(bodyParser.json()); 또는 app.use(bodyParser.urlencoded({extended:true})); //중첩객체허용 app.post('/create_process',(request,response) => { console.log(request.body); } //{ title: 'abcd', description: 'efgh' }

위처럼 app.use 를 설정하면 get,post로 들어온 request의 값들을 body 프로퍼티를 추가해 위처럼자동으로 객체화 시켜준다. 사용할땐 request.body를 쓰면된다.

▼ [extended 옵션]

extended 는 중첩된 객체표현을 허용할지 말지를 정하는 것이다. 객체 안에 객체를 파싱할 수 있게하려면 true. 내부적으로 true 를 하면 qs 모듈을 사용하고, false 면 query-string 모듈을 사용한다. 이 두 모듈간의 차이에서 중첩객체 파싱여부가 갈린다. querystring.parse는 object를 상속받지 않는다. 따라서 toString()와 hasOwnProperty() 등이 사용불가능해진다

express 자체에도 있어서 구지 설치할 필요는 없다. 아래는 express의 body parser 사용하는 방법

app.use (express.urlencoded ({extended : true})); app.use (express.json ());

◎ express 의 url 추가맵핑

▼ 내용

app.use로 중간에 인터셉터해서 함수를 실행할수 있다고 말했다.

이걸 이용해서 abc/index , abc/abcd , abc/correction 이렇게

url 앞에 맵핑하는법을 설명하겠다.

router.js

import express from "express"; export const userRouter = express.Router(); userRouter.get("/",(req,res) => res.send('user index')); userRouter.get("/edit",(req,res) => res.send('user edit')); userRouter.get("/password",(req,res) => res.send('user password'));

app.js

import { userRouter } from "./router"; app.use('/user',userRouter);

이렇게 import,export 로 모듈화시켜서 app.use 에 모듈을 집어 넣으면

모듈에 정의된 함수가 /user/* 이렇게 정의된대로 url 맵핑이 된다.

추가로 URL의 :URL 이렇게 적으면 :URL 은 변수 URL 로 인식한다 (express 에서)


◎ 뷰템플릿 글로벌변수

▼ 내용

app.use를 활용하여 .pug에 변수를 사용할수 있다.

즉 app.use에 할당된 함수의 지역변수를 뷰템플릿 어디서나 사용할수있도록 하기 위함이다.

설명은 너무기니 소스를 참고하면 된다

app.js

import { localsMiddleware } from "./middlewares"; app.use(localsMiddleware);

middlewares.js

export const localsMiddleware = (req,res,next) => { res.locals.siteName = "WeTube"; res.locals.routes.login = "/login"; next(); }

footer.pug

a(href=routes.login) Login span.footer__text #{siteName}

이렇게 middlewares.js의 req,res,next 를 받아서 함수로 작성하고

(함수안에 마지막엔 next(); 를 꼮써야 한다.

res.locals 는 express에서 지원해주는객체로 rex.locals.xxx <-- 여기에 변수명을 준다.

그리고 그 변수를 export 해준다음 app.js 에 import 해서

app.use(함수명) 을 써주면 어느곳에서나 #{변수명} 을 적어주면 된다.

태그의 속성 () 안에 있는 경우엔 =변수명 이렇게 쓰면된다



반응형
반응형

문서를 자바스크립트로 제어하려면 제어의 대상에 해당되는 객체를 찾는 것이 제일 먼저 할 일이다. 문서내에서 객체를 찾는 방법은 document 객체의 메소드를 이용한다.

1.html 태그로 선택하는 방법

상위요소에서 하위요소 선택방법

document.getElementsByTagName('태그')

태그들을 유사배열로 만들어 준다

<!DOCTYPE html> <html> <head> </head> <body> <ul> <li>HTML</li> <li>CSS</li> <li>JavaScript</li> </ul> <ul> <li>HTML</li> <li>CSS</li> <li>JavaScript</li> </ul> <ol> <li>HTML</li> <li>CSS</li> <li>JAVASCRIPT</li> </ol> <ol> <li>HTML</li> <li>CSS</li> <li>JAVASCRIPT</li> </ol> </body> <script> // document.getElementsByTagName('xx') 하면 xx들을 유사배열로 만들어준다 var ul = document.getElementsByTagName('ol')[0]; //document 를 이용하여 ol요소들중[0]을 객체에 저장한다 var lis = ul.getElementsByTagName('li'); //ul[0]의 요소들 중의 li 를 갖고있는 요소들의 집합 for(var i=0; i <lis.length-1; i++){ lis[i].style.color='red'; } </script> </html>

2.class Name으로 선택하는 방법

document.getElementsByClassName('클래스명')

클래스명들을 유사배열로 만들어 준다

<!DOCTYPE html> <html> <head> </head> <body> <ul> <li>HTML</li> <li>CSS</li> <li>JavaScript</li> </ul> <ul> <li>HTML</li> <li class="active">CSS</li> <li class="active">JavaScript</li> </ul> <ol> <li>HTML</li> <li class="active">CSS</li> <li class="active">JAVASCRIPT</li> </ol> <ol> <li>HTML</li> <li>CSS</li> <li>JAVASCRIPT</li> </ol> </body> <script> var ul = document.getElementsByTagName('ol')[0]; var lis = ul.getElementsByTagName('li'); for(var i=0; i <lis.length-1; i++){ lis[i].style.color='red'; } var lis2 = document.getElementsByClassName('active'); //active 란 이름을가진 클래스이름들을 유사배열로 만든다 lis2[0].style.color = 'blue'; //유사배열들중 0번째 .style의.color을 blue로 바꿔준다 lis2[1].style.color = 'blue'; lis2[2].style.color = 'blue'; lis2[3].style.color = 'blue'; </script> </html>

3. ID 로 선택하는 방법

가장 많이 쓰이고 가장 우수한 성능을 자랑한다.

이걸 사용할수있다면 가급적 이걸로 사용하는게 좋다

ID는 문서의 유일한 값으로 표시되기 때문에

getElements 가아닌 getElement 를 사용한다 (유사배열이 아닌 1개만 선택된다)

document.getElementById('아이디')

<!DOCTYPE html> <html> <head> </head> <body> <ul> <li id="act">HTML</li> <li>CSS</li> <li>JavaScript</li> </ul> </body> <script> var li = document.getElementById('act'); //act 란 이름을가진 ID를 선택한다 li.style.color='red'; </script> </html>

4. CSS 선택자의 문법으로 선택하는 방법

1. document.querySelector('.sa') : 클래스의 이름이 sa 엘리먼트중 맨 첫번째 만을 찾는다

2. document.querySelectorAll('li') : li 태그 요소들을 전부 유사배열로 만든다

' ' 안에 이름을 넣을때

. 을 넣어서 쓰면 className을 찾고

#을 넣을경운 id 값을 찾고

그냥 넣엇을 경우엔 태그를 찾는다

<!DOCTYPE html> <html> <head> </head> <body> <ol> <li id="act">HTML</li> <li>CSS</li> <li>JavaScript</li> </ol> <ul> <li id="act">HTML</li> <li>CSS</li> <li>JavaScript</li> </ul> </body> <script> var ul = document.querySelector('li'); //li 엘리먼트중 맨위에 첫번째 객체만을 담는다 ul.style.color='red'; var ol = document.querySelectorAll('ol'); //ol 엘리먼트들을 유사배열로 만든다 ol[0].style.color='blue'; </script> </html>



반응형

'프로그래밍 > JavaScript' 카테고리의 다른 글

자바스크립트 공부내용 정리  (0) 2019.02.27
자바스크립트 공부내용정리(2)  (0) 2019.02.27
JavaScript - .map , ELEMENT  (0) 2019.02.27
JavaScript - NODE 객체  (0) 2019.02.27
javascript - let,var,const 차이  (0) 2019.02.27

+ Recent posts