• JavaScript_Project 기록 일지_04. DB의 원하는 row에 값을 저장하기. (20.11.28.최종수정)

    2020. 11. 19.

    by. KAEY

    connect ECONNREFUSED 127.0.0.1:80

     

    가 지속적으로 발생하는데, 해결 방법을 모르겠다. 경로를 잘못 설정했을 때 출력되는 오류인데, 해결방법을 찾아야한다.

     

    오류가 발생하고 있는 코드. 

     2020.11.19 : 20:41 :: 아마 패치 뒤쪽의 경로나, 그 하단의 done(null, newUser) 문제 같은데..

     

    시도 1 >>

    더보기
    const passport = require('passport');
    const KakaoStrategy = require('passport-kakao').Strategy;
    const mysql = require('mysql');
    const User = require('../models/user');
    const prompt = require('prompt-sync')
    const axios = require('axios')
    
    module.exports = () => {
      passport.use(new KakaoStrategy({
        clientID: process.env.KAKAO_ID,
        callbackURL: '/auth/kakao/callback',
      }, async (accessToken, refreshToken, profile, done) => {
        console.log('kakao profile', profile);
        try {
          const exUser = await User.findOne({
            where: { snsId: profile.id, provider: 'kakao' },
          });
          if (exUser) {
            done(null, exUser);
          } else {                 
            const newUser = await axios.patch(`/auth/${exUser.email}`,{
              kakaonick: profile.displayName,
              snsId: profile.id,
              provider: 'kakao',  
            });             
            done(null, newUser);
          }
        } catch (error) { //DB 문제인 경우가 많다.
          console.error(error);
          done(error);
        }
      }));
    };
    

    시도 2>>

    더보기
    const passport = require('passport');
    const KakaoStrategy = require('passport-kakao').Strategy;
    const mysql = require('mysql');
    const User = require('../models/user');
    
    module.exports = () => {
      passport.use(new KakaoStrategy({
        clientID: process.env.KAKAO_ID,
        callbackURL: '/auth/kakao/callback',
      }, async (accessToken, refreshToken, profile, done) => {
        console.log('kakao profile', profile);
        try {
          const exUser = await User.findOne({
            where: { snsId: profile.id, provider: 'kakao' },
          });
          if (exUser) {
            done(null, exUser);
          } else {               
            const newUser = await User.update({
              kakaonick: profile.displayName,
              snsId: profile.id,
              provider: 'kakao', 
            }, {
              where: { id:'/user/:id' },
            });              
            done(null, newUser);
          }
        } catch (error) { //DB 문제인 경우가 많다.
          console.error(error);
          done(error);
        }
      }));
    };
    

     

    업데이트랑 패치를 쓰고 있는데, 경로설정을 어떻게 하는건지 햇갈린다.

     

    20201120 (금): 오전 1시 58분

    더보기
        console.log('kakao profile', profile);
        try {
          if(isLoggedIn){
            const newinfo = prompt(       
              kakaonick = profile.displayName,
              snsId = profile.id,
              provider = 'kakao',
              )
              if (!newinfo){
                return alert('실패패패');
              }try{ await axios.patch(`/auth/${auth.email}`, { nick: newinfo });
            }catch (err) {
                console.error(err);
              }
          }

    KakaoStrategy.js 에서 프로필을 받고, 확인한 후, 그 데이터를 기존의 로그인한 사람의 DB로 저장하기 위해 조건을 걸기로 했다. 하지만 prompt에서 오류가 나고 있다.

     

    20201120 (금): 오전 2시 34분

    const passport = require('passport');
    const KakaoStrategy = require('passport-kakao').Strategy;
    const axios = require('axios');
    const User = require('../models/user');
    const { isLoggedIn } = require('../routes/middlewares');
    
    module.exports = () => {
      passport.use(new KakaoStrategy({
        clientID: process.env.KAKAO_ID,
        callbackURL: '/auth/kakao/callback',
      }, async (accessToken, refreshToken, profile, done) => {
        //console.log('kakao profile', profile);
        const Nkakaonick = profile.displayName;
        const NsnsId = profile.id;
        const Nprovider = 'kakao';
        try {
          if(isLoggedIn){
            await axios.post('./auth', { kakaonick: Nkakaonick, snsId: NsnsId, provider: Nprovider });
          }
        } catch (error) {
          console.error(error);
          done(error);
        }
      }));
    };

    카카오 API 로그인을 통해 받아온 사용자 정보를 변수에 저장하여 axios.post를 통해 /auth의 post를 통해 user DB를 새롭게 등록하는 형식으로 DB에 저장하려 했으나, 오류가 발생한다.

     

    20201120 (금): 오전 4시 46분

    const passport = require('passport');
    const KakaoStrategy = require('passport-kakao').Strategy;
    const User = require('../models/user');
    const express = require('express');
    //const page = require('../routes/page');
    
    const router = express.Router();
    
    module.exports = () => {
      passport.use(new KakaoStrategy({
        clientID: process.env.KAKAO_ID,
        callbackURL: '/auth/kakao/callback',
      }, async (accessToken, refreshToken, profile, done) => {
       //console.log('kakao profile', profile);
       const user = await User.findOne({});
       const dbno = await user.id;
       const Nkakaonick = profile.displayName;
       const NsnsId = profile.id;
       const Nprovider = 'kakao';
       try {
         User.update({
           kakaonick: Nkakaonick,
           snsId: NsnsId, 
           provider: Nprovider,
         },{
           where : { id : dbno }
         })
       } catch (error) {
         console.error(error);
         done(error);
       }
      })
      );
    }
    
    

    where : 에서 내가 원하는 값이 제대로 들어가지 않고 있다. 이유는 모르겠따.

     

    2020.11.28 추가 

     

    경로와 세션에 저장된 데이터들을 좀 더 세밀하게 다뤄서 저장해야 한다.

    해당 프로젝트에서는 카카오 API의 원하는 기능을 사용하지 못하게 되어 kakao 저장과 관련한 코딩을 작성해놓지 않았지만, 관련한 알고리즘을 생각해본다.

     

     ▷ 시나리오 :: 전제조건 ) 카카오 보안 로그인 이용하는 경우만을 가정함.

      1) 사용자는 회원가입을 할 때 카카오 보안 로그인을 체크하여 그 체크한 값에 대한 특정한 변수(=Securitykakao)에 값을 준다. 이에 대한 값은 서버에서 유의미하게 구분할 수 있는 값이어야 한다.

      2) 사용자가 Securitykakao를 희망하는 경우 사용자에게 카카오 인증을 통해서 KAKAO SNS ID와 메시지 전송 (단순 인증 및 홍보)에 대한 동의를 해야합니다. 

      3) 서버는 회원이 로그인을 시도할 때, DB에 저장된 아이디와 비밀번호 Securitykakao 를 확인하여, Securitykakao값이on인 경우에 리다이렉트를 통해 사용자를 로그인 인증 페이지로 연결해줍니다.

      4) 사용자는 서버로부터 전달된 카카오 메시지에 포함된 URL을 클릭하여 URL 인증 페이지로 이동합니다.

      5) 서버는 사용자가 URL 인증 페이지를 성공적으로 시도한 경우, 그에 대한 인증 절차(토큰, JWT 등)를 통해 로그인을 성공 시킵니다. 

      6) 이때 인증 절차에는 특정한 시간이 지나는 경우 URL 파기, 토큰 만료 등의 조건을 걸어야 하며, Securitykakao가 체크 된 사용자는 반드시 인증 절차를 거쳐야만 로그인이 될 수 있도록 조건을 걸어야 합니다.

     

    댓글 (비로그인 댓글 허용하지 않습니다.)