capacitor3-kakao-login 0.8.3 → 0.8.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/definitions.d.ts +3 -0
- package/dist/esm/definitions.js.map +1 -1
- package/dist/esm/web.d.ts +6 -1
- package/dist/esm/web.js +215 -61
- package/dist/esm/web.js.map +1 -1
- package/dist/plugin.cjs.js +215 -61
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +215 -61
- package/dist/plugin.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"","sourcesContent":["export interface Capacitor3KakaoLoginPlugin {\n initializeKakao(options: {\n app_key: string;\n web_key: string;\n }): Promise<{ value: string }>;\n kakaoLogin(): Promise<{ value: string }>;\n kakaoLogout(): Promise<{ value: string }>;\n kakaoUnlink(): Promise<{ value: string }>;\n sendLinkFeed(options: {\n title: string;\n description: string;\n image_url: string;\n image_link_url: string;\n button_title: string;\n }): Promise<{ value: string }>;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"","sourcesContent":["export interface Capacitor3KakaoLoginPlugin {\n initializeKakao(options: {\n app_key: string;\n web_key: string;\n }): Promise<{ value: string }>;\n kakaoLogin(): Promise<{ value: string }>;\n handleKakaoCallback(): Promise<{ value: string }>;\n kakaoLogout(): Promise<{ value: string }>;\n kakaoUnlink(): Promise<{ value: string }>;\n sendLinkFeed(options: {\n title: string;\n description: string;\n image_url: string;\n image_link_url: string;\n button_title: string;\n }): Promise<{ value: string }>;\n}\n"]}
|
package/dist/esm/web.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { WebPlugin } from '@capacitor/core';
|
|
2
|
+
import type { Capacitor3KakaoLoginPlugin } from './definitions';
|
|
2
3
|
declare global {
|
|
3
4
|
interface Window {
|
|
4
5
|
Kakao: any;
|
|
5
6
|
}
|
|
6
7
|
}
|
|
7
|
-
export declare class Capacitor3KakaoLoginWeb extends WebPlugin implements
|
|
8
|
+
export declare class Capacitor3KakaoLoginWeb extends WebPlugin implements Capacitor3KakaoLoginPlugin {
|
|
8
9
|
private kakaoScriptId;
|
|
9
10
|
web_key: any;
|
|
10
11
|
initializeKakao(options: {
|
|
@@ -16,6 +17,9 @@ export declare class Capacitor3KakaoLoginWeb extends WebPlugin implements Capaci
|
|
|
16
17
|
kakaoLogin(): Promise<{
|
|
17
18
|
value: string;
|
|
18
19
|
}>;
|
|
20
|
+
handleKakaoCallback(): Promise<{
|
|
21
|
+
value: string;
|
|
22
|
+
}>;
|
|
19
23
|
kakaoLogout(): Promise<{
|
|
20
24
|
value: string;
|
|
21
25
|
}>;
|
|
@@ -31,6 +35,7 @@ export declare class Capacitor3KakaoLoginWeb extends WebPlugin implements Capaci
|
|
|
31
35
|
}): Promise<{
|
|
32
36
|
value: string;
|
|
33
37
|
}>;
|
|
38
|
+
private getAccessTokenFromCode;
|
|
34
39
|
private removeKakaoSdk;
|
|
35
40
|
private loadKakaoSdk;
|
|
36
41
|
}
|
package/dist/esm/web.js
CHANGED
|
@@ -18,35 +18,31 @@ export class Capacitor3KakaoLoginWeb extends WebPlugin {
|
|
|
18
18
|
}
|
|
19
19
|
});
|
|
20
20
|
}
|
|
21
|
-
//웹 카카오 로그인
|
|
21
|
+
//웹 카카오 로그인 (SDK 2.0 방식)
|
|
22
22
|
kakaoLogin() {
|
|
23
23
|
return new Promise(async (resolve, reject) => {
|
|
24
24
|
if (!this.web_key) {
|
|
25
25
|
reject('kakao_sdk_not_initialzed');
|
|
26
|
-
|
|
27
|
-
this.removeKakaoSdk();
|
|
28
|
-
await this.loadKakaoSdk();
|
|
29
|
-
if (typeof window['Kakao'] !== 'undefined') {
|
|
30
|
-
window['Kakao'].init(this.web_key); // Initialize Kakao with your JavaScript key
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
reject(new Error('Kakao undefined'));
|
|
26
|
+
return;
|
|
34
27
|
}
|
|
35
28
|
try {
|
|
36
|
-
|
|
29
|
+
this.removeKakaoSdk();
|
|
30
|
+
await this.loadKakaoSdk();
|
|
31
|
+
if (typeof window['Kakao'] === 'undefined') {
|
|
32
|
+
reject(new Error('Kakao undefined'));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
// SDK 2.0 초기화
|
|
36
|
+
window.Kakao.init(this.web_key);
|
|
37
|
+
// SDK 2.0: authorize() 메서드 사용 (리다이렉트 방식)
|
|
38
|
+
window.Kakao.Auth.authorize({
|
|
39
|
+
redirectUri: window.location.origin + '/login-kakao-callback',
|
|
37
40
|
throughTalk: true,
|
|
38
|
-
|
|
39
|
-
success: (response) => {
|
|
40
|
-
console.log(response);
|
|
41
|
-
resolve({
|
|
42
|
-
value: response.access_token,
|
|
43
|
-
});
|
|
44
|
-
},
|
|
45
|
-
fail: (error) => {
|
|
46
|
-
console.error('Kakao Login Failed', error);
|
|
47
|
-
reject(new Error('Kakao Login Failed'));
|
|
48
|
-
},
|
|
41
|
+
state: 'kakao_login_' + Date.now(),
|
|
49
42
|
});
|
|
43
|
+
// 리다이렉트가 발생하므로 Promise는 즉시 resolve
|
|
44
|
+
// 실제 토큰은 handleKakaoCallback()에서 처리
|
|
45
|
+
resolve({ value: 'redirected' });
|
|
50
46
|
}
|
|
51
47
|
catch (e) {
|
|
52
48
|
console.error('Error during Kakao login', e);
|
|
@@ -54,67 +50,222 @@ export class Capacitor3KakaoLoginWeb extends WebPlugin {
|
|
|
54
50
|
}
|
|
55
51
|
});
|
|
56
52
|
}
|
|
57
|
-
|
|
53
|
+
//리다이렉트 후 콜백 처리 (SDK 2.0 방식)
|
|
54
|
+
handleKakaoCallback() {
|
|
55
|
+
return new Promise(async (resolve, reject) => {
|
|
56
|
+
if (!this.web_key) {
|
|
57
|
+
reject('kakao_sdk_not_initialzed');
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
this.removeKakaoSdk();
|
|
62
|
+
await this.loadKakaoSdk();
|
|
63
|
+
if (typeof window['Kakao'] === 'undefined') {
|
|
64
|
+
reject(new Error('handleKakaoCallback Kakao undefined'));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
// SDK 2.0 초기화
|
|
68
|
+
window.Kakao.init(this.web_key);
|
|
69
|
+
// URL 파라미터 확인
|
|
70
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
71
|
+
const code = urlParams.get('code');
|
|
72
|
+
const error = urlParams.get('error');
|
|
73
|
+
if (error) {
|
|
74
|
+
reject(new Error(`Kakao Login Failed: ${error}`));
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (!code) {
|
|
78
|
+
// 인가 코드가 없는 경우 (리다이렉트 후가 아님)
|
|
79
|
+
reject(new Error('No authorization code found. Please call kakaoLogin() first.'));
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
// REST API를 통해 access token 획득
|
|
83
|
+
try {
|
|
84
|
+
const accessToken = await this.getAccessTokenFromCode(code);
|
|
85
|
+
if (accessToken) {
|
|
86
|
+
// URL 파라미터 정리
|
|
87
|
+
window.history.replaceState({}, '', window.location.pathname);
|
|
88
|
+
resolve({ value: accessToken });
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
reject(new Error('Kakao Login Failed: Token exchange failed'));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (tokenError) {
|
|
95
|
+
console.error('Error getting access token:', tokenError);
|
|
96
|
+
reject(new Error('Kakao Login Failed: Token exchange failed'));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (e) {
|
|
100
|
+
console.error('Error during Kakao callback handling', e);
|
|
101
|
+
reject(e);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
//웹 로그아웃 (SDK 2.0 방식)
|
|
58
106
|
kakaoLogout() {
|
|
59
107
|
return new Promise((resolve, reject) => {
|
|
60
108
|
if (!this.web_key) {
|
|
61
109
|
reject('kakao_sdk_not_initialzed');
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
const KakaoSdk = window['Kakao'];
|
|
114
|
+
if (KakaoSdk && KakaoSdk.Auth) {
|
|
115
|
+
// SDK 2.0: logout()은 Promise를 반환할 수 있음
|
|
116
|
+
const logoutResult = KakaoSdk.Auth.logout();
|
|
117
|
+
if (logoutResult && typeof logoutResult.then === 'function') {
|
|
118
|
+
logoutResult
|
|
119
|
+
.then(() => {
|
|
120
|
+
resolve({ value: 'done' });
|
|
121
|
+
})
|
|
122
|
+
.catch((error) => {
|
|
123
|
+
console.error('Kakao Logout Failed', error);
|
|
124
|
+
reject(error);
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
// 동기 방식으로 처리되는 경우
|
|
129
|
+
resolve({ value: 'done' });
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
reject(new Error('Kakao SDK not initialized'));
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch (e) {
|
|
137
|
+
console.error('Error during Kakao logout', e);
|
|
138
|
+
reject(e);
|
|
62
139
|
}
|
|
63
|
-
const KakaoSdk = window['Kakao'];
|
|
64
|
-
KakaoSdk.Auth.logout();
|
|
65
|
-
resolve({ value: 'done' });
|
|
66
140
|
});
|
|
67
141
|
}
|
|
68
|
-
//unlink
|
|
142
|
+
//unlink (SDK 2.0 방식)
|
|
69
143
|
kakaoUnlink() {
|
|
70
144
|
return new Promise((resolve, reject) => {
|
|
71
145
|
if (!this.web_key) {
|
|
72
146
|
reject('kakao_sdk_not_initialzed');
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
try {
|
|
150
|
+
const KakaoSdk = window['Kakao'];
|
|
151
|
+
if (KakaoSdk && KakaoSdk.API) {
|
|
152
|
+
// SDK 2.0: request()는 Promise를 반환
|
|
153
|
+
KakaoSdk.API.request({
|
|
154
|
+
url: '/v1/user/unlink',
|
|
155
|
+
})
|
|
156
|
+
.then((response) => {
|
|
157
|
+
console.log(response);
|
|
158
|
+
resolve({ value: 'done' });
|
|
159
|
+
})
|
|
160
|
+
.catch((error) => {
|
|
161
|
+
console.error('Kakao Unlink Failed', error);
|
|
162
|
+
reject(error);
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
reject(new Error('Kakao SDK not initialized'));
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch (e) {
|
|
170
|
+
console.error('Error during Kakao unlink', e);
|
|
171
|
+
reject(e);
|
|
73
172
|
}
|
|
74
|
-
const KakaoSdk = window['Kakao'];
|
|
75
|
-
KakaoSdk.API.request({
|
|
76
|
-
url: '/v1/user/unlink',
|
|
77
|
-
success: function (response) {
|
|
78
|
-
console.log(response);
|
|
79
|
-
resolve({ value: 'done' });
|
|
80
|
-
},
|
|
81
|
-
fail: function (error) {
|
|
82
|
-
console.log(error);
|
|
83
|
-
reject(error);
|
|
84
|
-
},
|
|
85
|
-
});
|
|
86
173
|
});
|
|
87
174
|
}
|
|
88
|
-
//message
|
|
175
|
+
//message (SDK 2.0 방식)
|
|
89
176
|
sendLinkFeed(options) {
|
|
90
177
|
return new Promise((resolve, reject) => {
|
|
91
178
|
if (!this.web_key) {
|
|
92
179
|
reject('kakao_sdk_not_initialzed');
|
|
180
|
+
return;
|
|
93
181
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
title: options.button_title,
|
|
108
|
-
link: {
|
|
109
|
-
mobileWebUrl: options.image_link_url,
|
|
182
|
+
try {
|
|
183
|
+
const KakaoSdk = window['Kakao'];
|
|
184
|
+
if (KakaoSdk && KakaoSdk.Link) {
|
|
185
|
+
// SDK 2.0: sendDefault()는 Promise를 반환할 수 있음
|
|
186
|
+
const sendResult = KakaoSdk.Link.sendDefault({
|
|
187
|
+
objectType: 'feed',
|
|
188
|
+
content: {
|
|
189
|
+
title: options.title,
|
|
190
|
+
description: options.description,
|
|
191
|
+
imageUrl: options.image_url,
|
|
192
|
+
link: {
|
|
193
|
+
mobileWebUrl: options.image_link_url,
|
|
194
|
+
},
|
|
110
195
|
},
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
196
|
+
buttons: [
|
|
197
|
+
{
|
|
198
|
+
title: options.button_title,
|
|
199
|
+
link: {
|
|
200
|
+
mobileWebUrl: options.image_link_url,
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
],
|
|
204
|
+
});
|
|
205
|
+
if (sendResult && typeof sendResult.then === 'function') {
|
|
206
|
+
// Promise 기반 API
|
|
207
|
+
sendResult
|
|
208
|
+
.then(() => {
|
|
209
|
+
resolve({ value: 'done' });
|
|
210
|
+
})
|
|
211
|
+
.catch((error) => {
|
|
212
|
+
console.error('Kakao Link Send Failed', error);
|
|
213
|
+
reject(error);
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
// 콜백 방식 (하위 호환성)
|
|
218
|
+
if (typeof sendResult === 'object' && sendResult.callback) {
|
|
219
|
+
sendResult.callback = function () {
|
|
220
|
+
resolve({ value: 'done' });
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
// 콜백이 없는 경우 직접 resolve
|
|
225
|
+
resolve({ value: 'done' });
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
reject(new Error('Kakao SDK not initialized'));
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
catch (e) {
|
|
234
|
+
console.error('Error during Kakao link send', e);
|
|
235
|
+
reject(e);
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
async getAccessTokenFromCode(code) {
|
|
240
|
+
const tokenUrl = 'https://kauth.kakao.com/oauth/token';
|
|
241
|
+
const redirectUri = window.location.origin + '/login-kakao-callback';
|
|
242
|
+
const params = new URLSearchParams({
|
|
243
|
+
grant_type: 'authorization_code',
|
|
244
|
+
client_id: this.web_key,
|
|
245
|
+
redirect_uri: redirectUri,
|
|
246
|
+
code: code,
|
|
247
|
+
});
|
|
248
|
+
try {
|
|
249
|
+
const response = await fetch(tokenUrl, {
|
|
250
|
+
method: 'POST',
|
|
251
|
+
headers: {
|
|
252
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
115
253
|
},
|
|
254
|
+
body: params.toString(),
|
|
116
255
|
});
|
|
117
|
-
|
|
256
|
+
if (!response.ok) {
|
|
257
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
258
|
+
}
|
|
259
|
+
const tokenData = await response.json();
|
|
260
|
+
if (tokenData.error) {
|
|
261
|
+
throw new Error(`Kakao token error: ${tokenData.error_description || tokenData.error}`);
|
|
262
|
+
}
|
|
263
|
+
return tokenData.access_token;
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
console.error('Error exchanging code for token:', error);
|
|
267
|
+
throw error;
|
|
268
|
+
}
|
|
118
269
|
}
|
|
119
270
|
removeKakaoSdk() {
|
|
120
271
|
const script = document.getElementById(this.kakaoScriptId);
|
|
@@ -132,7 +283,10 @@ export class Capacitor3KakaoLoginWeb extends WebPlugin {
|
|
|
132
283
|
}
|
|
133
284
|
const script = document.createElement('script');
|
|
134
285
|
script.id = this.kakaoScriptId; // Set an ID to reference this script
|
|
135
|
-
|
|
286
|
+
// SDK 2.x - Kakao.Auth.authorize() 리다이렉트 방식 사용
|
|
287
|
+
script.src = 'https://t1.kakaocdn.net/kakao_js_sdk/2.7.7/kakao.min.js';
|
|
288
|
+
// script.integrity = 'sha384-DKYJZ8NLiK8MN4/C5P2dtSmLQ4KwPaoqAfyA/DfmEc1VDxu4yyC7wy6K1Hs90nka';
|
|
289
|
+
// script.crossOrigin = 'anonymous';
|
|
136
290
|
script.onload = () => {
|
|
137
291
|
console.log('Kakao SDK loaded');
|
|
138
292
|
resolve();
|
package/dist/esm/web.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebPlugin } from '@capacitor/core';\n\n// declare var Kakao: any;\ndeclare global {\n interface Window {\n Kakao: any; // You can replace 'any' with a more specific type if available\n }\n}\n\nexport class Capacitor3KakaoLoginWeb\n extends WebPlugin\n implements Capacitor3KakaoLoginWeb\n{\n private kakaoScriptId = 'kakao-js-sdk'; // Unique ID for the Kakao SDK script\n web_key: any;\n\n initializeKakao(options: { app_key: string; web_key: string }) {\n return new Promise<{ value: string }>(async (resolve, reject) => {\n try {\n if (!this.web_key) {\n this.web_key = options.web_key;\n }\n resolve({ value: 'done' });\n } catch (error) {\n console.error(error);\n reject(error);\n }\n });\n }\n\n //웹 카카오 로그인\n kakaoLogin() {\n return new Promise<{ value: string }>(async (resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n }\n\n this.removeKakaoSdk();\n await this.loadKakaoSdk();\n if (typeof window['Kakao'] !== 'undefined') {\n window['Kakao'].init(this.web_key); // Initialize Kakao with your JavaScript key\n } else {\n reject(new Error('Kakao undefined'));\n }\n\n try {\n window.Kakao!.Auth.login({\n throughTalk: true,\n persistAccessToken: true,\n success: (response: any) => {\n console.log(response);\n\n resolve({\n value: response.access_token,\n });\n },\n fail: (error: any) => {\n console.error('Kakao Login Failed', error);\n reject(new Error('Kakao Login Failed'));\n },\n });\n } catch (e) {\n console.error('Error during Kakao login', e);\n reject(e);\n }\n });\n }\n\n //웹 로그아웃\n kakaoLogout() {\n return new Promise<{ value: string }>((resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n }\n\n const KakaoSdk: any = window['Kakao'];\n KakaoSdk.Auth.logout();\n resolve({ value: 'done' });\n });\n }\n\n //unlink\n kakaoUnlink() {\n return new Promise<{ value: string }>((resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n }\n\n const KakaoSdk: any = window['Kakao'];\n KakaoSdk.API.request({\n url: '/v1/user/unlink',\n success: function (response: any) {\n console.log(response);\n resolve({ value: 'done' });\n },\n fail: function (error: any) {\n console.log(error);\n reject(error);\n },\n });\n });\n }\n\n //message\n sendLinkFeed(options: {\n title: string;\n description: string;\n image_url: string;\n image_link_url: string;\n button_title: string;\n }) {\n return new Promise<{ value: string }>((resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n }\n const KakaoSdk: any = window['Kakao'];\n KakaoSdk.Link.sendDefault({\n objectType: 'feed',\n content: {\n title: options.title,\n description: options.description,\n imageUrl: options.image_url,\n link: {\n mobileWebUrl: options.image_link_url,\n },\n },\n buttons: [\n {\n title: options.button_title,\n link: {\n mobileWebUrl: options.image_link_url,\n },\n },\n ],\n callback: function () {\n resolve({ value: 'done' });\n },\n });\n });\n }\n\n private removeKakaoSdk(): void {\n const script = document.getElementById(this.kakaoScriptId);\n if (script) {\n document.head.removeChild(script); // Remove the script from the DOM\n console.log('Kakao SDK removed');\n }\n }\n\n private loadKakaoSdk(): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if the script is already loaded\n if (document.getElementById(this.kakaoScriptId)) {\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.id = this.kakaoScriptId; // Set an ID to reference this script\n script.src = 'https://developers.kakao.com/sdk/js/kakao.min.js';\n script.onload = () => {\n console.log('Kakao SDK loaded');\n resolve();\n };\n script.onerror = () => reject(new Error('Failed to load Kakao SDK'));\n document.head.appendChild(script);\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebPlugin } from '@capacitor/core';\nimport type { Capacitor3KakaoLoginPlugin } from './definitions';\n\n// declare var Kakao: any;\ndeclare global {\n interface Window {\n Kakao: any; // You can replace 'any' with a more specific type if available\n }\n}\n\nexport class Capacitor3KakaoLoginWeb\n extends WebPlugin\n implements Capacitor3KakaoLoginPlugin\n{\n private kakaoScriptId = 'kakao-js-sdk'; // Unique ID for the Kakao SDK script\n web_key: any;\n\n initializeKakao(options: { app_key: string; web_key: string }) {\n return new Promise<{ value: string }>(async (resolve, reject) => {\n try {\n if (!this.web_key) {\n this.web_key = options.web_key;\n }\n resolve({ value: 'done' });\n } catch (error) {\n console.error(error);\n reject(error);\n }\n });\n }\n\n //웹 카카오 로그인 (SDK 2.0 방식)\n kakaoLogin() {\n return new Promise<{ value: string }>(async (resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n return;\n }\n\n try {\n this.removeKakaoSdk();\n await this.loadKakaoSdk();\n\n if (typeof window['Kakao'] === 'undefined') {\n reject(new Error('Kakao undefined'));\n return;\n }\n\n // SDK 2.0 초기화\n window.Kakao!.init(this.web_key);\n\n // SDK 2.0: authorize() 메서드 사용 (리다이렉트 방식)\n window.Kakao!.Auth.authorize({\n redirectUri: window.location.origin + '/login-kakao-callback',\n throughTalk: true,\n state: 'kakao_login_' + Date.now(),\n });\n\n // 리다이렉트가 발생하므로 Promise는 즉시 resolve\n // 실제 토큰은 handleKakaoCallback()에서 처리\n resolve({ value: 'redirected' });\n } catch (e) {\n console.error('Error during Kakao login', e);\n reject(e);\n }\n });\n }\n\n //리다이렉트 후 콜백 처리 (SDK 2.0 방식)\n handleKakaoCallback() {\n return new Promise<{ value: string }>(async (resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n return;\n }\n\n\n try {\n this.removeKakaoSdk();\n await this.loadKakaoSdk();\n if (typeof window['Kakao'] === 'undefined') {\n reject(new Error('handleKakaoCallback Kakao undefined'));\n return;\n }\n // SDK 2.0 초기화\n window.Kakao!.init(this.web_key);\n // URL 파라미터 확인\n const urlParams = new URLSearchParams(window.location.search);\n const code = urlParams.get('code');\n const error = urlParams.get('error');\n \n if (error) {\n reject(new Error(`Kakao Login Failed: ${error}`));\n return;\n }\n\n if (!code) {\n // 인가 코드가 없는 경우 (리다이렉트 후가 아님)\n reject(\n new Error(\n 'No authorization code found. Please call kakaoLogin() first.',\n ),\n );\n return;\n }\n\n // REST API를 통해 access token 획득\n try {\n\n const accessToken = await this.getAccessTokenFromCode(code);\n \n if (accessToken) {\n // URL 파라미터 정리\n window.history.replaceState({}, '', window.location.pathname);\n resolve({ value: accessToken });\n } else {\n reject(new Error('Kakao Login Failed: Token exchange failed'));\n }\n } catch (tokenError) {\n console.error('Error getting access token:', tokenError);\n reject(new Error('Kakao Login Failed: Token exchange failed'));\n }\n } catch (e) {\n console.error('Error during Kakao callback handling', e);\n reject(e);\n }\n });\n }\n\n //웹 로그아웃 (SDK 2.0 방식)\n kakaoLogout() {\n return new Promise<{ value: string }>((resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n return;\n }\n\n try {\n const KakaoSdk: any = window['Kakao'];\n if (KakaoSdk && KakaoSdk.Auth) {\n // SDK 2.0: logout()은 Promise를 반환할 수 있음\n const logoutResult = KakaoSdk.Auth.logout();\n if (logoutResult && typeof logoutResult.then === 'function') {\n logoutResult\n .then(() => {\n resolve({ value: 'done' });\n })\n .catch((error: any) => {\n console.error('Kakao Logout Failed', error);\n reject(error);\n });\n } else {\n // 동기 방식으로 처리되는 경우\n resolve({ value: 'done' });\n }\n } else {\n reject(new Error('Kakao SDK not initialized'));\n }\n } catch (e) {\n console.error('Error during Kakao logout', e);\n reject(e);\n }\n });\n }\n\n //unlink (SDK 2.0 방식)\n kakaoUnlink() {\n return new Promise<{ value: string }>((resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n return;\n }\n\n try {\n const KakaoSdk: any = window['Kakao'];\n if (KakaoSdk && KakaoSdk.API) {\n // SDK 2.0: request()는 Promise를 반환\n KakaoSdk.API.request({\n url: '/v1/user/unlink',\n })\n .then((response: any) => {\n console.log(response);\n resolve({ value: 'done' });\n })\n .catch((error: any) => {\n console.error('Kakao Unlink Failed', error);\n reject(error);\n });\n } else {\n reject(new Error('Kakao SDK not initialized'));\n }\n } catch (e) {\n console.error('Error during Kakao unlink', e);\n reject(e);\n }\n });\n }\n\n //message (SDK 2.0 방식)\n sendLinkFeed(options: {\n title: string;\n description: string;\n image_url: string;\n image_link_url: string;\n button_title: string;\n }) {\n return new Promise<{ value: string }>((resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n return;\n }\n\n try {\n const KakaoSdk: any = window['Kakao'];\n if (KakaoSdk && KakaoSdk.Link) {\n // SDK 2.0: sendDefault()는 Promise를 반환할 수 있음\n const sendResult = KakaoSdk.Link.sendDefault({\n objectType: 'feed',\n content: {\n title: options.title,\n description: options.description,\n imageUrl: options.image_url,\n link: {\n mobileWebUrl: options.image_link_url,\n },\n },\n buttons: [\n {\n title: options.button_title,\n link: {\n mobileWebUrl: options.image_link_url,\n },\n },\n ],\n });\n\n if (sendResult && typeof sendResult.then === 'function') {\n // Promise 기반 API\n sendResult\n .then(() => {\n resolve({ value: 'done' });\n })\n .catch((error: any) => {\n console.error('Kakao Link Send Failed', error);\n reject(error);\n });\n } else {\n // 콜백 방식 (하위 호환성)\n if (typeof sendResult === 'object' && sendResult.callback) {\n sendResult.callback = function () {\n resolve({ value: 'done' });\n };\n } else {\n // 콜백이 없는 경우 직접 resolve\n resolve({ value: 'done' });\n }\n }\n } else {\n reject(new Error('Kakao SDK not initialized'));\n }\n } catch (e) {\n console.error('Error during Kakao link send', e);\n reject(e);\n }\n });\n }\n\n private async getAccessTokenFromCode(code: string): Promise<string> {\n const tokenUrl = 'https://kauth.kakao.com/oauth/token';\n const redirectUri = window.location.origin + '/login-kakao-callback';\n \n const params = new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: this.web_key,\n redirect_uri: redirectUri,\n code: code,\n });\n\n try {\n const response = await fetch(tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: params.toString(),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const tokenData = await response.json();\n \n if (tokenData.error) {\n throw new Error(`Kakao token error: ${tokenData.error_description || tokenData.error}`);\n }\n\n return tokenData.access_token;\n } catch (error) {\n console.error('Error exchanging code for token:', error);\n throw error;\n }\n }\n\n private removeKakaoSdk(): void {\n const script = document.getElementById(this.kakaoScriptId);\n if (script) {\n document.head.removeChild(script); // Remove the script from the DOM\n console.log('Kakao SDK removed');\n }\n }\n\n private loadKakaoSdk(): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if the script is already loaded\n if (document.getElementById(this.kakaoScriptId)) {\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.id = this.kakaoScriptId; // Set an ID to reference this script\n // SDK 2.x - Kakao.Auth.authorize() 리다이렉트 방식 사용\n script.src = 'https://t1.kakaocdn.net/kakao_js_sdk/2.7.7/kakao.min.js';\n // script.integrity = 'sha384-DKYJZ8NLiK8MN4/C5P2dtSmLQ4KwPaoqAfyA/DfmEc1VDxu4yyC7wy6K1Hs90nka';\n // script.crossOrigin = 'anonymous';\n script.onload = () => {\n console.log('Kakao SDK loaded');\n resolve();\n };\n script.onerror = () => reject(new Error('Failed to load Kakao SDK'));\n document.head.appendChild(script);\n });\n }\n}\n"]}
|
package/dist/plugin.cjs.js
CHANGED
|
@@ -27,35 +27,31 @@ class Capacitor3KakaoLoginWeb extends core.WebPlugin {
|
|
|
27
27
|
}
|
|
28
28
|
});
|
|
29
29
|
}
|
|
30
|
-
//웹 카카오 로그인
|
|
30
|
+
//웹 카카오 로그인 (SDK 2.0 방식)
|
|
31
31
|
kakaoLogin() {
|
|
32
32
|
return new Promise(async (resolve, reject) => {
|
|
33
33
|
if (!this.web_key) {
|
|
34
34
|
reject('kakao_sdk_not_initialzed');
|
|
35
|
-
|
|
36
|
-
this.removeKakaoSdk();
|
|
37
|
-
await this.loadKakaoSdk();
|
|
38
|
-
if (typeof window['Kakao'] !== 'undefined') {
|
|
39
|
-
window['Kakao'].init(this.web_key); // Initialize Kakao with your JavaScript key
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
reject(new Error('Kakao undefined'));
|
|
35
|
+
return;
|
|
43
36
|
}
|
|
44
37
|
try {
|
|
45
|
-
|
|
38
|
+
this.removeKakaoSdk();
|
|
39
|
+
await this.loadKakaoSdk();
|
|
40
|
+
if (typeof window['Kakao'] === 'undefined') {
|
|
41
|
+
reject(new Error('Kakao undefined'));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
// SDK 2.0 초기화
|
|
45
|
+
window.Kakao.init(this.web_key);
|
|
46
|
+
// SDK 2.0: authorize() 메서드 사용 (리다이렉트 방식)
|
|
47
|
+
window.Kakao.Auth.authorize({
|
|
48
|
+
redirectUri: window.location.origin + '/login-kakao-callback',
|
|
46
49
|
throughTalk: true,
|
|
47
|
-
|
|
48
|
-
success: (response) => {
|
|
49
|
-
console.log(response);
|
|
50
|
-
resolve({
|
|
51
|
-
value: response.access_token,
|
|
52
|
-
});
|
|
53
|
-
},
|
|
54
|
-
fail: (error) => {
|
|
55
|
-
console.error('Kakao Login Failed', error);
|
|
56
|
-
reject(new Error('Kakao Login Failed'));
|
|
57
|
-
},
|
|
50
|
+
state: 'kakao_login_' + Date.now(),
|
|
58
51
|
});
|
|
52
|
+
// 리다이렉트가 발생하므로 Promise는 즉시 resolve
|
|
53
|
+
// 실제 토큰은 handleKakaoCallback()에서 처리
|
|
54
|
+
resolve({ value: 'redirected' });
|
|
59
55
|
}
|
|
60
56
|
catch (e) {
|
|
61
57
|
console.error('Error during Kakao login', e);
|
|
@@ -63,67 +59,222 @@ class Capacitor3KakaoLoginWeb extends core.WebPlugin {
|
|
|
63
59
|
}
|
|
64
60
|
});
|
|
65
61
|
}
|
|
66
|
-
|
|
62
|
+
//리다이렉트 후 콜백 처리 (SDK 2.0 방식)
|
|
63
|
+
handleKakaoCallback() {
|
|
64
|
+
return new Promise(async (resolve, reject) => {
|
|
65
|
+
if (!this.web_key) {
|
|
66
|
+
reject('kakao_sdk_not_initialzed');
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
this.removeKakaoSdk();
|
|
71
|
+
await this.loadKakaoSdk();
|
|
72
|
+
if (typeof window['Kakao'] === 'undefined') {
|
|
73
|
+
reject(new Error('handleKakaoCallback Kakao undefined'));
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
// SDK 2.0 초기화
|
|
77
|
+
window.Kakao.init(this.web_key);
|
|
78
|
+
// URL 파라미터 확인
|
|
79
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
80
|
+
const code = urlParams.get('code');
|
|
81
|
+
const error = urlParams.get('error');
|
|
82
|
+
if (error) {
|
|
83
|
+
reject(new Error(`Kakao Login Failed: ${error}`));
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (!code) {
|
|
87
|
+
// 인가 코드가 없는 경우 (리다이렉트 후가 아님)
|
|
88
|
+
reject(new Error('No authorization code found. Please call kakaoLogin() first.'));
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
// REST API를 통해 access token 획득
|
|
92
|
+
try {
|
|
93
|
+
const accessToken = await this.getAccessTokenFromCode(code);
|
|
94
|
+
if (accessToken) {
|
|
95
|
+
// URL 파라미터 정리
|
|
96
|
+
window.history.replaceState({}, '', window.location.pathname);
|
|
97
|
+
resolve({ value: accessToken });
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
reject(new Error('Kakao Login Failed: Token exchange failed'));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (tokenError) {
|
|
104
|
+
console.error('Error getting access token:', tokenError);
|
|
105
|
+
reject(new Error('Kakao Login Failed: Token exchange failed'));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (e) {
|
|
109
|
+
console.error('Error during Kakao callback handling', e);
|
|
110
|
+
reject(e);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
//웹 로그아웃 (SDK 2.0 방식)
|
|
67
115
|
kakaoLogout() {
|
|
68
116
|
return new Promise((resolve, reject) => {
|
|
69
117
|
if (!this.web_key) {
|
|
70
118
|
reject('kakao_sdk_not_initialzed');
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
const KakaoSdk = window['Kakao'];
|
|
123
|
+
if (KakaoSdk && KakaoSdk.Auth) {
|
|
124
|
+
// SDK 2.0: logout()은 Promise를 반환할 수 있음
|
|
125
|
+
const logoutResult = KakaoSdk.Auth.logout();
|
|
126
|
+
if (logoutResult && typeof logoutResult.then === 'function') {
|
|
127
|
+
logoutResult
|
|
128
|
+
.then(() => {
|
|
129
|
+
resolve({ value: 'done' });
|
|
130
|
+
})
|
|
131
|
+
.catch((error) => {
|
|
132
|
+
console.error('Kakao Logout Failed', error);
|
|
133
|
+
reject(error);
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
// 동기 방식으로 처리되는 경우
|
|
138
|
+
resolve({ value: 'done' });
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
reject(new Error('Kakao SDK not initialized'));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch (e) {
|
|
146
|
+
console.error('Error during Kakao logout', e);
|
|
147
|
+
reject(e);
|
|
71
148
|
}
|
|
72
|
-
const KakaoSdk = window['Kakao'];
|
|
73
|
-
KakaoSdk.Auth.logout();
|
|
74
|
-
resolve({ value: 'done' });
|
|
75
149
|
});
|
|
76
150
|
}
|
|
77
|
-
//unlink
|
|
151
|
+
//unlink (SDK 2.0 방식)
|
|
78
152
|
kakaoUnlink() {
|
|
79
153
|
return new Promise((resolve, reject) => {
|
|
80
154
|
if (!this.web_key) {
|
|
81
155
|
reject('kakao_sdk_not_initialzed');
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
const KakaoSdk = window['Kakao'];
|
|
160
|
+
if (KakaoSdk && KakaoSdk.API) {
|
|
161
|
+
// SDK 2.0: request()는 Promise를 반환
|
|
162
|
+
KakaoSdk.API.request({
|
|
163
|
+
url: '/v1/user/unlink',
|
|
164
|
+
})
|
|
165
|
+
.then((response) => {
|
|
166
|
+
console.log(response);
|
|
167
|
+
resolve({ value: 'done' });
|
|
168
|
+
})
|
|
169
|
+
.catch((error) => {
|
|
170
|
+
console.error('Kakao Unlink Failed', error);
|
|
171
|
+
reject(error);
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
reject(new Error('Kakao SDK not initialized'));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
catch (e) {
|
|
179
|
+
console.error('Error during Kakao unlink', e);
|
|
180
|
+
reject(e);
|
|
82
181
|
}
|
|
83
|
-
const KakaoSdk = window['Kakao'];
|
|
84
|
-
KakaoSdk.API.request({
|
|
85
|
-
url: '/v1/user/unlink',
|
|
86
|
-
success: function (response) {
|
|
87
|
-
console.log(response);
|
|
88
|
-
resolve({ value: 'done' });
|
|
89
|
-
},
|
|
90
|
-
fail: function (error) {
|
|
91
|
-
console.log(error);
|
|
92
|
-
reject(error);
|
|
93
|
-
},
|
|
94
|
-
});
|
|
95
182
|
});
|
|
96
183
|
}
|
|
97
|
-
//message
|
|
184
|
+
//message (SDK 2.0 방식)
|
|
98
185
|
sendLinkFeed(options) {
|
|
99
186
|
return new Promise((resolve, reject) => {
|
|
100
187
|
if (!this.web_key) {
|
|
101
188
|
reject('kakao_sdk_not_initialzed');
|
|
189
|
+
return;
|
|
102
190
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
title: options.button_title,
|
|
117
|
-
link: {
|
|
118
|
-
mobileWebUrl: options.image_link_url,
|
|
191
|
+
try {
|
|
192
|
+
const KakaoSdk = window['Kakao'];
|
|
193
|
+
if (KakaoSdk && KakaoSdk.Link) {
|
|
194
|
+
// SDK 2.0: sendDefault()는 Promise를 반환할 수 있음
|
|
195
|
+
const sendResult = KakaoSdk.Link.sendDefault({
|
|
196
|
+
objectType: 'feed',
|
|
197
|
+
content: {
|
|
198
|
+
title: options.title,
|
|
199
|
+
description: options.description,
|
|
200
|
+
imageUrl: options.image_url,
|
|
201
|
+
link: {
|
|
202
|
+
mobileWebUrl: options.image_link_url,
|
|
203
|
+
},
|
|
119
204
|
},
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
205
|
+
buttons: [
|
|
206
|
+
{
|
|
207
|
+
title: options.button_title,
|
|
208
|
+
link: {
|
|
209
|
+
mobileWebUrl: options.image_link_url,
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
],
|
|
213
|
+
});
|
|
214
|
+
if (sendResult && typeof sendResult.then === 'function') {
|
|
215
|
+
// Promise 기반 API
|
|
216
|
+
sendResult
|
|
217
|
+
.then(() => {
|
|
218
|
+
resolve({ value: 'done' });
|
|
219
|
+
})
|
|
220
|
+
.catch((error) => {
|
|
221
|
+
console.error('Kakao Link Send Failed', error);
|
|
222
|
+
reject(error);
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
// 콜백 방식 (하위 호환성)
|
|
227
|
+
if (typeof sendResult === 'object' && sendResult.callback) {
|
|
228
|
+
sendResult.callback = function () {
|
|
229
|
+
resolve({ value: 'done' });
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
// 콜백이 없는 경우 직접 resolve
|
|
234
|
+
resolve({ value: 'done' });
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
reject(new Error('Kakao SDK not initialized'));
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
catch (e) {
|
|
243
|
+
console.error('Error during Kakao link send', e);
|
|
244
|
+
reject(e);
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
async getAccessTokenFromCode(code) {
|
|
249
|
+
const tokenUrl = 'https://kauth.kakao.com/oauth/token';
|
|
250
|
+
const redirectUri = window.location.origin + '/login-kakao-callback';
|
|
251
|
+
const params = new URLSearchParams({
|
|
252
|
+
grant_type: 'authorization_code',
|
|
253
|
+
client_id: this.web_key,
|
|
254
|
+
redirect_uri: redirectUri,
|
|
255
|
+
code: code,
|
|
256
|
+
});
|
|
257
|
+
try {
|
|
258
|
+
const response = await fetch(tokenUrl, {
|
|
259
|
+
method: 'POST',
|
|
260
|
+
headers: {
|
|
261
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
124
262
|
},
|
|
263
|
+
body: params.toString(),
|
|
125
264
|
});
|
|
126
|
-
|
|
265
|
+
if (!response.ok) {
|
|
266
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
267
|
+
}
|
|
268
|
+
const tokenData = await response.json();
|
|
269
|
+
if (tokenData.error) {
|
|
270
|
+
throw new Error(`Kakao token error: ${tokenData.error_description || tokenData.error}`);
|
|
271
|
+
}
|
|
272
|
+
return tokenData.access_token;
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
console.error('Error exchanging code for token:', error);
|
|
276
|
+
throw error;
|
|
277
|
+
}
|
|
127
278
|
}
|
|
128
279
|
removeKakaoSdk() {
|
|
129
280
|
const script = document.getElementById(this.kakaoScriptId);
|
|
@@ -141,7 +292,10 @@ class Capacitor3KakaoLoginWeb extends core.WebPlugin {
|
|
|
141
292
|
}
|
|
142
293
|
const script = document.createElement('script');
|
|
143
294
|
script.id = this.kakaoScriptId; // Set an ID to reference this script
|
|
144
|
-
|
|
295
|
+
// SDK 2.x - Kakao.Auth.authorize() 리다이렉트 방식 사용
|
|
296
|
+
script.src = 'https://t1.kakaocdn.net/kakao_js_sdk/2.7.7/kakao.min.js';
|
|
297
|
+
// script.integrity = 'sha384-DKYJZ8NLiK8MN4/C5P2dtSmLQ4KwPaoqAfyA/DfmEc1VDxu4yyC7wy6K1Hs90nka';
|
|
298
|
+
// script.crossOrigin = 'anonymous';
|
|
145
299
|
script.onload = () => {
|
|
146
300
|
console.log('Kakao SDK loaded');
|
|
147
301
|
resolve();
|
package/dist/plugin.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.cjs.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst Capacitor3KakaoLogin = registerPlugin('Capacitor3KakaoLogin', {\n web: () => import('./web').then(m => new m.Capacitor3KakaoLoginWeb()),\n});\nexport * from './definitions';\nexport { Capacitor3KakaoLogin };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class Capacitor3KakaoLoginWeb extends WebPlugin {\n constructor() {\n super(...arguments);\n this.kakaoScriptId = 'kakao-js-sdk'; // Unique ID for the Kakao SDK script\n }\n initializeKakao(options) {\n return new Promise(async (resolve, reject) => {\n try {\n if (!this.web_key) {\n this.web_key = options.web_key;\n }\n resolve({ value: 'done' });\n }\n catch (error) {\n console.error(error);\n reject(error);\n }\n });\n }\n //웹 카카오 로그인\n kakaoLogin() {\n return new Promise(async (resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n }\n this.removeKakaoSdk();\n await this.loadKakaoSdk();\n if (typeof window['Kakao'] !== 'undefined') {\n window['Kakao'].init(this.web_key); // Initialize Kakao with your JavaScript key\n }\n else {\n reject(new Error('Kakao undefined'));\n }\n try {\n window.Kakao.Auth.login({\n throughTalk: true,\n persistAccessToken: true,\n success: (response) => {\n console.log(response);\n resolve({\n value: response.access_token,\n });\n },\n fail: (error) => {\n console.error('Kakao Login Failed', error);\n reject(new Error('Kakao Login Failed'));\n },\n });\n }\n catch (e) {\n console.error('Error during Kakao login', e);\n reject(e);\n }\n });\n }\n //웹 로그아웃\n kakaoLogout() {\n return new Promise((resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n }\n const KakaoSdk = window['Kakao'];\n KakaoSdk.Auth.logout();\n resolve({ value: 'done' });\n });\n }\n //unlink\n kakaoUnlink() {\n return new Promise((resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n }\n const KakaoSdk = window['Kakao'];\n KakaoSdk.API.request({\n url: '/v1/user/unlink',\n success: function (response) {\n console.log(response);\n resolve({ value: 'done' });\n },\n fail: function (error) {\n console.log(error);\n reject(error);\n },\n });\n });\n }\n //message\n sendLinkFeed(options) {\n return new Promise((resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n }\n const KakaoSdk = window['Kakao'];\n KakaoSdk.Link.sendDefault({\n objectType: 'feed',\n content: {\n title: options.title,\n description: options.description,\n imageUrl: options.image_url,\n link: {\n mobileWebUrl: options.image_link_url,\n },\n },\n buttons: [\n {\n title: options.button_title,\n link: {\n mobileWebUrl: options.image_link_url,\n },\n },\n ],\n callback: function () {\n resolve({ value: 'done' });\n },\n });\n });\n }\n removeKakaoSdk() {\n const script = document.getElementById(this.kakaoScriptId);\n if (script) {\n document.head.removeChild(script); // Remove the script from the DOM\n console.log('Kakao SDK removed');\n }\n }\n loadKakaoSdk() {\n return new Promise((resolve, reject) => {\n // Check if the script is already loaded\n if (document.getElementById(this.kakaoScriptId)) {\n resolve();\n return;\n }\n const script = document.createElement('script');\n script.id = this.kakaoScriptId; // Set an ID to reference this script\n script.src = 'https://developers.kakao.com/sdk/js/kakao.min.js';\n script.onload = () => {\n console.log('Kakao SDK loaded');\n resolve();\n };\n script.onerror = () => reject(new Error('Failed to load Kakao SDK'));\n document.head.appendChild(script);\n });\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.cjs.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst Capacitor3KakaoLogin = registerPlugin('Capacitor3KakaoLogin', {\n web: () => import('./web').then(m => new m.Capacitor3KakaoLoginWeb()),\n});\nexport * from './definitions';\nexport { Capacitor3KakaoLogin };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class Capacitor3KakaoLoginWeb extends WebPlugin {\n constructor() {\n super(...arguments);\n this.kakaoScriptId = 'kakao-js-sdk'; // Unique ID for the Kakao SDK script\n }\n initializeKakao(options) {\n return new Promise(async (resolve, reject) => {\n try {\n if (!this.web_key) {\n this.web_key = options.web_key;\n }\n resolve({ value: 'done' });\n }\n catch (error) {\n console.error(error);\n reject(error);\n }\n });\n }\n //웹 카카오 로그인 (SDK 2.0 방식)\n kakaoLogin() {\n return new Promise(async (resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n return;\n }\n try {\n this.removeKakaoSdk();\n await this.loadKakaoSdk();\n if (typeof window['Kakao'] === 'undefined') {\n reject(new Error('Kakao undefined'));\n return;\n }\n // SDK 2.0 초기화\n window.Kakao.init(this.web_key);\n // SDK 2.0: authorize() 메서드 사용 (리다이렉트 방식)\n window.Kakao.Auth.authorize({\n redirectUri: window.location.origin + '/login-kakao-callback',\n throughTalk: true,\n state: 'kakao_login_' + Date.now(),\n });\n // 리다이렉트가 발생하므로 Promise는 즉시 resolve\n // 실제 토큰은 handleKakaoCallback()에서 처리\n resolve({ value: 'redirected' });\n }\n catch (e) {\n console.error('Error during Kakao login', e);\n reject(e);\n }\n });\n }\n //리다이렉트 후 콜백 처리 (SDK 2.0 방식)\n handleKakaoCallback() {\n return new Promise(async (resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n return;\n }\n try {\n this.removeKakaoSdk();\n await this.loadKakaoSdk();\n if (typeof window['Kakao'] === 'undefined') {\n reject(new Error('handleKakaoCallback Kakao undefined'));\n return;\n }\n // SDK 2.0 초기화\n window.Kakao.init(this.web_key);\n // URL 파라미터 확인\n const urlParams = new URLSearchParams(window.location.search);\n const code = urlParams.get('code');\n const error = urlParams.get('error');\n if (error) {\n reject(new Error(`Kakao Login Failed: ${error}`));\n return;\n }\n if (!code) {\n // 인가 코드가 없는 경우 (리다이렉트 후가 아님)\n reject(new Error('No authorization code found. Please call kakaoLogin() first.'));\n return;\n }\n // REST API를 통해 access token 획득\n try {\n const accessToken = await this.getAccessTokenFromCode(code);\n if (accessToken) {\n // URL 파라미터 정리\n window.history.replaceState({}, '', window.location.pathname);\n resolve({ value: accessToken });\n }\n else {\n reject(new Error('Kakao Login Failed: Token exchange failed'));\n }\n }\n catch (tokenError) {\n console.error('Error getting access token:', tokenError);\n reject(new Error('Kakao Login Failed: Token exchange failed'));\n }\n }\n catch (e) {\n console.error('Error during Kakao callback handling', e);\n reject(e);\n }\n });\n }\n //웹 로그아웃 (SDK 2.0 방식)\n kakaoLogout() {\n return new Promise((resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n return;\n }\n try {\n const KakaoSdk = window['Kakao'];\n if (KakaoSdk && KakaoSdk.Auth) {\n // SDK 2.0: logout()은 Promise를 반환할 수 있음\n const logoutResult = KakaoSdk.Auth.logout();\n if (logoutResult && typeof logoutResult.then === 'function') {\n logoutResult\n .then(() => {\n resolve({ value: 'done' });\n })\n .catch((error) => {\n console.error('Kakao Logout Failed', error);\n reject(error);\n });\n }\n else {\n // 동기 방식으로 처리되는 경우\n resolve({ value: 'done' });\n }\n }\n else {\n reject(new Error('Kakao SDK not initialized'));\n }\n }\n catch (e) {\n console.error('Error during Kakao logout', e);\n reject(e);\n }\n });\n }\n //unlink (SDK 2.0 방식)\n kakaoUnlink() {\n return new Promise((resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n return;\n }\n try {\n const KakaoSdk = window['Kakao'];\n if (KakaoSdk && KakaoSdk.API) {\n // SDK 2.0: request()는 Promise를 반환\n KakaoSdk.API.request({\n url: '/v1/user/unlink',\n })\n .then((response) => {\n console.log(response);\n resolve({ value: 'done' });\n })\n .catch((error) => {\n console.error('Kakao Unlink Failed', error);\n reject(error);\n });\n }\n else {\n reject(new Error('Kakao SDK not initialized'));\n }\n }\n catch (e) {\n console.error('Error during Kakao unlink', e);\n reject(e);\n }\n });\n }\n //message (SDK 2.0 방식)\n sendLinkFeed(options) {\n return new Promise((resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n return;\n }\n try {\n const KakaoSdk = window['Kakao'];\n if (KakaoSdk && KakaoSdk.Link) {\n // SDK 2.0: sendDefault()는 Promise를 반환할 수 있음\n const sendResult = KakaoSdk.Link.sendDefault({\n objectType: 'feed',\n content: {\n title: options.title,\n description: options.description,\n imageUrl: options.image_url,\n link: {\n mobileWebUrl: options.image_link_url,\n },\n },\n buttons: [\n {\n title: options.button_title,\n link: {\n mobileWebUrl: options.image_link_url,\n },\n },\n ],\n });\n if (sendResult && typeof sendResult.then === 'function') {\n // Promise 기반 API\n sendResult\n .then(() => {\n resolve({ value: 'done' });\n })\n .catch((error) => {\n console.error('Kakao Link Send Failed', error);\n reject(error);\n });\n }\n else {\n // 콜백 방식 (하위 호환성)\n if (typeof sendResult === 'object' && sendResult.callback) {\n sendResult.callback = function () {\n resolve({ value: 'done' });\n };\n }\n else {\n // 콜백이 없는 경우 직접 resolve\n resolve({ value: 'done' });\n }\n }\n }\n else {\n reject(new Error('Kakao SDK not initialized'));\n }\n }\n catch (e) {\n console.error('Error during Kakao link send', e);\n reject(e);\n }\n });\n }\n async getAccessTokenFromCode(code) {\n const tokenUrl = 'https://kauth.kakao.com/oauth/token';\n const redirectUri = window.location.origin + '/login-kakao-callback';\n const params = new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: this.web_key,\n redirect_uri: redirectUri,\n code: code,\n });\n try {\n const response = await fetch(tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: params.toString(),\n });\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n const tokenData = await response.json();\n if (tokenData.error) {\n throw new Error(`Kakao token error: ${tokenData.error_description || tokenData.error}`);\n }\n return tokenData.access_token;\n }\n catch (error) {\n console.error('Error exchanging code for token:', error);\n throw error;\n }\n }\n removeKakaoSdk() {\n const script = document.getElementById(this.kakaoScriptId);\n if (script) {\n document.head.removeChild(script); // Remove the script from the DOM\n console.log('Kakao SDK removed');\n }\n }\n loadKakaoSdk() {\n return new Promise((resolve, reject) => {\n // Check if the script is already loaded\n if (document.getElementById(this.kakaoScriptId)) {\n resolve();\n return;\n }\n const script = document.createElement('script');\n script.id = this.kakaoScriptId; // Set an ID to reference this script\n // SDK 2.x - Kakao.Auth.authorize() 리다이렉트 방식 사용\n script.src = 'https://t1.kakaocdn.net/kakao_js_sdk/2.7.7/kakao.min.js';\n // script.integrity = 'sha384-DKYJZ8NLiK8MN4/C5P2dtSmLQ4KwPaoqAfyA/DfmEc1VDxu4yyC7wy6K1Hs90nka';\n // script.crossOrigin = 'anonymous';\n script.onload = () => {\n console.log('Kakao SDK loaded');\n resolve();\n };\n script.onerror = () => reject(new Error('Failed to load Kakao SDK'));\n document.head.appendChild(script);\n });\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}
|
package/dist/plugin.js
CHANGED
|
@@ -24,35 +24,31 @@ var Capacitor3KakaoLogin = (function (exports, core) {
|
|
|
24
24
|
}
|
|
25
25
|
});
|
|
26
26
|
}
|
|
27
|
-
//웹 카카오 로그인
|
|
27
|
+
//웹 카카오 로그인 (SDK 2.0 방식)
|
|
28
28
|
kakaoLogin() {
|
|
29
29
|
return new Promise(async (resolve, reject) => {
|
|
30
30
|
if (!this.web_key) {
|
|
31
31
|
reject('kakao_sdk_not_initialzed');
|
|
32
|
-
|
|
33
|
-
this.removeKakaoSdk();
|
|
34
|
-
await this.loadKakaoSdk();
|
|
35
|
-
if (typeof window['Kakao'] !== 'undefined') {
|
|
36
|
-
window['Kakao'].init(this.web_key); // Initialize Kakao with your JavaScript key
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
reject(new Error('Kakao undefined'));
|
|
32
|
+
return;
|
|
40
33
|
}
|
|
41
34
|
try {
|
|
42
|
-
|
|
35
|
+
this.removeKakaoSdk();
|
|
36
|
+
await this.loadKakaoSdk();
|
|
37
|
+
if (typeof window['Kakao'] === 'undefined') {
|
|
38
|
+
reject(new Error('Kakao undefined'));
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
// SDK 2.0 초기화
|
|
42
|
+
window.Kakao.init(this.web_key);
|
|
43
|
+
// SDK 2.0: authorize() 메서드 사용 (리다이렉트 방식)
|
|
44
|
+
window.Kakao.Auth.authorize({
|
|
45
|
+
redirectUri: window.location.origin + '/login-kakao-callback',
|
|
43
46
|
throughTalk: true,
|
|
44
|
-
|
|
45
|
-
success: (response) => {
|
|
46
|
-
console.log(response);
|
|
47
|
-
resolve({
|
|
48
|
-
value: response.access_token,
|
|
49
|
-
});
|
|
50
|
-
},
|
|
51
|
-
fail: (error) => {
|
|
52
|
-
console.error('Kakao Login Failed', error);
|
|
53
|
-
reject(new Error('Kakao Login Failed'));
|
|
54
|
-
},
|
|
47
|
+
state: 'kakao_login_' + Date.now(),
|
|
55
48
|
});
|
|
49
|
+
// 리다이렉트가 발생하므로 Promise는 즉시 resolve
|
|
50
|
+
// 실제 토큰은 handleKakaoCallback()에서 처리
|
|
51
|
+
resolve({ value: 'redirected' });
|
|
56
52
|
}
|
|
57
53
|
catch (e) {
|
|
58
54
|
console.error('Error during Kakao login', e);
|
|
@@ -60,67 +56,222 @@ var Capacitor3KakaoLogin = (function (exports, core) {
|
|
|
60
56
|
}
|
|
61
57
|
});
|
|
62
58
|
}
|
|
63
|
-
|
|
59
|
+
//리다이렉트 후 콜백 처리 (SDK 2.0 방식)
|
|
60
|
+
handleKakaoCallback() {
|
|
61
|
+
return new Promise(async (resolve, reject) => {
|
|
62
|
+
if (!this.web_key) {
|
|
63
|
+
reject('kakao_sdk_not_initialzed');
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
this.removeKakaoSdk();
|
|
68
|
+
await this.loadKakaoSdk();
|
|
69
|
+
if (typeof window['Kakao'] === 'undefined') {
|
|
70
|
+
reject(new Error('handleKakaoCallback Kakao undefined'));
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
// SDK 2.0 초기화
|
|
74
|
+
window.Kakao.init(this.web_key);
|
|
75
|
+
// URL 파라미터 확인
|
|
76
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
77
|
+
const code = urlParams.get('code');
|
|
78
|
+
const error = urlParams.get('error');
|
|
79
|
+
if (error) {
|
|
80
|
+
reject(new Error(`Kakao Login Failed: ${error}`));
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (!code) {
|
|
84
|
+
// 인가 코드가 없는 경우 (리다이렉트 후가 아님)
|
|
85
|
+
reject(new Error('No authorization code found. Please call kakaoLogin() first.'));
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
// REST API를 통해 access token 획득
|
|
89
|
+
try {
|
|
90
|
+
const accessToken = await this.getAccessTokenFromCode(code);
|
|
91
|
+
if (accessToken) {
|
|
92
|
+
// URL 파라미터 정리
|
|
93
|
+
window.history.replaceState({}, '', window.location.pathname);
|
|
94
|
+
resolve({ value: accessToken });
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
reject(new Error('Kakao Login Failed: Token exchange failed'));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (tokenError) {
|
|
101
|
+
console.error('Error getting access token:', tokenError);
|
|
102
|
+
reject(new Error('Kakao Login Failed: Token exchange failed'));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch (e) {
|
|
106
|
+
console.error('Error during Kakao callback handling', e);
|
|
107
|
+
reject(e);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
//웹 로그아웃 (SDK 2.0 방식)
|
|
64
112
|
kakaoLogout() {
|
|
65
113
|
return new Promise((resolve, reject) => {
|
|
66
114
|
if (!this.web_key) {
|
|
67
115
|
reject('kakao_sdk_not_initialzed');
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
try {
|
|
119
|
+
const KakaoSdk = window['Kakao'];
|
|
120
|
+
if (KakaoSdk && KakaoSdk.Auth) {
|
|
121
|
+
// SDK 2.0: logout()은 Promise를 반환할 수 있음
|
|
122
|
+
const logoutResult = KakaoSdk.Auth.logout();
|
|
123
|
+
if (logoutResult && typeof logoutResult.then === 'function') {
|
|
124
|
+
logoutResult
|
|
125
|
+
.then(() => {
|
|
126
|
+
resolve({ value: 'done' });
|
|
127
|
+
})
|
|
128
|
+
.catch((error) => {
|
|
129
|
+
console.error('Kakao Logout Failed', error);
|
|
130
|
+
reject(error);
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
// 동기 방식으로 처리되는 경우
|
|
135
|
+
resolve({ value: 'done' });
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
reject(new Error('Kakao SDK not initialized'));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch (e) {
|
|
143
|
+
console.error('Error during Kakao logout', e);
|
|
144
|
+
reject(e);
|
|
68
145
|
}
|
|
69
|
-
const KakaoSdk = window['Kakao'];
|
|
70
|
-
KakaoSdk.Auth.logout();
|
|
71
|
-
resolve({ value: 'done' });
|
|
72
146
|
});
|
|
73
147
|
}
|
|
74
|
-
//unlink
|
|
148
|
+
//unlink (SDK 2.0 방식)
|
|
75
149
|
kakaoUnlink() {
|
|
76
150
|
return new Promise((resolve, reject) => {
|
|
77
151
|
if (!this.web_key) {
|
|
78
152
|
reject('kakao_sdk_not_initialzed');
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
const KakaoSdk = window['Kakao'];
|
|
157
|
+
if (KakaoSdk && KakaoSdk.API) {
|
|
158
|
+
// SDK 2.0: request()는 Promise를 반환
|
|
159
|
+
KakaoSdk.API.request({
|
|
160
|
+
url: '/v1/user/unlink',
|
|
161
|
+
})
|
|
162
|
+
.then((response) => {
|
|
163
|
+
console.log(response);
|
|
164
|
+
resolve({ value: 'done' });
|
|
165
|
+
})
|
|
166
|
+
.catch((error) => {
|
|
167
|
+
console.error('Kakao Unlink Failed', error);
|
|
168
|
+
reject(error);
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
reject(new Error('Kakao SDK not initialized'));
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch (e) {
|
|
176
|
+
console.error('Error during Kakao unlink', e);
|
|
177
|
+
reject(e);
|
|
79
178
|
}
|
|
80
|
-
const KakaoSdk = window['Kakao'];
|
|
81
|
-
KakaoSdk.API.request({
|
|
82
|
-
url: '/v1/user/unlink',
|
|
83
|
-
success: function (response) {
|
|
84
|
-
console.log(response);
|
|
85
|
-
resolve({ value: 'done' });
|
|
86
|
-
},
|
|
87
|
-
fail: function (error) {
|
|
88
|
-
console.log(error);
|
|
89
|
-
reject(error);
|
|
90
|
-
},
|
|
91
|
-
});
|
|
92
179
|
});
|
|
93
180
|
}
|
|
94
|
-
//message
|
|
181
|
+
//message (SDK 2.0 방식)
|
|
95
182
|
sendLinkFeed(options) {
|
|
96
183
|
return new Promise((resolve, reject) => {
|
|
97
184
|
if (!this.web_key) {
|
|
98
185
|
reject('kakao_sdk_not_initialzed');
|
|
186
|
+
return;
|
|
99
187
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
title: options.button_title,
|
|
114
|
-
link: {
|
|
115
|
-
mobileWebUrl: options.image_link_url,
|
|
188
|
+
try {
|
|
189
|
+
const KakaoSdk = window['Kakao'];
|
|
190
|
+
if (KakaoSdk && KakaoSdk.Link) {
|
|
191
|
+
// SDK 2.0: sendDefault()는 Promise를 반환할 수 있음
|
|
192
|
+
const sendResult = KakaoSdk.Link.sendDefault({
|
|
193
|
+
objectType: 'feed',
|
|
194
|
+
content: {
|
|
195
|
+
title: options.title,
|
|
196
|
+
description: options.description,
|
|
197
|
+
imageUrl: options.image_url,
|
|
198
|
+
link: {
|
|
199
|
+
mobileWebUrl: options.image_link_url,
|
|
200
|
+
},
|
|
116
201
|
},
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
202
|
+
buttons: [
|
|
203
|
+
{
|
|
204
|
+
title: options.button_title,
|
|
205
|
+
link: {
|
|
206
|
+
mobileWebUrl: options.image_link_url,
|
|
207
|
+
},
|
|
208
|
+
},
|
|
209
|
+
],
|
|
210
|
+
});
|
|
211
|
+
if (sendResult && typeof sendResult.then === 'function') {
|
|
212
|
+
// Promise 기반 API
|
|
213
|
+
sendResult
|
|
214
|
+
.then(() => {
|
|
215
|
+
resolve({ value: 'done' });
|
|
216
|
+
})
|
|
217
|
+
.catch((error) => {
|
|
218
|
+
console.error('Kakao Link Send Failed', error);
|
|
219
|
+
reject(error);
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
// 콜백 방식 (하위 호환성)
|
|
224
|
+
if (typeof sendResult === 'object' && sendResult.callback) {
|
|
225
|
+
sendResult.callback = function () {
|
|
226
|
+
resolve({ value: 'done' });
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
// 콜백이 없는 경우 직접 resolve
|
|
231
|
+
resolve({ value: 'done' });
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
reject(new Error('Kakao SDK not initialized'));
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
catch (e) {
|
|
240
|
+
console.error('Error during Kakao link send', e);
|
|
241
|
+
reject(e);
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
async getAccessTokenFromCode(code) {
|
|
246
|
+
const tokenUrl = 'https://kauth.kakao.com/oauth/token';
|
|
247
|
+
const redirectUri = window.location.origin + '/login-kakao-callback';
|
|
248
|
+
const params = new URLSearchParams({
|
|
249
|
+
grant_type: 'authorization_code',
|
|
250
|
+
client_id: this.web_key,
|
|
251
|
+
redirect_uri: redirectUri,
|
|
252
|
+
code: code,
|
|
253
|
+
});
|
|
254
|
+
try {
|
|
255
|
+
const response = await fetch(tokenUrl, {
|
|
256
|
+
method: 'POST',
|
|
257
|
+
headers: {
|
|
258
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
121
259
|
},
|
|
260
|
+
body: params.toString(),
|
|
122
261
|
});
|
|
123
|
-
|
|
262
|
+
if (!response.ok) {
|
|
263
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
264
|
+
}
|
|
265
|
+
const tokenData = await response.json();
|
|
266
|
+
if (tokenData.error) {
|
|
267
|
+
throw new Error(`Kakao token error: ${tokenData.error_description || tokenData.error}`);
|
|
268
|
+
}
|
|
269
|
+
return tokenData.access_token;
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
console.error('Error exchanging code for token:', error);
|
|
273
|
+
throw error;
|
|
274
|
+
}
|
|
124
275
|
}
|
|
125
276
|
removeKakaoSdk() {
|
|
126
277
|
const script = document.getElementById(this.kakaoScriptId);
|
|
@@ -138,7 +289,10 @@ var Capacitor3KakaoLogin = (function (exports, core) {
|
|
|
138
289
|
}
|
|
139
290
|
const script = document.createElement('script');
|
|
140
291
|
script.id = this.kakaoScriptId; // Set an ID to reference this script
|
|
141
|
-
|
|
292
|
+
// SDK 2.x - Kakao.Auth.authorize() 리다이렉트 방식 사용
|
|
293
|
+
script.src = 'https://t1.kakaocdn.net/kakao_js_sdk/2.7.7/kakao.min.js';
|
|
294
|
+
// script.integrity = 'sha384-DKYJZ8NLiK8MN4/C5P2dtSmLQ4KwPaoqAfyA/DfmEc1VDxu4yyC7wy6K1Hs90nka';
|
|
295
|
+
// script.crossOrigin = 'anonymous';
|
|
142
296
|
script.onload = () => {
|
|
143
297
|
console.log('Kakao SDK loaded');
|
|
144
298
|
resolve();
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst Capacitor3KakaoLogin = registerPlugin('Capacitor3KakaoLogin', {\n web: () => import('./web').then(m => new m.Capacitor3KakaoLoginWeb()),\n});\nexport * from './definitions';\nexport { Capacitor3KakaoLogin };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class Capacitor3KakaoLoginWeb extends WebPlugin {\n constructor() {\n super(...arguments);\n this.kakaoScriptId = 'kakao-js-sdk'; // Unique ID for the Kakao SDK script\n }\n initializeKakao(options) {\n return new Promise(async (resolve, reject) => {\n try {\n if (!this.web_key) {\n this.web_key = options.web_key;\n }\n resolve({ value: 'done' });\n }\n catch (error) {\n console.error(error);\n reject(error);\n }\n });\n }\n //웹 카카오 로그인\n kakaoLogin() {\n return new Promise(async (resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n }\n this.removeKakaoSdk();\n await this.loadKakaoSdk();\n if (typeof window['Kakao'] !== 'undefined') {\n window['Kakao'].init(this.web_key); // Initialize Kakao with your JavaScript key\n }\n else {\n reject(new Error('Kakao undefined'));\n }\n try {\n window.Kakao.Auth.login({\n throughTalk: true,\n persistAccessToken: true,\n success: (response) => {\n console.log(response);\n resolve({\n value: response.access_token,\n });\n },\n fail: (error) => {\n console.error('Kakao Login Failed', error);\n reject(new Error('Kakao Login Failed'));\n },\n });\n }\n catch (e) {\n console.error('Error during Kakao login', e);\n reject(e);\n }\n });\n }\n //웹 로그아웃\n kakaoLogout() {\n return new Promise((resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n }\n const KakaoSdk = window['Kakao'];\n KakaoSdk.Auth.logout();\n resolve({ value: 'done' });\n });\n }\n //unlink\n kakaoUnlink() {\n return new Promise((resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n }\n const KakaoSdk = window['Kakao'];\n KakaoSdk.API.request({\n url: '/v1/user/unlink',\n success: function (response) {\n console.log(response);\n resolve({ value: 'done' });\n },\n fail: function (error) {\n console.log(error);\n reject(error);\n },\n });\n });\n }\n //message\n sendLinkFeed(options) {\n return new Promise((resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n }\n const KakaoSdk = window['Kakao'];\n KakaoSdk.Link.sendDefault({\n objectType: 'feed',\n content: {\n title: options.title,\n description: options.description,\n imageUrl: options.image_url,\n link: {\n mobileWebUrl: options.image_link_url,\n },\n },\n buttons: [\n {\n title: options.button_title,\n link: {\n mobileWebUrl: options.image_link_url,\n },\n },\n ],\n callback: function () {\n resolve({ value: 'done' });\n },\n });\n });\n }\n removeKakaoSdk() {\n const script = document.getElementById(this.kakaoScriptId);\n if (script) {\n document.head.removeChild(script); // Remove the script from the DOM\n console.log('Kakao SDK removed');\n }\n }\n loadKakaoSdk() {\n return new Promise((resolve, reject) => {\n // Check if the script is already loaded\n if (document.getElementById(this.kakaoScriptId)) {\n resolve();\n return;\n }\n const script = document.createElement('script');\n script.id = this.kakaoScriptId; // Set an ID to reference this script\n script.src = 'https://developers.kakao.com/sdk/js/kakao.min.js';\n script.onload = () => {\n console.log('Kakao SDK loaded');\n resolve();\n };\n script.onerror = () => reject(new Error('Failed to load Kakao SDK'));\n document.head.appendChild(script);\n });\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst Capacitor3KakaoLogin = registerPlugin('Capacitor3KakaoLogin', {\n web: () => import('./web').then(m => new m.Capacitor3KakaoLoginWeb()),\n});\nexport * from './definitions';\nexport { Capacitor3KakaoLogin };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class Capacitor3KakaoLoginWeb extends WebPlugin {\n constructor() {\n super(...arguments);\n this.kakaoScriptId = 'kakao-js-sdk'; // Unique ID for the Kakao SDK script\n }\n initializeKakao(options) {\n return new Promise(async (resolve, reject) => {\n try {\n if (!this.web_key) {\n this.web_key = options.web_key;\n }\n resolve({ value: 'done' });\n }\n catch (error) {\n console.error(error);\n reject(error);\n }\n });\n }\n //웹 카카오 로그인 (SDK 2.0 방식)\n kakaoLogin() {\n return new Promise(async (resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n return;\n }\n try {\n this.removeKakaoSdk();\n await this.loadKakaoSdk();\n if (typeof window['Kakao'] === 'undefined') {\n reject(new Error('Kakao undefined'));\n return;\n }\n // SDK 2.0 초기화\n window.Kakao.init(this.web_key);\n // SDK 2.0: authorize() 메서드 사용 (리다이렉트 방식)\n window.Kakao.Auth.authorize({\n redirectUri: window.location.origin + '/login-kakao-callback',\n throughTalk: true,\n state: 'kakao_login_' + Date.now(),\n });\n // 리다이렉트가 발생하므로 Promise는 즉시 resolve\n // 실제 토큰은 handleKakaoCallback()에서 처리\n resolve({ value: 'redirected' });\n }\n catch (e) {\n console.error('Error during Kakao login', e);\n reject(e);\n }\n });\n }\n //리다이렉트 후 콜백 처리 (SDK 2.0 방식)\n handleKakaoCallback() {\n return new Promise(async (resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n return;\n }\n try {\n this.removeKakaoSdk();\n await this.loadKakaoSdk();\n if (typeof window['Kakao'] === 'undefined') {\n reject(new Error('handleKakaoCallback Kakao undefined'));\n return;\n }\n // SDK 2.0 초기화\n window.Kakao.init(this.web_key);\n // URL 파라미터 확인\n const urlParams = new URLSearchParams(window.location.search);\n const code = urlParams.get('code');\n const error = urlParams.get('error');\n if (error) {\n reject(new Error(`Kakao Login Failed: ${error}`));\n return;\n }\n if (!code) {\n // 인가 코드가 없는 경우 (리다이렉트 후가 아님)\n reject(new Error('No authorization code found. Please call kakaoLogin() first.'));\n return;\n }\n // REST API를 통해 access token 획득\n try {\n const accessToken = await this.getAccessTokenFromCode(code);\n if (accessToken) {\n // URL 파라미터 정리\n window.history.replaceState({}, '', window.location.pathname);\n resolve({ value: accessToken });\n }\n else {\n reject(new Error('Kakao Login Failed: Token exchange failed'));\n }\n }\n catch (tokenError) {\n console.error('Error getting access token:', tokenError);\n reject(new Error('Kakao Login Failed: Token exchange failed'));\n }\n }\n catch (e) {\n console.error('Error during Kakao callback handling', e);\n reject(e);\n }\n });\n }\n //웹 로그아웃 (SDK 2.0 방식)\n kakaoLogout() {\n return new Promise((resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n return;\n }\n try {\n const KakaoSdk = window['Kakao'];\n if (KakaoSdk && KakaoSdk.Auth) {\n // SDK 2.0: logout()은 Promise를 반환할 수 있음\n const logoutResult = KakaoSdk.Auth.logout();\n if (logoutResult && typeof logoutResult.then === 'function') {\n logoutResult\n .then(() => {\n resolve({ value: 'done' });\n })\n .catch((error) => {\n console.error('Kakao Logout Failed', error);\n reject(error);\n });\n }\n else {\n // 동기 방식으로 처리되는 경우\n resolve({ value: 'done' });\n }\n }\n else {\n reject(new Error('Kakao SDK not initialized'));\n }\n }\n catch (e) {\n console.error('Error during Kakao logout', e);\n reject(e);\n }\n });\n }\n //unlink (SDK 2.0 방식)\n kakaoUnlink() {\n return new Promise((resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n return;\n }\n try {\n const KakaoSdk = window['Kakao'];\n if (KakaoSdk && KakaoSdk.API) {\n // SDK 2.0: request()는 Promise를 반환\n KakaoSdk.API.request({\n url: '/v1/user/unlink',\n })\n .then((response) => {\n console.log(response);\n resolve({ value: 'done' });\n })\n .catch((error) => {\n console.error('Kakao Unlink Failed', error);\n reject(error);\n });\n }\n else {\n reject(new Error('Kakao SDK not initialized'));\n }\n }\n catch (e) {\n console.error('Error during Kakao unlink', e);\n reject(e);\n }\n });\n }\n //message (SDK 2.0 방식)\n sendLinkFeed(options) {\n return new Promise((resolve, reject) => {\n if (!this.web_key) {\n reject('kakao_sdk_not_initialzed');\n return;\n }\n try {\n const KakaoSdk = window['Kakao'];\n if (KakaoSdk && KakaoSdk.Link) {\n // SDK 2.0: sendDefault()는 Promise를 반환할 수 있음\n const sendResult = KakaoSdk.Link.sendDefault({\n objectType: 'feed',\n content: {\n title: options.title,\n description: options.description,\n imageUrl: options.image_url,\n link: {\n mobileWebUrl: options.image_link_url,\n },\n },\n buttons: [\n {\n title: options.button_title,\n link: {\n mobileWebUrl: options.image_link_url,\n },\n },\n ],\n });\n if (sendResult && typeof sendResult.then === 'function') {\n // Promise 기반 API\n sendResult\n .then(() => {\n resolve({ value: 'done' });\n })\n .catch((error) => {\n console.error('Kakao Link Send Failed', error);\n reject(error);\n });\n }\n else {\n // 콜백 방식 (하위 호환성)\n if (typeof sendResult === 'object' && sendResult.callback) {\n sendResult.callback = function () {\n resolve({ value: 'done' });\n };\n }\n else {\n // 콜백이 없는 경우 직접 resolve\n resolve({ value: 'done' });\n }\n }\n }\n else {\n reject(new Error('Kakao SDK not initialized'));\n }\n }\n catch (e) {\n console.error('Error during Kakao link send', e);\n reject(e);\n }\n });\n }\n async getAccessTokenFromCode(code) {\n const tokenUrl = 'https://kauth.kakao.com/oauth/token';\n const redirectUri = window.location.origin + '/login-kakao-callback';\n const params = new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: this.web_key,\n redirect_uri: redirectUri,\n code: code,\n });\n try {\n const response = await fetch(tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: params.toString(),\n });\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n const tokenData = await response.json();\n if (tokenData.error) {\n throw new Error(`Kakao token error: ${tokenData.error_description || tokenData.error}`);\n }\n return tokenData.access_token;\n }\n catch (error) {\n console.error('Error exchanging code for token:', error);\n throw error;\n }\n }\n removeKakaoSdk() {\n const script = document.getElementById(this.kakaoScriptId);\n if (script) {\n document.head.removeChild(script); // Remove the script from the DOM\n console.log('Kakao SDK removed');\n }\n }\n loadKakaoSdk() {\n return new Promise((resolve, reject) => {\n // Check if the script is already loaded\n if (document.getElementById(this.kakaoScriptId)) {\n resolve();\n return;\n }\n const script = document.createElement('script');\n script.id = this.kakaoScriptId; // Set an ID to reference this script\n // SDK 2.x - Kakao.Auth.authorize() 리다이렉트 방식 사용\n script.src = 'https://t1.kakaocdn.net/kakao_js_sdk/2.7.7/kakao.min.js';\n // script.integrity = 'sha384-DKYJZ8NLiK8MN4/C5P2dtSmLQ4KwPaoqAfyA/DfmEc1VDxu4yyC7wy6K1Hs90nka';\n // script.crossOrigin = 'anonymous';\n script.onload = () => {\n console.log('Kakao SDK loaded');\n resolve();\n };\n script.onerror = () => reject(new Error('Failed to load Kakao SDK'));\n document.head.appendChild(script);\n });\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}
|