본문 바로가기

java script

[javascript] 네이버 로그인, 카카오 로그인, 구글 로그인 자바스트립트로 구현

 

<!doctype html>
<html lang="ko">
<head>
  <meta charset="utf-8">
  <title>로그인</title>
  <script type="text/javascript" src="https://static.nid.naver.com/js/naverLogin_implicit-1.0.3.js" charset="utf-8"></script>
  <script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
  <script src="https://accounts.google.com/gsi/client" async defer></script>
  <script src="https://developers.kakao.com/sdk/js/kakao.js"></script>
</head>
<body>
  <!-- 카카오 로그인 버튼 노출 영역 -->
  <div id="kakao-login-btn">
    <img src="https://k.kakaocdn.net/14/dn/btroDszwNrM/I6efHub1SN5KCJqLm1Ovx1/o.jpg" width="222" alt="카카오 로그인 버튼" onclick="loginWithKakao()" />
  </div>
  <button id="logout-btn" onclick="kakaoLogout()" style="display:none;">로그아웃</button>

<script>
    // 카카오 SDK 초기화
    Kakao.init('카카오 JavaScript 키');

    function loginWithKakao() {
        Kakao.Auth.authorize({
            redirectUri: '리디렉션 uri',
            scope: 'account_email'
        });
    }

    function kakaoLogout() {
        if (!Kakao.Auth.getAccessToken()) {
            console.log('Not logged in.');
            return;
        }
        Kakao.Auth.logout(function(response) {
            if(response) {
                Kakao.Auth.setAccessToken(undefined);
                alert("로그아웃되었습니다.");
                document.getElementById('kakao-login-btn').style.display = 'block';
                document.getElementById('logout-btn').style.display = 'none';

                // 세션 스토리지에서 토큰 및 이메일 삭제
                sessionStorage.removeItem('kakao_token');
                sessionStorage.removeItem('kakao_email');
            } else {
                alert("잘못된 정보입니다. 관리자에 문의해 주시기 바랍니다.");
            }
        });
    }

    window.onload = function() {
        // 세션 스토리지에서 이메일 및 토큰 정보 가져오기
        var kakao_email = sessionStorage.getItem('kakao_email');
        console.log("Stored Kakao email:", kakao_email); // 이메일 확인 로그 추가

        if (kakao_email) {
            document.getElementById('kakao-login-btn').style.display = 'none';
            document.getElementById('logout-btn').style.display = 'block';
        }
    };
</script>

    
  <!-- 네이버 로그인 버튼 노출 영역 -->
  <div id="naver_id_login"></div>

  <!-- 로그아웃 버튼 영역 -->
  <div id="naver_id_logout" style="display: none;">
    <button onclick="Logout()">로그아웃</button>
  </div>

  <!-- //네이버 로그인 버튼 노출 영역 -->
  <script type="text/javascript">
  	var naver_id_login = new naver_id_login("네이버 키", "리디렉션 uri");
  	var state = naver_id_login.getUniqState();
  	naver_id_login.setButton("white", 2,40);
  	naver_id_login.setDomain("도메인 주소");
  	naver_id_login.setState(state);
  	naver_id_login.init_naver_id_login();

      function Logout() {
        sessionStorage.removeItem("naver_email");
        alert("로그아웃되었습니다.");
        document.getElementById('naver_id_login').style.display = 'block';
        document.getElementById('naver_id_logout').style.display = 'none';
        // 네이버 로그아웃
        naver_id_login.logout();
      }

      // 페이지 로드 시 세션 확인하여 로그인 상태 반영
      window.onload = function() {
        var naver_email = sessionStorage.getItem("naver_email");
        if (naver_email) {
          document.getElementById('naver_id_login').style.display = 'none';
          document.getElementById('naver_id_logout').style.display = 'block';
        }
      };
  </script>

  <!-- 구글 로그인 버튼 노출 영역 -->
  <div id="g_id_onload" data-client_id="클라이언트 아이디"
    data-login_uri="리디렉션 uri" data-auto_prompt="false">
  </div>
  <div class="g_id_signin" data-type="standard" data-size="large"
    data-theme="outline" data-text="sign_in_with" data-shape="rectangular" data-logo_alignment="left">
  </div>
  <div id="signout_button" style="display: none;">
    <button onclick="signOut()">Sign Out</button>
  </div>
  
  <script>
   window.onload = function() {
      var userId = sessionStorage.getItem("google_user_id");
      if (userId) {
        document.getElementById("g_id_signin").style.display = 'none';
        document.getElementById("signout_button").style.display = 'block';
      }
    };

    function signOut() {
      sessionStorage.removeItem("google_user_id");
      alert("로그아웃되었습니다.");
      document.getElementById("g_id_signin").style.display = 'block';
      document.getElementById("signout_button").style.display = 'none';
    }
  </script>
</body>
</html>

 

<!doctype html>
<html lang="ko">
<head>
<script src="https://accounts.google.com/gsi/client" async defer></script>
</head>
<body>
<script>
    function handleCredentialResponse(response) {
        console.log("Encoded JWT ID token: " + response.credential);

        // JWT 토큰을 '.' 기준으로 세 부분(헤더, 페이로드, 서명)으로 분리
        var parts = response.credential.split('.');
        
        // 페이로드 부분 디코딩
        var payload = JSON.parse(atob(parts[1]));

        // 페이로드 내용 출력, payload.sub 사용자 id 출력
        console.log("Decoded JWT payload:", payload);
        console.log("User ID:", payload.sub);
        
        // 사용자 ID를 세션 스토리지에 저장
        sessionStorage.setItem("google_user_id", payload.sub);

        // 메인 페이지로 리다이렉트
        window.location.href = "https://dev.colpopspace.com";
    }

    window.onload = function () {
        google.accounts.id.initialize({
            client_id: "클라이언트 id",
            callback: handleCredentialResponse
        });

        google.accounts.id.renderButton(
            document.getElementById("buttonDiv"),
            { theme: "outline", size: "large" }
        );

        google.accounts.id.prompt(); // One Tap 다이얼로그 표시
    }

</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Kakao Redirect</title>
    <script src="https://developers.kakao.com/sdk/js/kakao.js"></script>
</head>
<body>
    <script>
        // 카카오 SDK 초기화
        Kakao.init('카카오 JavaScript 키');

        window.onload = function() {
            var code = new URL(window.location.href).searchParams.get('code');
            if (code) {
                getAccessToken(code)
                    .then(data => {
                        if (data.access_token) {
                            Kakao.Auth.setAccessToken(data.access_token); // 액세스 토큰 설정
                            return getUserInfo();
                        } else {
                            throw new Error('Failed to obtain access token');
                        }
                    })
                    .then(response => {
                        const kakao_email = response.kakao_account.email;
                        if (kakao_email) {
                            // 세션 스토리지에 이메일 및 토큰 정보 저장
                            sessionStorage.setItem('kakao_token', Kakao.Auth.getAccessToken());
                            sessionStorage.setItem('kakao_email', kakao_email);
                            
                            // 메인 페이지로 리디렉션
                            window.location.href = '리디렉션 할 uri';
                        } else {
                            document.body.innerText = 'Email not available';
                        }
                    })
                    .catch(error => {
                        console.error(error);
                        document.body.innerText = 'Login failed';
                    });
            } else {
                document.body.innerText = 'Authorization code not found.';
            }
        };

        function getAccessToken(code) {
            return fetch(`https://kauth.kakao.com/oauth/token`, {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded'
                },
                body: new URLSearchParams({
                    grant_type: 'authorization_code',
                    client_id: '클라이언트 id',
                    redirect_uri: '리디렉션 uri',
                    code: code
                })
            }).then(response => response.json());
        }

        function getUserInfo() {
            return Kakao.API.request({
                url: '/v2/user/me'
            });
        }
    </script>
</body>
</html>​
<!doctype html>
<html lang="ko">
<head>
    <script src="https://code.jquery.com/jquery-latest.min.js"></script>
    <script type="text/javascript" src="https://static.nid.naver.com/js/naverLogin_implicit-1.0.3.js" charset="utf-8"></script>
</head>
<body>
<script type="text/javascript">
        var naver_id_login = new naver_id_login("클라이언트 id", "리디렉션 uri");
        // 접근 토큰 값 출력
        alert(naver_id_login.oauthParams.access_token);
        // 네이버 사용자 프로필 조회
        naver_id_login.get_naver_userprofile("naverSignInCallback()");

        // 네이버 사용자 프로필 조회 이후 프로필 정보를 처리할 callback function
        function naverSignInCallback() {
            var email = naver_id_login.getProfileData('email');
            alert(email);
            sessionStorage.setItem("naver_email", email);
            // 로그인 후 메인 페이지로 리디렉션
            window.location.href = "메인 페이지 uri";
        }

</script>
</body>
</html>

네이버 로그인 api사용을 위해서는 jquery를 import 해줘야 함.

 

로그인 -> code 발급 -> token 발급 -> token으로 유저정보 받아오기 -> sessionStorage에 저장 -> 로그아웃시 sessionStorage 삭제