본문 바로가기
웹 개발/Nodejs

[Nodejs] 카카오톡 로그인

by MiewONE 2021. 9. 12.

카카오 Dev Doc 참조

소개 :

카카오 로그인은 카카오계정과 애플리케이션(이하 앱)을 연결하고 토큰을 발급받아카카오 API를 사용할 수 있도록 하는 기능입니다.
토큰은 사용자를 인증하고 카카오 API 호출 권한을 부여하는 액세스 토큰(Access Token)와 액세스 토큰을 갱신하는 데 쓰는 리프레시 토큰(Refresh Token)이 있습니다

NAME 설명 Kakao API
로그인 카카오계정 정보로 사용자를 인증하고 API 호출 권한을 얻습니다. O
연결 카카오계정과 앱을 연결, 사용자가 해당 앱에서 카카오 API를 사용할 수 있게 합니다. O
가입 카카오계정 정보로 로그인한 사용자를 서비스 데이터베이스(DB)에 회원으로 등록합니다. X
서비스 자체 구현    
로그아웃 로그아웃 요청한 사용자의 토큰을 만료시킵니다. O
연결 끊기 카카오계정과 서비스 사이의 연결을 해제합니다. O
탈퇴 회원 정보를 삭제하고 서비스를 더 이상 이용하지 않습니다. X
서비스 자체 구현    
토큰 API 호출 권한을 증명하며, 로그인을 통해 발급받습니다. O

로그인 과정

토큰 종류 권한 유효기간
AccessToken 사용자를 인증 REST API : 6 시간
RefreshToken 일정 기간 동안 다시 인증 절차를 거치지 않고도 액세스 토큰 발급을 받을수 있게 해줍니다. 2달
유효기간 1달 남은 시점부터 갱신 가능    

로그인 과정

Node.js 의 미들웨어인 passport, passport-kakao를 이용하였습니다.

const passport = require("passport");
const kakaoStrategy = require("passport-kakao").Strategy;

passport.use(
    "kakao",
    new kakaoStrategy(
        {
            clientID: process.env.kakaoKey,
            callbackURL: "/oauth/kakao/callbak",
        },
        (accessToken, refreshToken, profile, done) => {
            /** @type {User}*/
            const User = {
                name: profile.username,
                provider: profile.provider,
                providerId: profile.id,
                email: profile._json.kakao_account.email,
                team: [],
            };
            return done(null, User);
        },
    ),
);

router.get("/kakao", check.isLogined, passport.authenticate("kakao"));    

router.get(
    "/kakao/callbak",
    passport.authenticate("kakao", {
        failureRedirect: "/error",
    }),
    async (req, res) => {
        console.log(">>> kakaoLogin");
        /** @type User*/
        const User = req.user;
        const loginCollection = await db_module.userDbCollection();

        /** @type User*/
        const loginUser = await loginCollection.findOne({
            email: User.email,
        });
        if (!loginUser) {
            await loginCollection.insertOne(User);
        }
        req.user.connectTime = Date();
        const token = await jwt.sign(User.email);
        req.user.token = token;
        // res.json({ success: true, msg: req.user });
        res.redirect("http://localhost:3000");
    },
);