본문 바로가기
개발노트

[MangoPicker] 크롬 익스텐션 구글 로그인 연동

by SoonNote 2023. 7. 28.
반응형

MangoPicker

https://chrome.google.com/webstore/detail/mangopicker-aeb-automatio/ajmhgecmlnjafdbheokocddnhapinlcn?hl=ko 

 

MangoPicker - 웹 매크로 & 크롤링

MangoPicker는 웹 자동화 서비스입니다. 반복 작업을 자동으로 처리하고, 원하는 정보를 손쉽게 추출하세요!

chrome.google.com

 

개발툴 : vscode

사용언어 : ts, js, html

 

manifest.json

{
  "manifest_version": 3,
  "name": "Your Extension Name",
  "version": "1.0",
  "description": "Your Extension Description",
  "permissions": ["tabs", "storage", "identity", "identity.email"],
  "oauth2": {
    "client_id": "YOUR_CLIENT_ID", // 자신의 클라이언트 ID로 변경
    "scopes": [
      "profile",
      "email"
    ]
  },
  "host_permissions": [
    "https://www.googleapis.com/*"
  ],
  "action": {
    "default_popup": "login.html"
  },
  "icons": {
    "48": "icon.png"
  }
}

oauth2 client_id값은 (https://console.developers.google.com/) 에서 크롬익스텐션의 ID값을 이용하여 가져올 수 있다.

 

 

login.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <script src="login.js"></script>
        <link rel="stylesheet" href="login-popup.css">
        <link rel="stylesheet" as="style" crossorigin href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.6/dist/web/static/pretendard.css" />
    </head>
    <body>
        <div class="login_main">
            <div class="logo_div">
                <div class="login_logo">
                
                    ------- 생략 -------
                    
                    <div class="find_idpw">
                        <span>비밀번호 찾기 | 회원가입</span>
                    </div>
                    <input type="button"  class="loginBtn" value="로그인">
                </div>
                <div class="part2">
                    <div class="line"></div>
                    <div class="or">or</div>
                    <div class="line"></div>
                </div>
                
                
                <button type="button" class="part3" id="GloginButton">
                    </svg>
                    <p>Sign in with Google</p>
                </button>
                
                <div class="part4">
                    <p>문의하기: soonNote</p>
                </div>
            </div>
        </div>
    </body>
</html>

위의 mainfest.json 설정

 "action": {
    "default_popup": "login.html"
  },

으로 익스텐션 실행 시 가장먼저 뜨게된다

 

 

login.ts

document.addEventListener('DOMContentLoaded', () => {
  const GloginButton = document.getElementById('GloginButton');
  if (GloginButton) {
    GloginButton.addEventListener('click', () => {
      chrome.runtime.sendMessage({ message: 'Glogin' }, (response) => {
        if (response.success) {
          alert(response.name+'('+response.email+')' + '님 안녕하세요!'); // 이메일 정보를 사용하여 사용자 이름 표시
        } else {
          alert('로그인 실패!');
        }
      });
    });
  } else {
    console.error('버튼을 찾지 못했습니다.');
  }
});

 

background.ts

chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
  // 2. A page requested user data, respond with a copy of `user`

  let response = null;

  switch (message.message) {
    case 'Glogin':
      response = GLoginService(message, sendResponse);
      return true;
  }
  if (response) {
    sendResponse(response);
  }
});



function GLoginService(message: any, sendResponse: any): void {
  chrome.identity.getAuthToken({ interactive: true }, (token) => {
    if (chrome.runtime.lastError) {
      console.error(chrome.runtime.lastError);
      sendResponse({ success: false }); // 실패를 응답으로 보내기
    } else {
      // 토큰을 이용하여 사용자 이메일 가져오기
      fetch('https://www.googleapis.com/oauth2/v2/userinfo', {
        headers: {
          'Authorization': 'Bearer ' + token
        }
      })
      .then(response => response.json())
      .then(data => {
        const userEmail = data.email;
        const userName = data.name; // 사용자의 이름 정보 가져오기
        console.log('사용자 이메일:', userEmail);
        console.log('사용자 이름:', userName);
        if (data.email) {
          const userData = {
            success: true,
            email: data.email, // 이메일을 이름으로 사용 (사용자 이름이 없는 경우에 대체)
            name: data.name
          };
          sendResponse(userData); // 사용자 정보를 응답으로 보내기
        } else {
          sendResponse({ success: false }); // 이메일이 없는 경우 실패를 응답으로 보내기
        }
      })
      .catch(error => {
        console.error('이메일 가져오기 실패:', error);
        sendResponse({ success: false }); // 실패를 응답으로 보내기
      });
    }
  });
}

 

 

1. 개발한 코드 크롬익스텐션에 등록

 - 개발자도구를 사용하여 압축해제된 확장프로그램 로드 클릭

 - 소스 등록

 

2. 등록 한 익스텐션 실행

3. sing in with google 클릭

 

절차에 따라 진행 하면 이름과 email 값을 가져온다.

 

프로그램 순서로는

1. login.html 의 sign in with Google 버튼 클릭

 

2. login.ts에 버튼이벤트가 작동하고

chrome.runtime.sendMessage({ message: 'Glogin' }, (response) => {

코드를 통해 background로 Glogin을 전송

 

3. background.ts에서

chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {

요청한 message 값을 받아

case 'Glogin':
      response = GLoginService(message, sendResponse);
      return true;

같은 background.ts 에 있는 GLoginService 함수실행

 

4.background.ts GLoginService 함수 실행

fetch('https://www.googleapis.com/oauth2/v2/userinfo', {

mainfest.json 에서 설정해두었던 oauth2 client_id 값을 사용하여 api를 fetch로 실행

 

5. fetch로 받아온 data를 userData 안에 담아 다시 login.ts쪽으로 보냄

.then(data => {
        const userEmail = data.email;
        const userName = data.name; // 사용자의 이름 정보 가져오기
        if (data.email) {
          const userData = {
            success: true,
            email: data.email || '이메일 값 없음', // 이메일을 이름으로 사용 (사용자 이름이 없는 경우에 대체)
            name: data.name || '이름 값 없음'
          };
          sendResponse(userData); // 사용자 정보를 응답으로 보내기
        } else {
          sendResponse({ success: false }); // 이메일이 없는 경우 실패를 응답으로 보내기
        }
      })

 

 

6. background.ts에서 보낸 값을 활용하여 alert

 if (response.success) {
          alert(response.name+'('+response.email+')' + '님 안녕하세요!'); // 이메일 정보를 사용하여 사용자 이름 표시
        } else {
          alert('로그인 실패!');
        }

 

 

 

화면에보여지는 로그인form은 현재 서비스중인 mangoPicker 웹 매크로&크롤링 이며

현재 로그인 기능은 없고 반영예정

https://chrome.google.com/webstore/detail/mangopicker-aeb-automatio/ajmhgecmlnjafdbheokocddnhapinlcn?hl=ko 

 

MangoPicker - 웹 매크로 & 크롤링

MangoPicker는 웹 자동화 서비스입니다. 반복 작업을 자동으로 처리하고, 원하는 정보를 손쉽게 추출하세요!

chrome.google.com

 

반응형