Passport 인증과 함께 JWT를 사용하는 방법 알아보기



소개



오늘날 거의 모든 웹 및 모바일 앱에는 인증 기능이 있습니다. 대부분은 Facebook, Google 또는 이메일/비밀번호와 같은 다양한 로그인 방법을 한 번에 제공합니다.

Passport은 구현하기 쉬운 다양한 요청 인증 전략을 제공하는 Node.js 미들웨어입니다. 기본적으로 세션에 사용자 개체를 저장합니다.

JSON Web Tokens은 서버의 세션에 사용자를 저장하고 쿠키를 생성하는 대신 로그인한 사용자를 식별하는 데 도움이 되는 요청에서 암호화된 토큰을 할당하고 전달하는 방식으로 작동하는 인증 표준입니다. Node.js module을 포함하여 다양한 통합이 있습니다.

다음은 이 두 모듈을 함께 사용하고 익스프레스 기반 백엔드에서 인증을 설정하는 방법에 대한 자습서입니다. 다행스럽게도 Passport는 세션 대신 요청에 사용자 개체를 저장하는 옵션을 허용합니다.

이 자습서에서는 간단한 로컬(이메일/비밀번호) 인증을 사용하지만 다른 전략과 함께 사용할 수도 있습니다.

먼저 종속성을 설치하겠습니다.

npm install --save passport passport-local passport-jwt jsonwebtoken


이제 모든 것이 작동하는 방식은 다음과 같습니다.
  • 사용자가 로그인하면 백엔드에서 서명된 토큰을 생성하고 응답으로 반환합니다
  • .
  • 클라이언트가 토큰을 로컬(일반적으로 localStorage)에 저장하고 인증이 필요한 모든 후속 요청에서 다시 보냅니다
  • .
  • 인증이 필요한 모든 요청은 제공된 토큰을 확인하고 토큰이 확인된 경우에만 요청을 허용하는 미들웨어를 통과합니다
  • .

    이제 이 로직을 구현해 보겠습니다.

    로그인



    다음과 같이 app.js 옆에 있는 별도의 파일에서 로컬 패스포트 전략을 설정하고 사용했다고 가정합니다.

    //passport.js
    
    const passport = require('passport');
    const LocalStrategy = require('passport-local').Strategy;
    
    passport.use(new LocalStrategy({
            usernameField: 'email',
            passwordField: 'password'
        }, 
        function (email, password, cb) {
    
    //this one is typically a DB call. Assume that the returned user object is pre-formatted and ready for storing in JWT
    
    return UserModel.findOne({email, password})
               .then(user => {
                   if (!user) {
                       return cb(null, false, {message: 'Incorrect email or password.'});
                   }
    
    return cb(null, user, {message: 'Logged In Successfully'});
              })
              .catch(err => cb(err));
        }
    ));
    


    app.js에서 이 파일을 요구해야 합니다.

    //app.js
    
    const express = require('express');
    ...
    require('./passport');
    
    const app = express();
    ...
    const auth = require('./routes/auth');
    app.use('/auth', auth);
    


    이제 auth.js 경로 파일에서 로그인 작업을 구현합니다. 여기에서 로컬 전략으로 여권 인증 기능을 호출하고 오류를 처리하고 사용자를 로그인합니다.

    //routes/auth.js
    
    const express = require('express');
    const router = express.Router();
    const jwt = require('jsonwebtoken');
    const passport = require("passport”);
    
    /* POST login. */
    router.post('/login', function (req, res, next) {
    
    passport.authenticate('local', {session: false}, (err, user, info) => {
            if (err || !user) {
                return res.status(400).json({
                    message: 'Something is not right',
                    user : user
                });
            }
    
    req.login(user, {session: false}, (err) => {
               if (err) {
                   res.send(err);
               }
    
    // generate a signed son web token with the contents of user object and return it in the response
    
    const token = jwt.sign(user, 'your_jwt_secret');
               return res.json({user, token});
            });
        })(req, res);
    });
    


    세션에서 사용자를 저장하지 않도록 {session: false}를 패스포트 옵션에 전달합니다. 또한 사용자 개체를 기반으로 서명된 JSON 웹 토큰을 만들어 클라이언트에 반환합니다. 물론 사용자를 식별하는 데 도움이 되는 한 토큰을 만드는 데 사용할 개체를 선택할 수 있습니다. 아이디어는 인증된 모든 요청에서 데이터베이스에서 사용자를 검색하지 않고도 사용할 수 있는 최소한의 정보를 저장하는 것입니다.

    보호된 요청



    이제 인증이 필요한 일부 특수 경로에 액세스하기 위해 유효한 토큰이 있는 요청만 허용하는 미들웨어를 만듭니다./유저 프로필. 이를 위해 passport-jwt 전략을 사용합니다. passport.js 파일에 추가하겠습니다.

    //passport.js
    
    ...
    const passportJWT = require("passport-jwt");
    const JWTStrategy = passportJWT.Strategy;
    const ExtractJWT = passportJWT.ExtractJwt;
    ...
    
    passport.use(new JWTStrategy({
            jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken(),
            secretOrKey : 'your_jwt_secret'
        },
        function (jwtPayload, cb) {
    
            //find the user in db if needed. This functionality may be omitted if you store everything you'll need in JWT payload.
            return UserModel.findOneById(jwtPayload.id)
                .then(user => {
                    return cb(null, user);
                })
                .catch(err => {
                    return cb(err);
                });
        }
    ));
    


    클라이언트가 Authorization Header의 JWT 토큰을 전달자 토큰으로 보낸다고 가정합니다. 요청에서 토큰을 가져오는 Passport JWT 전략supports many other ways. 필요에 맞는 것을 선택하세요.

    이제 우리가 해야 할 일은 보호된 경로를 위해 앱에서 이 미들웨어를 사용하는 것입니다. 이 가이드에서는 다음과 같은 간단한 사용자 경로를 준비합니다.

    //routes/user.js
    
    const express = require('express');
    const router = express.Router();
    
    /* GET users listing. */
    router.get('/', function(req, res, next) {
      res.send('respond with a resource');
    });
    
    /* GET user profile. */
    router.get('/profile', function(req, res, next) {
        res.send(req.user);
    });
    
    module.exports = router;
    


    그리고 아래와 같이 사용자 경로에서 여권 인증 미들웨어를 사용합니다.

    //app.js
    
    const express = require('express');
    ...
    require('./passport');
    
    const app = express();
    ...
    const auth = require('./routes/auth');
    const user = require('./routes/user');
    
    app.use('/auth', auth);
    app.use('/user', passport.authenticate('jwt', {session: false}), user);
    


    그리고 그게 다야!

    계속해서 몇 가지 요청을 시도하면 이제 Passport로 JSON 웹 토큰 승인이 지원됩니다 👍

    좋은 웹페이지 즐겨찾기