@react-native-kakao/cert 0.0.0-stage → 3.1.0-next.2
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/CHANGELOG.md +46 -0
- package/LICENSE +20 -0
- package/README.md +6 -2
- package/RNCKakaoCert.podspec +25 -0
- package/android/build.gradle +43 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/java/net/mjstudio/rnkakao/cert/RNCKakaoCertModule.kt +292 -0
- package/android/src/main/java/net/mjstudio/rnkakao/cert/RNCKakaoCertPackage.kt +34 -0
- package/ios/RNCKakaoCert.h +4 -0
- package/ios/RNCKakaoCert.mm +80 -0
- package/ios/RNCKakaoCertManager.swift +327 -0
- package/ios/RNCKakaoCertUtil.h +8 -0
- package/ios/RNCKakaoCertUtil.mm +17 -0
- package/lib/commonjs/index.js +126 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/index.web.js +73 -0
- package/lib/commonjs/index.web.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/spec/NativeKakaoCert.ts +30 -0
- package/lib/module/index.js +108 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/index.web.js +56 -0
- package/lib/module/index.web.js.map +1 -0
- package/lib/module/spec/NativeKakaoCert.ts +30 -0
- package/lib/typescript/src/index.d.ts +127 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/spec/NativeKakaoCert.d.ts +20 -0
- package/lib/typescript/src/spec/NativeKakaoCert.d.ts.map +1 -0
- package/package.json +96 -3
- package/src/index.ts +196 -0
- package/src/index.web.ts +64 -0
- package/src/spec/NativeKakaoCert.ts +30 -0
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import KakaoSDKAuth
|
|
3
|
+
import KakaoSDKCert
|
|
4
|
+
import KakaoSDKCommon
|
|
5
|
+
import React
|
|
6
|
+
import RNCKakaoCore
|
|
7
|
+
|
|
8
|
+
private let transactionIdKey = "txId"
|
|
9
|
+
|
|
10
|
+
@objc public class RNCKakaoCertManager: NSObject {
|
|
11
|
+
@objc public static let shared = RNCKakaoCertManager()
|
|
12
|
+
private var activeTalkSignature: UUID?
|
|
13
|
+
|
|
14
|
+
@objc public static func isKakaoTalkSignReturnUrl(_ url: URL) -> Bool {
|
|
15
|
+
CertApi.isKakaoTalkSignReturnUrl(url)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
@objc public static func handleOpenUrl(_ url: URL) -> Bool {
|
|
19
|
+
CertApi.handleOpenUrl(url: url)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
@objc public func certLoginWithKakaoTalk(
|
|
23
|
+
_ options: [String: Any],
|
|
24
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
25
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
26
|
+
) {
|
|
27
|
+
login(options, isTalk: true, resolve: resolve, reject: reject)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
@objc public func certLoginWithKakaoAccount(
|
|
31
|
+
_ options: [String: Any],
|
|
32
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
33
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
34
|
+
) {
|
|
35
|
+
login(options, isTalk: false, resolve: resolve, reject: reject)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
@objc public func issueCertTokenWithCode(
|
|
39
|
+
_ code: String,
|
|
40
|
+
codeVerifier: String?,
|
|
41
|
+
redirectUri: String?,
|
|
42
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
43
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
44
|
+
) {
|
|
45
|
+
onMain { [self] in
|
|
46
|
+
guard let _ = try? KakaoSDK.shared.appKey() else {
|
|
47
|
+
RNCKakaoUtil.reject(reject, RNCKakaoError.sdkNotInitialized)
|
|
48
|
+
return
|
|
49
|
+
}
|
|
50
|
+
AuthApi.shared.certToken(
|
|
51
|
+
code: code,
|
|
52
|
+
codeVerifier: codeVerifier,
|
|
53
|
+
redirectUri: redirectUri ?? KakaoSDK.shared.redirectUri(),
|
|
54
|
+
completion: tokenCallback(resolve, reject: reject)
|
|
55
|
+
)
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
private func login(
|
|
60
|
+
_ options: [String: Any],
|
|
61
|
+
isTalk: Bool,
|
|
62
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
63
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
64
|
+
) {
|
|
65
|
+
withCertType(options["certType"] as? String ?? "", reject: reject) { certType in
|
|
66
|
+
guard isTalk || certType == .K2100 else {
|
|
67
|
+
RNCKakaoUtil.reject(reject, SdkError(reason: .BadParameter))
|
|
68
|
+
return
|
|
69
|
+
}
|
|
70
|
+
let prompts = (options["prompts"] as? [String])?.compactMap { value -> Prompt? in
|
|
71
|
+
switch value {
|
|
72
|
+
case "Login": .Login
|
|
73
|
+
case "Create": .Create
|
|
74
|
+
case "SelectAccount": .SelectAccount
|
|
75
|
+
default: nil
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
let identifyItems = (options["identifyItems"] as? [String])?
|
|
79
|
+
.compactMap(IdentifyItem.init(rawValue:))
|
|
80
|
+
let signData = options["signData"] as? String
|
|
81
|
+
let settleId = options["settleId"] as? String
|
|
82
|
+
let nonce = options["nonce"] as? String
|
|
83
|
+
let callback = self.tokenCallback(resolve, reject: reject)
|
|
84
|
+
if isTalk {
|
|
85
|
+
let ios = options["ios"] as? [String: Any]
|
|
86
|
+
CertApi.shared.certLoginWithKakaoTalk(
|
|
87
|
+
certType: certType,
|
|
88
|
+
txId: options[transactionIdKey] as? String,
|
|
89
|
+
launchMethod: ios?["launchMethod"] as? String == "CustomScheme" ? .CustomScheme :
|
|
90
|
+
.UniversalLink,
|
|
91
|
+
prompts: prompts,
|
|
92
|
+
channelPublicIds: options["channelPublicIds"] as? [String],
|
|
93
|
+
serviceTerms: options["serviceTerms"] as? [String],
|
|
94
|
+
signData: signData,
|
|
95
|
+
nonce: nonce,
|
|
96
|
+
settleId: settleId,
|
|
97
|
+
identifyItems: identifyItems,
|
|
98
|
+
completion: callback
|
|
99
|
+
)
|
|
100
|
+
} else {
|
|
101
|
+
CertApi.shared.certLoginWithKakaoAccount(
|
|
102
|
+
certType: certType,
|
|
103
|
+
prompts: prompts,
|
|
104
|
+
loginHint: options["loginHint"] as? String,
|
|
105
|
+
signData: signData,
|
|
106
|
+
nonce: nonce,
|
|
107
|
+
settleId: settleId,
|
|
108
|
+
identifyItems: identifyItems,
|
|
109
|
+
completion: callback
|
|
110
|
+
)
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
@objc public func publicKey(
|
|
116
|
+
_ certType: String,
|
|
117
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
118
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
119
|
+
) {
|
|
120
|
+
withCertType(certType, reject: reject) { resolve(CertApi.shared.publicKey(certType: $0)) }
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
@objc public func sessionInfo(
|
|
124
|
+
_ certType: String,
|
|
125
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
126
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
127
|
+
) {
|
|
128
|
+
withCertType(certType, reject: reject) { type in
|
|
129
|
+
if let info = CertApi.shared.sessionInfo(certType: type) {
|
|
130
|
+
resolve(self.mapSession(info))
|
|
131
|
+
} else {
|
|
132
|
+
resolve(nil)
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
@objc public func fetchSessionInfo(
|
|
138
|
+
_ certType: String,
|
|
139
|
+
txId: String,
|
|
140
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
141
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
142
|
+
) {
|
|
143
|
+
withCertType(certType, reject: reject) { type in
|
|
144
|
+
CertApi.shared.sessionInfo(
|
|
145
|
+
certType: type,
|
|
146
|
+
txId: txId,
|
|
147
|
+
completion: self.sessionCallback(resolve, reject: reject)
|
|
148
|
+
)
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
@objc public func fetchSessionInfoByAppKey(
|
|
153
|
+
_ certType: String,
|
|
154
|
+
txId: String,
|
|
155
|
+
targetAppKey: String?,
|
|
156
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
157
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
158
|
+
) {
|
|
159
|
+
withCertType(certType, reject: reject) { type in
|
|
160
|
+
CertApi.shared.sessionInfoByAppKey(
|
|
161
|
+
certType: type,
|
|
162
|
+
txId: txId,
|
|
163
|
+
targetAppKey: targetAppKey,
|
|
164
|
+
completion: self.sessionCallback(resolve, reject: reject)
|
|
165
|
+
)
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
@objc public func isValidSession(
|
|
170
|
+
_ certType: String,
|
|
171
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
172
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
173
|
+
) {
|
|
174
|
+
withCertType(certType, reject: reject) { resolve(CertApi.shared.isValidSession(certType: $0)) }
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
@objc public func deleteKeyPair(
|
|
178
|
+
_ certType: String,
|
|
179
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
180
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
181
|
+
) {
|
|
182
|
+
withCertType(certType, reject: reject) { type in
|
|
183
|
+
CertApi.shared.deleteKeyPair(certType: type)
|
|
184
|
+
resolve(nil)
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
@objc public func reducedSign(
|
|
189
|
+
_ certType: String,
|
|
190
|
+
data: String,
|
|
191
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
192
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
193
|
+
) {
|
|
194
|
+
withCertType(certType, reject: reject) { type in
|
|
195
|
+
CertApi.shared.reducedSign(certType: type, data: data) { signature, error in
|
|
196
|
+
if let error {
|
|
197
|
+
RNCKakaoUtil.reject(reject, error)
|
|
198
|
+
} else if let signature {
|
|
199
|
+
resolve(signature)
|
|
200
|
+
} else {
|
|
201
|
+
RNCKakaoUtil.reject(reject, RNCKakaoError.responseNotFound(name: "signature"))
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
@objc public func isKakaoTalkSignAvailable(
|
|
208
|
+
_ resolve: @escaping RCTPromiseResolveBlock,
|
|
209
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
210
|
+
) {
|
|
211
|
+
onMain { resolve(CertApi.isKakaoTalkSignAvailable()) }
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
@objc public func signWithKakaoTalk(
|
|
215
|
+
_ txId: String,
|
|
216
|
+
targetAppKey: String?,
|
|
217
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
218
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
219
|
+
) {
|
|
220
|
+
onMain {
|
|
221
|
+
guard self.activeTalkSignature == nil else {
|
|
222
|
+
RNCKakaoUtil.reject(
|
|
223
|
+
reject,
|
|
224
|
+
SdkError(
|
|
225
|
+
reason: .BadParameter,
|
|
226
|
+
message: "A KakaoTalk signature request is already in progress."
|
|
227
|
+
)
|
|
228
|
+
)
|
|
229
|
+
return
|
|
230
|
+
}
|
|
231
|
+
let requestId = UUID()
|
|
232
|
+
self.activeTalkSignature = requestId
|
|
233
|
+
CertApi.shared
|
|
234
|
+
.signWithKakaoTalk(
|
|
235
|
+
certType: .K3220,
|
|
236
|
+
txId: txId,
|
|
237
|
+
targetAppKey: targetAppKey
|
|
238
|
+
) { status, error in
|
|
239
|
+
onMain {
|
|
240
|
+
guard self.activeTalkSignature == requestId else { return }
|
|
241
|
+
self.activeTalkSignature = nil
|
|
242
|
+
CertApi.shared.certWithTalkCompletionHandler = nil
|
|
243
|
+
if let error {
|
|
244
|
+
RNCKakaoUtil.reject(reject, error)
|
|
245
|
+
} else if let status {
|
|
246
|
+
resolve([
|
|
247
|
+
transactionIdKey: status.txId,
|
|
248
|
+
"requestedAt": status.requestedAt?.timeIntervalSince1970 as Any,
|
|
249
|
+
"requestExpiredAt": status.requestExpiredAt?.timeIntervalSince1970 as Any,
|
|
250
|
+
"signedAt": status.signedAt?.timeIntervalSince1970 as Any
|
|
251
|
+
])
|
|
252
|
+
} else {
|
|
253
|
+
RNCKakaoUtil.reject(reject, RNCKakaoError.responseNotFound(name: "signStatusInfo"))
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
private func withCertType(
|
|
261
|
+
_ value: String,
|
|
262
|
+
reject: @escaping RCTPromiseRejectBlock,
|
|
263
|
+
operation: @escaping (CertType) -> Void
|
|
264
|
+
) {
|
|
265
|
+
guard let type = CertType(rawValue: value.lowercased()) else {
|
|
266
|
+
RNCKakaoUtil.reject(reject, SdkError(reason: .BadParameter))
|
|
267
|
+
return
|
|
268
|
+
}
|
|
269
|
+
onMain { operation(type) }
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
private func sessionCallback(
|
|
273
|
+
_ resolve: @escaping RCTPromiseResolveBlock,
|
|
274
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
275
|
+
) -> (SessionInfo?, Error?) -> Void {
|
|
276
|
+
{ info, error in
|
|
277
|
+
if let error {
|
|
278
|
+
RNCKakaoUtil.reject(reject, error)
|
|
279
|
+
} else if let info {
|
|
280
|
+
resolve(self.mapSession(info))
|
|
281
|
+
} else {
|
|
282
|
+
RNCKakaoUtil.reject(reject, RNCKakaoError.responseNotFound(name: "sessionInfo"))
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
private func mapSession(_ info: SessionInfo) -> [String: Any] {
|
|
288
|
+
[
|
|
289
|
+
"userId": info.userId as Any,
|
|
290
|
+
"sessionStartAt": info.sessionStartAt.timeIntervalSince1970,
|
|
291
|
+
"sessionEndAt": info.sessionEndAt.timeIntervalSince1970
|
|
292
|
+
]
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
private func tokenCallback(
|
|
296
|
+
_ resolve: @escaping RCTPromiseResolveBlock,
|
|
297
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
298
|
+
) -> (CertTokenInfo?, Error?) -> Void {
|
|
299
|
+
{ info, error in
|
|
300
|
+
if let error {
|
|
301
|
+
RNCKakaoUtil.reject(reject, error)
|
|
302
|
+
} else if let info {
|
|
303
|
+
resolve([transactionIdKey: info.txId, "token": self.mapToken(info.token)])
|
|
304
|
+
} else {
|
|
305
|
+
RNCKakaoUtil.reject(reject, RNCKakaoError.responseNotFound(name: "certTokenInfo"))
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
private func mapToken(_ token: OAuthToken) -> [String: Any] {
|
|
311
|
+
let now = Date()
|
|
312
|
+
var result: [String: Any] = [
|
|
313
|
+
"accessToken": token.accessToken,
|
|
314
|
+
"refreshToken": token.refreshToken,
|
|
315
|
+
"tokenType": token.tokenType,
|
|
316
|
+
"accessTokenExpiresAt": token.expiredAt.timeIntervalSince1970,
|
|
317
|
+
"refreshTokenExpiresAt": token.refreshTokenExpiredAt.timeIntervalSince1970,
|
|
318
|
+
"accessTokenExpiresIn": token.expiredAt.timeIntervalSince(now),
|
|
319
|
+
"refreshTokenExpiresIn": token.refreshTokenExpiredAt.timeIntervalSince(now),
|
|
320
|
+
"scopes": token.scopes ?? []
|
|
321
|
+
]
|
|
322
|
+
if let idToken = token.idToken {
|
|
323
|
+
result["idToken"] = idToken
|
|
324
|
+
}
|
|
325
|
+
return result
|
|
326
|
+
}
|
|
327
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#import "RNCKakaoCertUtil.h"
|
|
2
|
+
#import <React/RCTBridgeModule.h>
|
|
3
|
+
|
|
4
|
+
#if __has_include("RNCKakaoCert-Swift.h")
|
|
5
|
+
#import "RNCKakaoCert-Swift.h"
|
|
6
|
+
#else
|
|
7
|
+
#import <RNCKakaoCert/RNCKakaoCert-Swift.h>
|
|
8
|
+
#endif
|
|
9
|
+
|
|
10
|
+
@implementation RNCKakaoCertUtil
|
|
11
|
+
+ (BOOL)isKakaoTalkSignReturnUrl:(NSURL*)url {
|
|
12
|
+
return [RNCKakaoCertManager isKakaoTalkSignReturnUrl:url];
|
|
13
|
+
}
|
|
14
|
+
+ (BOOL)handleOpenUrl:(NSURL*)url {
|
|
15
|
+
return [RNCKakaoCertManager handleOpenUrl:url];
|
|
16
|
+
}
|
|
17
|
+
@end
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.authorizeForCertWeb = authorizeForCertWeb;
|
|
7
|
+
exports.certLoginWithKakaoAccount = certLoginWithKakaoAccount;
|
|
8
|
+
exports.certLoginWithKakaoTalk = certLoginWithKakaoTalk;
|
|
9
|
+
exports.default = void 0;
|
|
10
|
+
exports.deleteKeyPair = deleteKeyPair;
|
|
11
|
+
exports.fetchSessionInfo = fetchSessionInfo;
|
|
12
|
+
exports.fetchSessionInfoByAppKey = fetchSessionInfoByAppKey;
|
|
13
|
+
exports.getPublicKey = getPublicKey;
|
|
14
|
+
exports.getSessionInfo = getSessionInfo;
|
|
15
|
+
exports.isKakaoTalkSignAvailable = isKakaoTalkSignAvailable;
|
|
16
|
+
exports.isValidSession = isValidSession;
|
|
17
|
+
exports.issueCertTokenWithCode = issueCertTokenWithCode;
|
|
18
|
+
exports.reducedSign = reducedSign;
|
|
19
|
+
exports.signWithKakaoTalk = signWithKakaoTalk;
|
|
20
|
+
var _core = require("@react-native-kakao/core");
|
|
21
|
+
var _NativeKakaoCert = _interopRequireDefault(require("./spec/NativeKakaoCert"));
|
|
22
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
23
|
+
const signerInformationItems = ['ci', 'name', 'birthday', 'phone_number'];
|
|
24
|
+
const certificationPrompts = ['Login', 'Create', 'SelectAccount'];
|
|
25
|
+
const accountCertType = 'K2100';
|
|
26
|
+
const minActivityRequestCode = -2147483648;
|
|
27
|
+
const maxActivityRequestCode = 2147483647;
|
|
28
|
+
async function certLoginWithKakaoTalk(options) {
|
|
29
|
+
validateLoginRequest(options);
|
|
30
|
+
const requestCode = options.android?.requestCode;
|
|
31
|
+
(0, _core.kAssert)(requestCode == null || Number.isInteger(requestCode) && requestCode >= minActivityRequestCode && requestCode <= maxActivityRequestCode, `[certLoginWithKakaoTalk] requestCode must be an integer from ${minActivityRequestCode} to ${maxActivityRequestCode}`);
|
|
32
|
+
return _NativeKakaoCert.default.certLoginWithKakaoTalk(options);
|
|
33
|
+
}
|
|
34
|
+
async function certLoginWithKakaoAccount(options) {
|
|
35
|
+
(0, _core.kAssert)(options.certType === accountCertType, '[certLoginWithKakaoAccount] certType must be K2100');
|
|
36
|
+
validateLoginRequest(options);
|
|
37
|
+
return _NativeKakaoCert.default.certLoginWithKakaoAccount(options);
|
|
38
|
+
}
|
|
39
|
+
async function issueCertTokenWithCode({
|
|
40
|
+
code,
|
|
41
|
+
codeVerifier,
|
|
42
|
+
redirectUri
|
|
43
|
+
}) {
|
|
44
|
+
(0, _core.kAssert)(typeof code === 'string' && code.length > 0, '[issueCertTokenWithCode] code is required');
|
|
45
|
+
return _NativeKakaoCert.default.issueCertTokenWithCode(code, codeVerifier, redirectUri);
|
|
46
|
+
}
|
|
47
|
+
async function getPublicKey({
|
|
48
|
+
certType
|
|
49
|
+
}) {
|
|
50
|
+
return (await _NativeKakaoCert.default.publicKey(certType)) ?? undefined;
|
|
51
|
+
}
|
|
52
|
+
async function getSessionInfo({
|
|
53
|
+
certType
|
|
54
|
+
}) {
|
|
55
|
+
return (await _NativeKakaoCert.default.sessionInfo(certType)) ?? undefined;
|
|
56
|
+
}
|
|
57
|
+
function fetchSessionInfo({
|
|
58
|
+
certType,
|
|
59
|
+
txId
|
|
60
|
+
}) {
|
|
61
|
+
return _NativeKakaoCert.default.fetchSessionInfo(certType, txId);
|
|
62
|
+
}
|
|
63
|
+
function fetchSessionInfoByAppKey({
|
|
64
|
+
certType,
|
|
65
|
+
txId,
|
|
66
|
+
targetAppKey
|
|
67
|
+
}) {
|
|
68
|
+
return _NativeKakaoCert.default.fetchSessionInfoByAppKey(certType, txId, targetAppKey);
|
|
69
|
+
}
|
|
70
|
+
function isValidSession({
|
|
71
|
+
certType
|
|
72
|
+
}) {
|
|
73
|
+
return _NativeKakaoCert.default.isValidSession(certType);
|
|
74
|
+
}
|
|
75
|
+
async function deleteKeyPair({
|
|
76
|
+
certType
|
|
77
|
+
}) {
|
|
78
|
+
await _NativeKakaoCert.default.deleteKeyPair(certType);
|
|
79
|
+
}
|
|
80
|
+
function reducedSign({
|
|
81
|
+
certType,
|
|
82
|
+
data
|
|
83
|
+
}) {
|
|
84
|
+
return _NativeKakaoCert.default.reducedSign(certType, data);
|
|
85
|
+
}
|
|
86
|
+
function isKakaoTalkSignAvailable() {
|
|
87
|
+
return _NativeKakaoCert.default.isKakaoTalkSignAvailable();
|
|
88
|
+
}
|
|
89
|
+
function signWithKakaoTalk({
|
|
90
|
+
txId,
|
|
91
|
+
targetAppKey
|
|
92
|
+
}) {
|
|
93
|
+
return _NativeKakaoCert.default.signWithKakaoTalk(txId, targetAppKey);
|
|
94
|
+
}
|
|
95
|
+
async function authorizeForCertWeb(_options) {
|
|
96
|
+
(0, _core.kCreateWebError)({
|
|
97
|
+
code: 'Package-UnsupportedPlatform',
|
|
98
|
+
message: 'authorizeForCertWeb is available on web only.'
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
function validateLoginRequest(options) {
|
|
102
|
+
(0, _core.kAssert)(options.prompts?.every(prompt => certificationPrompts.includes(prompt)) ?? true, '[cert login] unsupported prompt');
|
|
103
|
+
(0, _core.kAssert)(options.identifyItems?.every(item => signerInformationItems.includes(item)) ?? true, '[cert login] unsupported signer information');
|
|
104
|
+
if (options.certType === accountCertType) {
|
|
105
|
+
(0, _core.kAssert)(!!options.settleId && !!options.signData, '[cert login] settleId and signData are required');
|
|
106
|
+
} else {
|
|
107
|
+
(0, _core.kAssert)(options.certType === 'K2220' && !!options.txId, '[cert login] K2220 requires txId');
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const KakaoCert = {
|
|
111
|
+
certLoginWithKakaoTalk,
|
|
112
|
+
certLoginWithKakaoAccount,
|
|
113
|
+
issueCertTokenWithCode,
|
|
114
|
+
getPublicKey,
|
|
115
|
+
getSessionInfo,
|
|
116
|
+
fetchSessionInfo,
|
|
117
|
+
fetchSessionInfoByAppKey,
|
|
118
|
+
isValidSession,
|
|
119
|
+
deleteKeyPair,
|
|
120
|
+
reducedSign,
|
|
121
|
+
isKakaoTalkSignAvailable,
|
|
122
|
+
signWithKakaoTalk,
|
|
123
|
+
authorizeForCertWeb
|
|
124
|
+
};
|
|
125
|
+
var _default = exports.default = KakaoCert;
|
|
126
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_core","require","_NativeKakaoCert","_interopRequireDefault","e","__esModule","default","signerInformationItems","certificationPrompts","accountCertType","minActivityRequestCode","maxActivityRequestCode","certLoginWithKakaoTalk","options","validateLoginRequest","requestCode","android","kAssert","Number","isInteger","Native","certLoginWithKakaoAccount","certType","issueCertTokenWithCode","code","codeVerifier","redirectUri","length","getPublicKey","publicKey","undefined","getSessionInfo","sessionInfo","fetchSessionInfo","txId","fetchSessionInfoByAppKey","targetAppKey","isValidSession","deleteKeyPair","reducedSign","data","isKakaoTalkSignAvailable","signWithKakaoTalk","authorizeForCertWeb","_options","kCreateWebError","message","prompts","every","prompt","includes","identifyItems","item","settleId","signData","KakaoCert","_default","exports"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.signWithKakaoTalk = exports.reducedSign = exports.issueCertTokenWithCode = exports.isValidSession = exports.isKakaoTalkSignAvailable = exports.getSessionInfo = exports.getPublicKey = exports.fetchSessionInfoByAppKey = exports.fetchSessionInfo = exports.deleteKeyPair = exports.default = exports.certLoginWithKakaoTalk = exports.certLoginWithKakaoAccount = exports.authorizeForCertWeb = void 0;
|
|
7
|
+
var _jsUtil = require("@mj-studio/js-util");
|
|
8
|
+
var _core = require("@react-native-kakao/core");
|
|
9
|
+
const unsupportedPlatformErrorCode = 'Package-UnsupportedPlatform';
|
|
10
|
+
async function unsupported() {
|
|
11
|
+
(0, _core.kCreateWebError)({
|
|
12
|
+
code: unsupportedPlatformErrorCode,
|
|
13
|
+
message: 'This certification operation requires the Android or iOS Cert SDK.'
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
const KakaoCert = {
|
|
17
|
+
certLoginWithKakaoTalk: unsupported,
|
|
18
|
+
certLoginWithKakaoAccount: unsupported,
|
|
19
|
+
issueCertTokenWithCode: async () => {
|
|
20
|
+
(0, _core.kCreateWebError)({
|
|
21
|
+
code: unsupportedPlatformErrorCode,
|
|
22
|
+
message: 'issueCertTokenWithCode is only available on iOS.'
|
|
23
|
+
});
|
|
24
|
+
},
|
|
25
|
+
getPublicKey: unsupported,
|
|
26
|
+
getSessionInfo: unsupported,
|
|
27
|
+
fetchSessionInfo: unsupported,
|
|
28
|
+
fetchSessionInfoByAppKey: unsupported,
|
|
29
|
+
isValidSession: unsupported,
|
|
30
|
+
deleteKeyPair: unsupported,
|
|
31
|
+
reducedSign: unsupported,
|
|
32
|
+
isKakaoTalkSignAvailable: async () => false,
|
|
33
|
+
signWithKakaoTalk: unsupported,
|
|
34
|
+
authorizeForCertWeb: options => (0, _core.kRunWebAPI)(() => {
|
|
35
|
+
Kakao.Auth.authorizeForCert((0, _jsUtil.filterNonNullishKeys)({
|
|
36
|
+
...options,
|
|
37
|
+
prompt: options.prompt?.join(','),
|
|
38
|
+
scope: options.scope?.join(','),
|
|
39
|
+
serviceTerms: options.serviceTerms?.join(','),
|
|
40
|
+
identifyItems: options.identifyItems?.join(',')
|
|
41
|
+
}));
|
|
42
|
+
})
|
|
43
|
+
};
|
|
44
|
+
const {
|
|
45
|
+
certLoginWithKakaoTalk,
|
|
46
|
+
certLoginWithKakaoAccount,
|
|
47
|
+
issueCertTokenWithCode,
|
|
48
|
+
getPublicKey,
|
|
49
|
+
getSessionInfo,
|
|
50
|
+
fetchSessionInfo,
|
|
51
|
+
fetchSessionInfoByAppKey,
|
|
52
|
+
isValidSession,
|
|
53
|
+
deleteKeyPair,
|
|
54
|
+
reducedSign,
|
|
55
|
+
isKakaoTalkSignAvailable,
|
|
56
|
+
signWithKakaoTalk,
|
|
57
|
+
authorizeForCertWeb
|
|
58
|
+
} = KakaoCert;
|
|
59
|
+
exports.authorizeForCertWeb = authorizeForCertWeb;
|
|
60
|
+
exports.signWithKakaoTalk = signWithKakaoTalk;
|
|
61
|
+
exports.isKakaoTalkSignAvailable = isKakaoTalkSignAvailable;
|
|
62
|
+
exports.reducedSign = reducedSign;
|
|
63
|
+
exports.deleteKeyPair = deleteKeyPair;
|
|
64
|
+
exports.isValidSession = isValidSession;
|
|
65
|
+
exports.fetchSessionInfoByAppKey = fetchSessionInfoByAppKey;
|
|
66
|
+
exports.fetchSessionInfo = fetchSessionInfo;
|
|
67
|
+
exports.getSessionInfo = getSessionInfo;
|
|
68
|
+
exports.getPublicKey = getPublicKey;
|
|
69
|
+
exports.issueCertTokenWithCode = issueCertTokenWithCode;
|
|
70
|
+
exports.certLoginWithKakaoAccount = certLoginWithKakaoAccount;
|
|
71
|
+
exports.certLoginWithKakaoTalk = certLoginWithKakaoTalk;
|
|
72
|
+
var _default = exports.default = KakaoCert;
|
|
73
|
+
//# sourceMappingURL=index.web.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_jsUtil","require","_core","unsupportedPlatformErrorCode","unsupported","kCreateWebError","code","message","KakaoCert","certLoginWithKakaoTalk","certLoginWithKakaoAccount","issueCertTokenWithCode","getPublicKey","getSessionInfo","fetchSessionInfo","fetchSessionInfoByAppKey","isValidSession","deleteKeyPair","reducedSign","isKakaoTalkSignAvailable","signWithKakaoTalk","authorizeForCertWeb","options","kRunWebAPI","Kakao","Auth","authorizeForCert","filterNonNullishKeys","prompt","join","scope","serviceTerms","identifyItems","exports","_default","default"],"sourceRoot":"../../src","sources":["index.web.ts"],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AAMA,MAAME,4BAA4B,GAAG,6BAA6B;AAElE,eAAeC,WAAWA,CAAA,EAAmB;EAC3C,IAAAC,qBAAe,EAAC;IACdC,IAAI,EAAEH,4BAA4B;IAClCI,OAAO,EAAE;EACX,CAAC,CAAC;AACJ;AAEA,MAAMC,SAAuB,GAAG;EAC9BC,sBAAsB,EAAEL,WAAW;EACnCM,yBAAyB,EAAEN,WAAW;EACtCO,sBAAsB,EAAE,MAAAA,CAAA,KAAY;IAClC,IAAAN,qBAAe,EAAC;MACdC,IAAI,EAAEH,4BAA4B;MAClCI,OAAO,EAAE;IACX,CAAC,CAAC;EACJ,CAAC;EACDK,YAAY,EAAER,WAAW;EACzBS,cAAc,EAAET,WAAW;EAC3BU,gBAAgB,EAAEV,WAAW;EAC7BW,wBAAwB,EAAEX,WAAW;EACrCY,cAAc,EAAEZ,WAAW;EAC3Ba,aAAa,EAAEb,WAAW;EAC1Bc,WAAW,EAAEd,WAAW;EACxBe,wBAAwB,EAAE,MAAAA,CAAA,KAAY,KAAK;EAC3CC,iBAAiB,EAAEhB,WAAW;EAC9BiB,mBAAmB,EAAGC,OAAO,IAC3B,IAAAC,gBAAU,EAAC,MAAM;IACfC,KAAK,CAACC,IAAI,CAACC,gBAAgB,CACzB,IAAAC,4BAAoB,EAAC;MACnB,GAAGL,OAAO;MACVM,MAAM,EAAEN,OAAO,CAACM,MAAM,EAAEC,IAAI,CAAC,GAAG,CAAC;MACjCC,KAAK,EAAER,OAAO,CAACQ,KAAK,EAAED,IAAI,CAAC,GAAG,CAAC;MAC/BE,YAAY,EAAET,OAAO,CAACS,YAAY,EAAEF,IAAI,CAAC,GAAG,CAAC;MAC7CG,aAAa,EAAEV,OAAO,CAACU,aAAa,EAAEH,IAAI,CAAC,GAAG;IAChD,CAAC,CACH,CAAC;EACH,CAAC;AACL,CAAC;AAEM,MAAM;EACXpB,sBAAsB;EACtBC,yBAAyB;EACzBC,sBAAsB;EACtBC,YAAY;EACZC,cAAc;EACdC,gBAAgB;EAChBC,wBAAwB;EACxBC,cAAc;EACdC,aAAa;EACbC,WAAW;EACXC,wBAAwB;EACxBC,iBAAiB;EACjBC;AACF,CAAC,GAAGb,SAAS;AAACyB,OAAA,CAAAZ,mBAAA,GAAAA,mBAAA;AAAAY,OAAA,CAAAb,iBAAA,GAAAA,iBAAA;AAAAa,OAAA,CAAAd,wBAAA,GAAAA,wBAAA;AAAAc,OAAA,CAAAf,WAAA,GAAAA,WAAA;AAAAe,OAAA,CAAAhB,aAAA,GAAAA,aAAA;AAAAgB,OAAA,CAAAjB,cAAA,GAAAA,cAAA;AAAAiB,OAAA,CAAAlB,wBAAA,GAAAA,wBAAA;AAAAkB,OAAA,CAAAnB,gBAAA,GAAAA,gBAAA;AAAAmB,OAAA,CAAApB,cAAA,GAAAA,cAAA;AAAAoB,OAAA,CAAArB,YAAA,GAAAA,YAAA;AAAAqB,OAAA,CAAAtB,sBAAA,GAAAA,sBAAA;AAAAsB,OAAA,CAAAvB,yBAAA,GAAAA,yBAAA;AAAAuB,OAAA,CAAAxB,sBAAA,GAAAA,sBAAA;AAAA,IAAAyB,QAAA,GAAAD,OAAA,CAAAE,OAAA,GACC3B,SAAS","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"commonjs"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { TurboModule } from 'react-native';
|
|
2
|
+
import { TurboModuleRegistry } from 'react-native';
|
|
3
|
+
import type { UnsafeObject } from 'react-native/Libraries/Types/CodegenTypes';
|
|
4
|
+
|
|
5
|
+
import type { KakaoCertSessionInfo, KakaoCertSignStatusInfo, KakaoCertTokenInfo } from '..';
|
|
6
|
+
|
|
7
|
+
export interface Spec extends TurboModule {
|
|
8
|
+
certLoginWithKakaoTalk(options: UnsafeObject): Promise<KakaoCertTokenInfo>;
|
|
9
|
+
certLoginWithKakaoAccount(options: UnsafeObject): Promise<KakaoCertTokenInfo>;
|
|
10
|
+
issueCertTokenWithCode(
|
|
11
|
+
code: string,
|
|
12
|
+
codeVerifier?: string,
|
|
13
|
+
redirectUri?: string,
|
|
14
|
+
): Promise<KakaoCertTokenInfo>;
|
|
15
|
+
publicKey(certType: string): Promise<string | null>;
|
|
16
|
+
sessionInfo(certType: string): Promise<KakaoCertSessionInfo | null>;
|
|
17
|
+
fetchSessionInfo(certType: string, txId: string): Promise<KakaoCertSessionInfo>;
|
|
18
|
+
fetchSessionInfoByAppKey(
|
|
19
|
+
certType: string,
|
|
20
|
+
txId: string,
|
|
21
|
+
targetAppKey?: string,
|
|
22
|
+
): Promise<KakaoCertSessionInfo>;
|
|
23
|
+
isValidSession(certType: string): Promise<boolean>;
|
|
24
|
+
deleteKeyPair(certType: string): Promise<void>;
|
|
25
|
+
reducedSign(certType: string, data: string): Promise<string>;
|
|
26
|
+
isKakaoTalkSignAvailable(): Promise<boolean>;
|
|
27
|
+
signWithKakaoTalk(txId: string, targetAppKey?: string): Promise<KakaoCertSignStatusInfo>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export default TurboModuleRegistry.getEnforcing<Spec>('RNCKakaoCert');
|