nodejs+express+passport-gitlab2를 사용하여 OAuth Application 만들기

소개



gitlab은 온프레로 독자적으로 구축하고 있습니다.
인증 만들기의 귀찮은. gitlab에서 좋다.
그래서 OpenID에서 인증 + OAuth로 허가도 할 수 있도록하자!

라고 프런트 엔드 초보자가 빠져들면서 실장한 기록입니다.

passport-gitlab2



이것입니다.
htps //w w. 음 pmjs. 코 m / 빠 c 가게 / 빠 s 포 rt-gi t b2

사전 준비



gitlab 측에서 연결 준비하십시오.
【Admin Area】→【Applications】에서 설정합니다.
  • 응용 프로그램 이름 입력
  • OAuth에서 콜백 URL 입력


  • 결과



    이렇게 된다.

    우선 의존 정보의 추가.

    required 추가
    var passport = require('passport');
    var session = require('express-session');
    var GitLabStrategy = require('passport-gitlab2').Strategy;
    

    그런 다음 세션 활성화를위한 정의 설명.

    session 관리를 위한 설정
    app.use(session({
      secret: "secret-key",
      resave: false,
      saveUninitialized: false,
      cookie: {
        httpOnly: false,
        secure: true,
        maxage: 1000 * 60 * 30
      }
    }));
    app.use(passport.initialize());
    app.use(passport.session());
    

    다음에, 인증하는 URL, 콜백 URL의 정의를 기재.

    인증을 위한 설정
    app.get('/', passport.authenticate('gitlab'));
    app.get('/auth/gitlab/callback',
      passport.authenticate('gitlab', {
        failureRedirect: '/error.html'
      }),
      function (req, res) {
        // Successful authentication, redirect home.
        res.redirect('/home');
      });
    

    그리고, gitlab로부터의 인증시의 반환 처리와, deserialize/serialize 처리를 정의.done
    passport 관련 정의
    //passport
    passport.use(new GitLabStrategy({
      clientID: process.env.GITLAB_APP_ID,
      clientSecret: process.env.GITLAB_APP_SECRET,
      callbackURL: process.env.GITLAB_CALLBACK,
      baseURL: process.env.GITLAB_URL
    },
      function (accessToken, refreshToken, profile, done) {
        if (profile) {
          user = profile;
          return done(null, { id: profile.id });
        }
        else {
          return done(null, false);
        }
      }
    ));
    passport.deserializeUser(function (id, done) {
      console.log('Deserialize user called.');
      return done(null, { "id": id });
    });
    passport.serializeUser(function (user, done) {
      console.log('Serialize user called.');
      return done(null, { id: user.id });
    });
    

    이후에는 각종 route에 대해 인증이 필수로 정의한다.

    ensureAuthenticated에서 패스 스루하도록 변경
    function ensureAuthenticated(req, res, next) {
      console.log("ensureAuthenticated");
      if (req.isAuthenticated())
        return next();
      else
        res.redirect('/');
    }
    
    router.get('/home', ensureAuthenticated, function (req, res, next) {
      res.send("OK");
    })
    

    빠진 곳



    User is not defined



    공식적으로 이렇게 쓰고 있기 때문에, 과연 과연. 좋아, 코피페다!
    passport.use(new GitLabStrategy({
        clientID: GITLAB_APP_ID,
        clientSecret: GITLAB_APP_SECRET,
        callbackURL: "http://localhost:3000/auth/gitlab/callback"
      },
      function(accessToken, refreshToken, profile, cb) {
        User.findOrCreate({gitlabId: profile.id}, function (err, user) {
          return cb(err, user);
        });
      }
    ));
    

    움직여 보면 User is not defined. 와 움직이지 않습니다.
    htps : // 기주 b. 코 m / 아 th0 / 팍 s 포 rt 우우 엔 w

    무한한 인증 리디렉션 루프 발생


    var session = require('express-session');
    ・・・
    app.use(passport.session());
    

    원래 session 사용하지 않으면 제대로 연계할 수 없어서 이야기.

    어라? 인증하지 않아도 움직인다…



    interceptor?적인 몬이 마음대로 해준다고 생각했지만, 해주지 않는다.
    스스로 제대로 패스마다 설정해 주지 않으면!
    ※통상은, router를 확장하는 것일까-.

    ensureAuthenticated에서 패스 스루하도록 변경
    //認証チェック
    function ensureAuthenticated(req, res, next) {
      console.log("ensureAuthenticated");
      if (req.isAuthenticated())
        return next();//認証チェックしてから、次を呼び出すよ。
      else
        res.redirect('/');
    }
    
    router.get('/home', ensureAuthenticated, function (req, res, next) {
      res.send("OK");
    })
    

    뭔가... 생각한 화면과 다르다



    OAuth는 그 구글과 같은 인증을 하고, "이 권한을 부여하지만 괜찮습니까?"화면이 나올 것인데, 나오지 않는다.
    그냥 로그인 화면이 나올 뿐. 멋지다.

    그렇지만, 뭐・・・이런 것일까라고 생각해 방치했습니다.

    원래 passport 알 필요가 있다.



    h tp // w w. 파스포 rtjs. 오 rg / 빠 c 게 s / 빠 s 포 rt-pm /
    이것 전제로 움직인다. passport-gitlab2 는이 OAuth 서비스 공급자 라이브러리입니다.
    그래서 원래 passport가 어떻게 움직이는지 알 필요가 있다.

    좋은 웹페이지 즐겨찾기