From a310c7a47185527c09c419a3e2c3fefb103ecd8b Mon Sep 17 00:00:00 2001 From: ByungCheol Date: Sat, 27 Jun 2026 18:02:19 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EA=B5=AC=EA=B8=80=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8/=EA=B0=80=EC=9E=85=20=E2=80=94=20=EC=9B=B9(GIS)=C2=B7?= =?UTF-8?q?=EC=95=B1(=EB=84=A4=EC=9D=B4=ED=8B=B0=EB=B8=8C=20Credential=20M?= =?UTF-8?q?anager)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - LoginModal: 서버에서 구글 클라이언트 ID 수신 시에만 버튼 노출 - 웹/PC: Google Identity Services 렌더 버튼 - 앱(안드로이드): @capawesome/capacitor-google-sign-in 네이티브 버튼 - 네이티브/웹 모두 ID 토큰을 /api/auth/google 로 전달(aud=웹 클라이언트 ID) - auth 스토어/authApi 에 googleLogin·googleClientId 추가 - src/native/googleAuth.js 네이티브 래퍼 신규 Co-Authored-By: Claude Opus 4.8 --- android/app/capacitor.build.gradle | 1 + android/capacitor.settings.gradle | 3 + package-lock.json | 20 ++++ package.json | 1 + src/api/authApi.js | 7 ++ src/components/LoginModal.vue | 171 ++++++++++++++++++++++++++++- src/native/googleAuth.js | 23 ++++ src/stores/auth.js | 11 +- 8 files changed, 235 insertions(+), 2 deletions(-) create mode 100644 src/native/googleAuth.js diff --git a/android/app/capacitor.build.gradle b/android/app/capacitor.build.gradle index f451109..9e53508 100644 --- a/android/app/capacitor.build.gradle +++ b/android/app/capacitor.build.gradle @@ -12,6 +12,7 @@ dependencies { implementation project(':capacitor-app') implementation project(':capacitor-camera') implementation project(':capacitor-preferences') + implementation project(':capawesome-capacitor-google-sign-in') } diff --git a/android/capacitor.settings.gradle b/android/capacitor.settings.gradle index c6772c6..7025a0e 100644 --- a/android/capacitor.settings.gradle +++ b/android/capacitor.settings.gradle @@ -10,3 +10,6 @@ project(':capacitor-camera').projectDir = new File('../node_modules/@capacitor/c include ':capacitor-preferences' project(':capacitor-preferences').projectDir = new File('../node_modules/@capacitor/preferences/android') + +include ':capawesome-capacitor-google-sign-in' +project(':capawesome-capacitor-google-sign-in').projectDir = new File('../node_modules/@capawesome/capacitor-google-sign-in/android') diff --git a/package-lock.json b/package-lock.json index 8726bb0..f6fe29d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "@capacitor/cli": "^8.3.4", "@capacitor/core": "^8.3.4", "@capacitor/preferences": "^8.0.1", + "@capawesome/capacitor-google-sign-in": "^0.1.2", "@toast-ui/editor": "^3.2.2", "@toast-ui/editor-plugin-code-syntax-highlight": "^3.1.0", "axios": "^1.16.1", @@ -1195,6 +1196,25 @@ "@capacitor/core": ">=8.0.0" } }, + "node_modules/@capawesome/capacitor-google-sign-in": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@capawesome/capacitor-google-sign-in/-/capacitor-google-sign-in-0.1.2.tgz", + "integrity": "sha512-41Z5LBVZJQ/20lEbzQJUtjfm7rCUhiq0EsfKmytTfKjqUjQB4zy0zlDMowe/z5CtetL8u7WGvERtyRYil2exww==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/capawesome-team/" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/capawesome" + } + ], + "license": "MIT", + "peerDependencies": { + "@capacitor/core": ">=8.0.0" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", diff --git a/package.json b/package.json index 07eee0f..5d1d89a 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "@capacitor/cli": "^8.3.4", "@capacitor/core": "^8.3.4", "@capacitor/preferences": "^8.0.1", + "@capawesome/capacitor-google-sign-in": "^0.1.2", "@toast-ui/editor": "^3.2.2", "@toast-ui/editor-plugin-code-syntax-highlight": "^3.1.0", "axios": "^1.16.1", diff --git a/src/api/authApi.js b/src/api/authApi.js index f5c9cfe..ede1e61 100644 --- a/src/api/authApi.js +++ b/src/api/authApi.js @@ -11,6 +11,13 @@ export const authApi = { login(payload) { return http.post('/auth/login', payload) }, + // 구글 로그인/가입 — GIS에서 받은 ID 토큰 전달 + googleLogin(payload) { + return http.post('/auth/google', payload) + }, + googleClientId() { + return http.get('/auth/google-client-id') + }, logout() { return http.post('/auth/logout') }, diff --git a/src/components/LoginModal.vue b/src/components/LoginModal.vue index f71a4d8..a96d408 100644 --- a/src/components/LoginModal.vue +++ b/src/components/LoginModal.vue @@ -1,8 +1,10 @@