@package-kr/react-native-kakao-signin 0.0.1

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Package.kr
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,313 @@
1
+ <div align="center">
2
+
3
+ # @package-kr/react-native-kakao-signin
4
+
5
+ [![npm](https://img.shields.io/npm/v/@package-kr/react-native-kakao-signin)](https://www.npmjs.com/package/@package-kr/react-native-kakao-signin)
6
+ [![npm downloads](https://img.shields.io/npm/dm/@package-kr/react-native-kakao-signin)](https://www.npmjs.com/package/@package-kr/react-native-kakao-signin)
7
+ ![license](https://img.shields.io/badge/license-MIT-blue)
8
+
9
+ ![iOS](https://img.shields.io/badge/iOS-13%2B-black?logo=apple&logoColor=white&labelColor=000000)
10
+ ![Android](https://img.shields.io/badge/Android-API%2024%2B-3DDC84?logo=android&logoColor=white&labelColor=3DDC84)
11
+
12
+ React Native 전용 카카오 로그인 라이브러리 입니다.
13
+
14
+ <p align="center">
15
+ <img src="./docs/images/kakao-console/preview1.png" width="45%" />
16
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
17
+ <img src="./docs/images/kakao-console/preview2.png" width="45%" />
18
+ </p>
19
+
20
+ </div>
21
+
22
+ ## Getting started
23
+
24
+ 해당 라이브러리는 React Native `0.68` 이상을 지원합니다.<br/><br/>
25
+ `TurboModule` 기반으로 구현되어 있어 `New Architecture`를 지원하며,<br/>
26
+ `Auto Linking`이 적용되어 있어 별도 네이티브 모듈 연결 작업이 필요 없습니다.<br/>
27
+
28
+ RN Expo와 v0.68 미만은 추후 지원 예정입니다.
29
+
30
+ ## Prerequisites
31
+
32
+ 라이브러리를 사용하려면 먼저 [카카오 개발자 콘솔](./docs/KAKAO_CONSOLE_SETUP.md)에서 앱 등록과 플랫폼 설정을 완료해야 합니다.
33
+
34
+ ## Installation
35
+
36
+ ```sh
37
+ npm install @package-kr/react-native-kakao-signin
38
+ ```
39
+
40
+ ## iOS
41
+
42
+ ### 1. Info.plist 설정
43
+
44
+ `ios/{ProjectName}/Info.plist`에서 `{KAKAO_APP_KEY}` 부분을 카카오 네이티브 앱 키로 교체해주세요.
45
+
46
+ <details>
47
+ <summary>복사용</summary>
48
+
49
+ ```xml
50
+ <key>CFBundleURLTypes</key>
51
+ <array>
52
+ <dict>
53
+ <key>CFBundleTypeRole</key>
54
+ <string>Editor</string>
55
+ <key>CFBundleURLName</key>
56
+ <string>KAKAO</string>
57
+ <key>CFBundleURLSchemes</key>
58
+ <array>
59
+ <string>kakao{KAKAO_APP_KEY}</string>
60
+ </array>
61
+ </dict>
62
+ </array>
63
+ <key>CFBundleVersion</key>
64
+ <string>$(CURRENT_PROJECT_VERSION)</string>
65
+ <key>KAKAO_APP_KEY</key>
66
+ <string>{KAKAO_APP_KEY}</string>
67
+ <key>LSApplicationQueriesSchemes</key>
68
+ <array>
69
+ <string>kakao{KAKAO_APP_KEY}</string>
70
+ <string>kakaokompassauth</string>
71
+ <string>kakaotalk</string>
72
+ </array>
73
+ ```
74
+
75
+ </details>
76
+
77
+ ```diff
78
+ <!-- Info.plist -->
79
+ <key>CFBundleURLTypes</key>
80
+ <array>
81
+ + <dict>
82
+ + <key>CFBundleTypeRole</key>
83
+ + <string>Editor</string>
84
+ + <key>CFBundleURLName</key>
85
+ + <string>KAKAO</string>
86
+ + <key>CFBundleURLSchemes</key>
87
+ + <array>
88
+ + <string>kakao{KAKAO_APP_KEY}</string>
89
+ + </array>
90
+ + </dict>
91
+ </array>
92
+ <key>CFBundleVersion</key>
93
+ <string>$(CURRENT_PROJECT_VERSION)</string>
94
+ + <key>KAKAO_APP_KEY</key>
95
+ + <string>{KAKAO_APP_KEY}</string>
96
+ + <key>LSApplicationQueriesSchemes</key>
97
+ + <array>
98
+ + <string>kakaoa{KAKAO_APP_KEY}</string>
99
+ + <string>kakaokompassauth</string>
100
+ + <string>kakaotalk</string>
101
+ + </array>
102
+ ```
103
+
104
+ ### 2. CocoaPods 설치
105
+
106
+ ```sh
107
+ cd ios && pod install
108
+ ```
109
+
110
+ ## Android
111
+
112
+ ### 1. Redirect URI 설정
113
+
114
+ `app/src/main/AndroidManifest.xml`에 카카오 리다이렉트 액티비티를 추가합니다.<br/>
115
+ `{KAKAO_APP_KEY}` 부분을 카카오 네이티브 앱 키로 교체해주세요.
116
+
117
+ 사용자 휴대폰에 카카오 앱이 설치되어 있을 경우 로그인 후 앱으로 돌아오기 위한 설정입니다.<br/>
118
+ Android 12(API 31) 이상을 타깃하는 경우 `android:exported="true"` 를 반드시 선언해주셔야 합니다.
119
+
120
+ ```xml
121
+ <!-- AndroidManifest.xml -->
122
+ <activity
123
+ android:name="com.kakao.sdk.auth.AuthCodeHandlerActivity"
124
+ android:exported="true">
125
+ <intent-filter>
126
+ <action android:name="android.intent.action.VIEW" />
127
+ <category android:name="android.intent.category.DEFAULT" />
128
+ <category android:name="android.intent.category.BROWSABLE" />
129
+ <data android:host="oauth" android:scheme="kakao{KAKAO_APP_KEY}" />
130
+ </intent-filter>
131
+ </activity>
132
+ ```
133
+
134
+ ### 2. 카카오 앱 키 설정
135
+
136
+ `app/src/main/res/values/strings.xml`에 카카오 앱 키를 추가합니다.<br/>
137
+ 카카오 SDK가 앱 키를 자동으로 읽어오기 위한 설정입니다.
138
+
139
+ ```diff
140
+ <resources>
141
+ <string name="app_name">YourAppName</string>
142
+ + <string name="kakao_app_key">{KAKAO_APP_KEY}</string>
143
+ </resources>
144
+ ```
145
+
146
+ ## Usage
147
+
148
+ 더 많은 사용 예제는 [KakaoLoginExample](https://github.com/Package-KR/react-native-kakao-signin/tree/main/KakaoLoginExample) 프로젝트를 참고해주세요.
149
+
150
+ ```ts
151
+ import {
152
+ login,
153
+ loginWithKakaoAccount,
154
+ logout,
155
+ unlink,
156
+ getProfile,
157
+ getAccessToken,
158
+ shippingAddresses,
159
+ serviceTerms,
160
+ } from '@package-kr/react-native-kakao-signin';
161
+
162
+ // 카카오톡으로 로그인 (카카오톡 미설치 시 카카오계정으로 자동 전환)
163
+ const token = await login();
164
+
165
+ // 카카오계정으로 로그인
166
+ const token = await loginWithKakaoAccount();
167
+
168
+ // 로그아웃
169
+ await logout();
170
+
171
+ // 연결 해제
172
+ await unlink();
173
+
174
+ // 프로필 조회
175
+ const profile = await getProfile();
176
+
177
+ // 토큰 조회
178
+ const token = await getAccessToken();
179
+
180
+ // 배송주소 조회
181
+ const addresses = await shippingAddresses();
182
+
183
+ // 서비스 약관 조회
184
+ const terms = await serviceTerms();
185
+ ```
186
+
187
+ ---
188
+
189
+ ## Methods
190
+
191
+ | 메서드 | 설명 | Returns |
192
+ | ------------------------- | ------------------------------------------------------------------------------------ | --------------------------------- |
193
+ | `login()` | 카카오톡으로 로그인합니다. 카카오톡 미설치 시 카카오계정 로그인으로 자동 전환됩니다. | `Promise<KakaoOAuthToken>` |
194
+ | `loginWithKakaoAccount()` | 카카오계정으로 로그인합니다. | `Promise<KakaoOAuthToken>` |
195
+ | `logout()` | 로그아웃합니다. | `Promise<string>` |
196
+ | `unlink()` | 카카오 계정 연결을 해제합니다. | `Promise<string>` |
197
+ | `getProfile()` | 사용자 프로필을 조회합니다. | `Promise<KakaoProfile>` |
198
+ | `getAccessToken()` | 현재 저장된 액세스 토큰을 조회합니다. | `Promise<KakaoAccessTokenInfo>` |
199
+ | `shippingAddresses()` | 사용자 배송주소 목록을 조회합니다. | `Promise<KakaoShippingAddresses>` |
200
+ | `serviceTerms()` | 서비스 약관 동의 내역을 조회합니다. | `Promise<KakaoServiceTerms>` |
201
+
202
+ ---
203
+
204
+ ## Types
205
+
206
+ ### `KakaoOAuthToken`
207
+
208
+ | 필드 | 타입 | 설명 |
209
+ | ----------------------- | ------------------ | ------------------------ |
210
+ | `accessToken` | `string` | 액세스 토큰 |
211
+ | `refreshToken` | `string` | 리프레시 토큰 |
212
+ | `idToken` | `string \| null` | ID 토큰 (OpenID Connect) |
213
+ | `accessTokenExpiresAt` | `string` | 액세스 토큰 만료 시각 |
214
+ | `refreshTokenExpiresAt` | `string` | 리프레시 토큰 만료 시각 |
215
+ | `scopes` | `string[] \| null` | 인증된 스코프 목록 |
216
+
217
+ ### `KakaoProfile`
218
+
219
+ | 필드 | 타입 | 설명 |
220
+ | ------------------------------- | ----------------- | --------------------------------- |
221
+ | `id` | `number \| null` | 사용자 ID |
222
+ | `nickname` | `string \| null` | 닉네임 |
223
+ | `name` | `string \| null` | 이름 |
224
+ | `email` | `string \| null` | 이메일 |
225
+ | `profileImageUrl` | `string \| null` | 프로필 이미지 URL |
226
+ | `thumbnailImageUrl` | `string \| null` | 프로필 썸네일 이미지 URL |
227
+ | `gender` | `string \| null` | 성별 |
228
+ | `ageRange` | `string \| null` | 연령대 |
229
+ | `birthday` | `string \| null` | 생일 (MMDD) |
230
+ | `birthdayType` | `string \| null` | 생일 타입 (SOLAR/LUNAR) |
231
+ | `birthyear` | `string \| null` | 출생 연도 |
232
+ | `phoneNumber` | `string \| null` | 전화번호 |
233
+ | `isEmailValid` | `boolean \| null` | 이메일 유효 여부 |
234
+ | `isEmailVerified` | `boolean \| null` | 이메일 인증 여부 |
235
+ | `isKorean` | `boolean \| null` | 한국인 여부 |
236
+ | `hasEmail` | `boolean \| null` | 이메일 보유 여부 |
237
+ | `hasPhoneNumber` | `boolean \| null` | 전화번호 보유 여부 |
238
+ | `hasBirthday` | `boolean \| null` | 생일 보유 여부 |
239
+ | `hasBirthyear` | `boolean \| null` | 출생 연도 보유 여부 |
240
+ | `hasAgeRange` | `boolean \| null` | 연령대 보유 여부 |
241
+ | `hasGender` | `boolean \| null` | 성별 보유 여부 |
242
+ | `isDefaultImage` | `boolean \| null` | 기본 프로필 이미지 여부 |
243
+ | `isDefaultNickname` | `boolean \| null` | 기본 닉네임 여부 |
244
+ | `connectedAt` | `string \| null` | 서비스 연결 시각 |
245
+ | `synchedAt` | `string \| null` | 카카오싱크 로그인 시각 |
246
+ | `isLeapMonth` | `boolean \| null` | 생일 윤달 여부 |
247
+ | `ci` | `string \| null` | 연계정보 |
248
+ | `ciAuthenticatedAt` | `string \| null` | CI 발급 시각 |
249
+ | `emailNeedsAgreement` | `boolean \| null` | 이메일 제공 동의 필요 여부 |
250
+ | `profileNeedsAgreement` | `boolean \| null` | 프로필 제공 동의 필요 여부 |
251
+ | `phoneNumberNeedsAgreement` | `boolean \| null` | 전화번호 제공 동의 필요 여부 |
252
+ | `genderNeedsAgreement` | `boolean \| null` | 성별 제공 동의 필요 여부 |
253
+ | `ageRangeNeedsAgreement` | `boolean \| null` | 연령대 제공 동의 필요 여부 |
254
+ | `birthdayNeedsAgreement` | `boolean \| null` | 생일 제공 동의 필요 여부 |
255
+ | `birthyearNeedsAgreement` | `boolean \| null` | 출생 연도 제공 동의 필요 여부 |
256
+ | `isKoreanNeedsAgreement` | `boolean \| null` | 한국인 여부 제공 동의 필요 여부 |
257
+ | `profileNicknameNeedsAgreement` | `boolean \| null` | 닉네임 제공 동의 필요 여부 |
258
+ | `profileImageNeedsAgreement` | `boolean \| null` | 프로필 이미지 제공 동의 필요 여부 |
259
+ | `nameNeedsAgreement` | `boolean \| null` | 이름 제공 동의 필요 여부 |
260
+ | `ciNeedsAgreement` | `boolean \| null` | CI 제공 동의 필요 여부 |
261
+
262
+ ### `KakaoAccessTokenInfo`
263
+
264
+ | 필드 | 타입 | 설명 |
265
+ | ------------- | -------- | ----------------------- |
266
+ | `accessToken` | `string` | 액세스 토큰 |
267
+ | `expiresIn` | `string` | 만료까지 남은 시간 (초) |
268
+
269
+ ### `KakaoShippingAddresses`
270
+
271
+ | 필드 | 타입 | 설명 |
272
+ | ------------------- | ------------------------ | -------------- |
273
+ | `userId` | `string` | 사용자 ID |
274
+ | `needsAgreement` | `boolean` | 동의 필요 여부 |
275
+ | `shippingAddresses` | `KakaoShippingAddress[]` | 배송주소 목록 |
276
+
277
+ ### `KakaoShippingAddress`
278
+
279
+ | 필드 | 타입 | 설명 |
280
+ | ---------------------- | --------- | ----------------- |
281
+ | `id` | `string` | 배송주소 ID |
282
+ | `name` | `string` | 배송지명 |
283
+ | `isDefault` | `boolean` | 기본 배송지 여부 |
284
+ | `updatedAt` | `string` | 수정 시각 |
285
+ | `type` | `string` | 배송지 타입 |
286
+ | `baseAddress` | `string` | 기본 주소 |
287
+ | `detailAddress` | `string` | 상세 주소 |
288
+ | `receiverName` | `string` | 수령인 이름 |
289
+ | `receiverPhoneNumber1` | `string` | 수령인 전화번호 1 |
290
+ | `receiverPhoneNumber2` | `string` | 수령인 전화번호 2 |
291
+ | `zoneNumber` | `string` | 우편번호 |
292
+ | `zipCode` | `string` | 구 우편번호 |
293
+
294
+ ### `KakaoServiceTerms`
295
+
296
+ | 필드 | 타입 | 설명 |
297
+ | -------------- | -------------------- | ---------------- |
298
+ | `userId` | `string` | 사용자 ID |
299
+ | `serviceTerms` | `KakaoServiceTerm[]` | 서비스 약관 목록 |
300
+
301
+ ### `KakaoServiceTerm`
302
+
303
+ | 필드 | 타입 | 설명 |
304
+ | ----------- | --------------------- | -------------- |
305
+ | `tag` | `string` | 약관 태그 |
306
+ | `agreed` | `boolean` | 동의 여부 |
307
+ | `required` | `boolean` | 필수 여부 |
308
+ | `revocable` | `boolean` | 철회 가능 여부 |
309
+ | `agreedAt` | `string \| undefined` | 동의 시각 |
310
+
311
+ ## 라이선스
312
+
313
+ MIT
@@ -0,0 +1,60 @@
1
+ // 호스트 앱 설정값 조회 (없으면 기본값 사용)
2
+ def getExtOrDefault(name, defaultValue) {
3
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : defaultValue
4
+ }
5
+
6
+ // Android 라이브러리 플러그인 (TurboModule 포함)
7
+ apply plugin: "com.android.library"
8
+ apply plugin: "org.jetbrains.kotlin.android"
9
+ apply plugin: "com.facebook.react"
10
+
11
+ // TurboModule 코드젠 설정
12
+ react {
13
+ jsRootDir = file("../src")
14
+ libraryName = "RNKakaoSigninSpec"
15
+ codegenJavaPackageName = "com.packagekr.kakao"
16
+ }
17
+
18
+ // Android 빌드 설정
19
+ android {
20
+ namespace "com.packagekr.kakao"
21
+ compileSdkVersion getExtOrDefault("compileSdkVersion", 36)
22
+
23
+ defaultConfig {
24
+ minSdkVersion getExtOrDefault("minSdkVersion", 24)
25
+ targetSdkVersion getExtOrDefault("targetSdkVersion", 36)
26
+ }
27
+
28
+ compileOptions {
29
+ sourceCompatibility JavaVersion.VERSION_17
30
+ targetCompatibility JavaVersion.VERSION_17
31
+ }
32
+
33
+ kotlinOptions {
34
+ jvmTarget = "17"
35
+ }
36
+ }
37
+
38
+ // 기본 저장소
39
+ repositories {
40
+ google()
41
+ mavenCentral()
42
+ }
43
+
44
+ // 카카오 SDK 저장소
45
+ rootProject.allprojects {
46
+ repositories {
47
+ maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/' }
48
+ }
49
+ }
50
+
51
+ // 의존성
52
+ dependencies {
53
+ def kakaoVersion = getExtOrDefault("kakaoSdkVersion", "2.22.0")
54
+
55
+ implementation "com.facebook.react:react-native:+"
56
+ implementation "org.jetbrains.kotlin:kotlin-stdlib:${getExtOrDefault("kotlinVersion", "2.1.20")}"
57
+
58
+ implementation "com.kakao.sdk:v2-user:${kakaoVersion}"
59
+ implementation "com.kakao.sdk:v2-talk:${kakaoVersion}"
60
+ }
@@ -0,0 +1,4 @@
1
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android">
2
+ <uses-permission android:name="android.permission.INTERNET" />
3
+ <application />
4
+ </manifest>