타사 인증을 mysql 로 구현해보자.

facebook 타사인증을 사용해볼 것이다.

일단 이제 사용자의 정보는 mysql에서 가져오기 때문에 코드에 사용자의 정보를 적어둔 users 배열은 지워버린다.

// mysql 을 사용하면서 users 배열을 필요가 없어졌다.

// var users = [
//   {
//     authId:'local:egoing',
//     username:'egoing',
//     password:'mTi+/qIi9s5ZFRPDxJLY8yAhlLnWTgYZNXfXlQ32e1u/hZePhlq41NkRfffEV+T92TGTlfxEitFZ98QhzofzFHLneWMWiEekxHD1qMrTH1CWY01NbngaAfgfveJPRivhLxLD1iJajwGmYAXhr69VrN2CWkVD+aS1wKbZd94bcaE=',
//     salt:'O0iC9xqMBUVl3BdO50+JWkpvVcA5g2VNaYTR5Hc45g+/iXy4PzcCI7GJN5h5r3aLxIhgMN8HSh0DhyqwAp8lLw==',
//     displayName:'Egoing'
//   }
// ];

facebook 타사인증을 위해서, require 해준다.

//facebook 으로 타사인증
var FacebookStrategy = require('passport-facebook').Strategy;

로그인을 할 때, facebook 버튼을 누르면, facebook 으로 들어가는 app.get 라우터와 facebook 에서 정보를 받아오는 app.get . 두 개의 get 라우터를 준비한다.

// 페이스북으로 가능 app.get
app.get(
  '/auth/facebook',
  passport.authenticate(
    'facebook',
    {scope:'email'}
  )
);

// 페이스북에서 오는 app.get
app.get(
  '/auth/facebook/callback',
  passport.authenticate(
    'facebook',
    {
      successRedirect: '/welcome',
      failureRedirect: '/auth/login'
    }
  )
);

이제 페이스북 strategy 를 새롭게 저장하는 passport.use 를 작성한다.

// facebook 타사인증
passport.use(new FacebookStrategy({
    clientID: '1602353993419626',
    clientSecret: '232bc1d3aca2199e6a27eb983e602e0b',
    callbackURL: "/auth/facebook/callback",
    profileFields:['id', 'email', 'gender', 'link', 'locale', 'name', 'timezone', 'updated_time', 'verified', 'displayName']
  },
  function(accessToken, refreshToken, profile, done) {
    console.log(profile);
    var authId = 'facebook:'+profile.id;
    //sql 문 작성
    var sql = 'SELECT * FROM users WHERE authId=?';
    conn.query(sql, [authId],function(err,results){
      if(results.length > 0){
        //사용자가 존재했을 때
        done(null,results[0])
      }else{
        // 사용자가 없을 때, 새로운 사용자 객체를 만들어서 sql 문을 통해서 mysql 에 저장한다.
        var newuser = {
          'authId':authId,
          'displayName':profile.displayName,
          'email':profile.emails[0].value
        };
        var sql="INSERT INTO users SET ?"
        conn.query(sql,[],function(err,results){
          if(err){
						// err 가 있다면, 해당 코드를 탄다.
            console.log(error);
            done('Error');
          }else{
            // 새로운 사용자의 정보를 담고 있는 newuser를 두 번째 변수로 넣어서 보낸다.
            done(null,newuser);
          }
        });
      };
    });
  };
));

이렇게 코드를 작성하면, facebook 을 눌렀을 때, 해당 페이스북에 접속해서 페이스북 계정을 통해서 로그인을 하는 것이 가능해진다.