본문 바로가기

개발자의 logs

nodejs 카카오톡 oauth2 소셜로그인 소스코드 (최신) 본문

개발 공부지식/*개발 공부*

nodejs 카카오톡 oauth2 소셜로그인 소스코드 (최신)

주인장v 2022. 7. 5. 10:49
// 프론트에게서 인가코드를 받는다 post_1
// 서버에서 인가코드를 가지고 카톡에게서 토큰을 받는다.
// 토큰을 클라이언트에게 보낸다.
// 클라이언트가 토큰을 바디에 담아서 다시 post 요청을 한다. post_2
// 백엔드에서 토큰을 가지고 다시 카톡에게 정보를 요청한다.
// 정보를 클라이언트에게 보낸다.
// 클라이언트가 받고 데이터를 파싱해서 다시 보낸다.post_3  // 데이터 파싱문제!!
// 백엔드가 받아서 DB에 저장한다.

const dotenv = require('dotenv');
dotenv.config();
var axios = require('axios');
var request = require('request');

var socialUser = require('../schemas/social_user');
var express = require('express');
var app = express();
var router = express.Router();
var client_id = process.env.YOUR_CLIENT_ID;
var client_secret = process.env.YOUR_CLIENT_SECRET;
var state = 'teamnote';
var redirectURI = encodeURI('이 부분은 본인이 요청하는 redirect url로');
var request = require('request');
router.post('/naver', function (req, res) {
  var code = req.body.code;
  console.log('code:', code);
  var state = 'teamnote';
  console.log('state:', state);
  api_url =
    'https://nid.naver.com/oauth2.0/token?grant_type=authorization_code&client_id=' +
    client_id +
    '&client_secret=' +
    client_secret +
    '&code=' +
    code +
    '&state=' +
    state;
  var options = {
    url: api_url,
    headers: {
      'X-Naver-Client-Id': client_id,
      'X-Naver-Client-Secret': client_secret,
    },
  };
  request.get(options, function (error, response, body) {
    if (!error && response.statusCode == 200) {
      res.writeHead(200, { 'Content-Type': 'text/json;charset=utf-8' });
      res.end(body);
      console.log('res:', res);
    } else {
      res.status(response.statusCode).end();
      console.log('error = ' + response.statusCode);
    }
  });
});

router.post('/member', function (req, res) {
  var api_url = 'https://openapi.naver.com/v1/nid/me';
  var request = require('request');
  var token = req.body.token;
  var header = 'Bearer ' + token; // Bearer 다음에 공백 추가
  var options = {
    url: api_url,
    headers: { Authorization: header },
  };
  request.get(options, function (error, response, body) {
    if (!error && response.statusCode == 200) {
      res.writeHead(200, { 'Content-Type': 'text/json;charset=utf-8' });
      res.end(body);
    } else {
      console.log('error');
      if (response != null) {
        res.status(response.statusCode).end();
        console.log('error = ' + response.statusCode);
      }
    }
  });
});

router.post('/parsing', async function (req, res) {
  const user_info = req.body;
  // console.log(user_info);
  // console.log(user_info.user_name);
  const userid = user_info.user_id;
  const email = user_info.user_email;
  const nickname = user_info.user_name;

  const double = await socialUser.find({ email });

  if (!double) {
    const social = new socialUser({ userid, email, nickname });
    social.save();
    res.send('저장에 성공하였습니다.');
  } else {
    res.send('이미 있는 유저입니다.');
  }

  // 예외조건넣기. 유저가 디비에 있으면 저장하지않기.
});

module.exports = router;
Comments