@authon/js 0.3.0 → 0.3.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/README.ko.md +58 -149
- package/README.md +201 -368
- package/dist/index.cjs +673 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +669 -10
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.ko.md
CHANGED
|
@@ -2,189 +2,98 @@
|
|
|
2
2
|
|
|
3
3
|
# @authon/js
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
> 브라우저 인증 SDK -- 셀프 호스팅 Clerk 대안, Auth0 대안, 오픈소스 인증
|
|
6
6
|
|
|
7
7
|
## 설치
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
10
|
npm install @authon/js
|
|
11
|
-
# or
|
|
12
|
-
pnpm add @authon/js
|
|
13
11
|
```
|
|
14
12
|
|
|
15
13
|
## 빠른 시작
|
|
16
14
|
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
15
|
+
```html
|
|
16
|
+
<!DOCTYPE html>
|
|
17
|
+
<html>
|
|
18
|
+
<head><title>My App</title></head>
|
|
19
|
+
<body>
|
|
20
|
+
<button id="sign-in-btn">로그인</button>
|
|
21
|
+
<div id="user-info"></div>
|
|
22
|
+
|
|
23
|
+
<script type="module">
|
|
24
|
+
import { Authon } from '@authon/js';
|
|
25
|
+
|
|
26
|
+
const authon = new Authon('pk_live_YOUR_PUBLISHABLE_KEY', {
|
|
27
|
+
apiUrl: 'https://your-authon-server.com',
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
document.getElementById('sign-in-btn').addEventListener('click', () => {
|
|
31
|
+
authon.openSignIn();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
authon.on('signedIn', (user) => {
|
|
35
|
+
document.getElementById('user-info').textContent = `안녕하세요, ${user.email}`;
|
|
36
|
+
});
|
|
37
|
+
</script>
|
|
38
|
+
</body>
|
|
39
|
+
</html>
|
|
40
|
+
```
|
|
29
41
|
|
|
30
|
-
|
|
31
|
-
console.log('Signed out');
|
|
32
|
-
});
|
|
42
|
+
## 주요 작업
|
|
33
43
|
|
|
34
|
-
|
|
35
|
-
const user = await authon.signInWithEmail('user@example.com', 'password');
|
|
44
|
+
### Google OAuth 로그인 추가
|
|
36
45
|
|
|
37
|
-
|
|
46
|
+
```ts
|
|
38
47
|
await authon.signInWithOAuth('google');
|
|
39
|
-
|
|
40
|
-
//
|
|
41
|
-
await authon.signInWithOAuth('google', { flowMode: 'redirect' });
|
|
42
|
-
|
|
43
|
-
// 현재 사용자 및 토큰 조회
|
|
44
|
-
const currentUser = authon.getUser();
|
|
45
|
-
const token = authon.getToken();
|
|
46
|
-
|
|
47
|
-
// 로그아웃
|
|
48
|
-
await authon.signOut();
|
|
48
|
+
// 지원 프로바이더: google, apple, github, discord, facebook,
|
|
49
|
+
// microsoft, kakao, naver, line, x
|
|
49
50
|
```
|
|
50
51
|
|
|
51
|
-
|
|
52
|
+
### 이메일/비밀번호 인증
|
|
52
53
|
|
|
53
54
|
```ts
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
mode: 'popup', // 'popup' | 'embedded'
|
|
57
|
-
theme: 'auto', // 'light' | 'dark' | 'auto'
|
|
58
|
-
locale: 'en', // 모달 UI 언어
|
|
59
|
-
containerId: 'auth-container', // 컨테이너 요소 ID (embedded 모드)
|
|
60
|
-
appearance: { // 커스텀 브랜딩 덮어쓰기
|
|
61
|
-
primaryColorStart: '#7c3aed',
|
|
62
|
-
primaryColorEnd: '#4f46e5',
|
|
63
|
-
borderRadius: 12,
|
|
64
|
-
brandName: 'My App',
|
|
65
|
-
},
|
|
66
|
-
});
|
|
55
|
+
const user = await authon.signUpWithEmail('user@example.com', 'MyP@ssw0rd', { displayName: 'Alice' });
|
|
56
|
+
const user = await authon.signInWithEmail('user@example.com', 'MyP@ssw0rd');
|
|
67
57
|
```
|
|
68
58
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
### `Authon` 클래스
|
|
72
|
-
|
|
73
|
-
| 메서드 | 반환값 | 설명 |
|
|
74
|
-
|--------|---------|-------------|
|
|
75
|
-
| `openSignIn()` | `Promise<void>` | 로그인 모달 열기 |
|
|
76
|
-
| `openSignUp()` | `Promise<void>` | 회원가입 모달 열기 |
|
|
77
|
-
| `signInWithEmail(email, password)` | `Promise<AuthonUser>` | 이메일/비밀번호로 로그인 |
|
|
78
|
-
| `signUpWithEmail(email, password, meta?)` | `Promise<AuthonUser>` | 이메일/비밀번호로 회원가입 |
|
|
79
|
-
| `signInWithOAuth(provider, options?)` | `Promise<void>` | OAuth 플로우 시작 (`auto`, `popup`, `redirect`) |
|
|
80
|
-
| `signOut()` | `Promise<void>` | 로그아웃 및 세션 초기화 |
|
|
81
|
-
| `getUser()` | `AuthonUser \| null` | 현재 사용자 조회 |
|
|
82
|
-
| `getToken()` | `string \| null` | 현재 액세스 토큰 조회 |
|
|
83
|
-
| `on(event, listener)` | `() => void` | 이벤트 구독 (구독 해제 함수 반환) |
|
|
84
|
-
| `destroy()` | `void` | 리소스 정리 |
|
|
85
|
-
|
|
86
|
-
### 이벤트
|
|
87
|
-
|
|
88
|
-
| 이벤트 | 페이로드 | 설명 |
|
|
89
|
-
|-------|---------|-------------|
|
|
90
|
-
| `signedIn` | `AuthonUser` | 사용자 로그인 완료 |
|
|
91
|
-
| `signedOut` | 없음 | 사용자 로그아웃 완료 |
|
|
92
|
-
| `tokenRefreshed` | `string` | 액세스 토큰 갱신됨 |
|
|
93
|
-
| `error` | `Error` | 오류 발생 |
|
|
94
|
-
| `mfaRequired` | `string` | MFA 인증 필요 (페이로드는 mfaToken) |
|
|
95
|
-
|
|
96
|
-
## 다단계 인증 (MFA)
|
|
97
|
-
|
|
98
|
-
Authon은 Google Authenticator, Authy 등 다양한 인증 앱과 호환되는 TOTP 기반 MFA를 지원합니다.
|
|
99
|
-
|
|
100
|
-
### MFA 설정
|
|
59
|
+
### 현재 사용자 가져오기
|
|
101
60
|
|
|
102
61
|
```ts
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
const authon = new Authon('pk_live_...');
|
|
106
|
-
|
|
107
|
-
// 1. MFA 설정 시작 (로그인 상태여야 함)
|
|
108
|
-
const setup = await authon.setupMfa();
|
|
109
|
-
// setup.secret — TOTP 시크릿 키
|
|
110
|
-
// setup.qrCodeUri — 인증 앱용 otpauth:// URI
|
|
111
|
-
// setup.backupCodes — 일회용 복구 코드
|
|
112
|
-
// setup.qrCodeSvg — QR 코드 SVG 문자열 (바로 사용 가능)
|
|
113
|
-
|
|
114
|
-
// UI에 QR 코드 표시
|
|
115
|
-
document.getElementById('qr')!.innerHTML = setup.qrCodeSvg;
|
|
116
|
-
|
|
117
|
-
// 2. 사용자가 QR 코드를 스캔하고 6자리 코드를 입력
|
|
118
|
-
const verified = await authon.verifyMfaSetup('123456');
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
### MFA 로그인 플로우
|
|
122
|
-
|
|
123
|
-
MFA가 활성화되어 있으면 `signInWithEmail` 호출 시 `AuthonMfaRequiredError`가 발생합니다.
|
|
124
|
-
|
|
125
|
-
```ts
|
|
126
|
-
import { Authon, AuthonMfaRequiredError } from '@authon/js';
|
|
127
|
-
|
|
128
|
-
try {
|
|
129
|
-
await authon.signInWithEmail('user@example.com', 'password');
|
|
130
|
-
} catch (err) {
|
|
131
|
-
if (err instanceof AuthonMfaRequiredError) {
|
|
132
|
-
// 사용자에게 TOTP 코드를 입력받아 인증
|
|
133
|
-
const user = await authon.verifyMfa(err.mfaToken, '123456');
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// 이벤트 리스너 방식으로도 처리 가능
|
|
138
|
-
authon.on('mfaRequired', async (mfaToken) => {
|
|
139
|
-
const code = prompt('Enter your 2FA code');
|
|
140
|
-
if (code) await authon.verifyMfa(mfaToken, code);
|
|
141
|
-
});
|
|
62
|
+
const user = authon.getUser();
|
|
63
|
+
const token = authon.getToken();
|
|
142
64
|
```
|
|
143
65
|
|
|
144
|
-
###
|
|
66
|
+
### 로그인 모달 열기
|
|
145
67
|
|
|
146
68
|
```ts
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
// status.enabled, status.backupCodesRemaining
|
|
150
|
-
|
|
151
|
-
// MFA 비활성화 (현재 TOTP 코드 필요)
|
|
152
|
-
await authon.disableMfa('123456');
|
|
153
|
-
|
|
154
|
-
// 복구 코드 재생성 (현재 TOTP 코드 필요)
|
|
155
|
-
const newCodes = await authon.regenerateBackupCodes('123456');
|
|
69
|
+
await authon.openSignIn();
|
|
70
|
+
await authon.openSignUp();
|
|
156
71
|
```
|
|
157
72
|
|
|
158
|
-
###
|
|
159
|
-
|
|
160
|
-
SDK에는 외부 의존성 없이 QR 코드 SVG를 생성하는 기능이 내장되어 있습니다.
|
|
73
|
+
### 로그아웃
|
|
161
74
|
|
|
162
75
|
```ts
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
const svg = generateQrSvg('otpauth://totp/MyApp:user@example.com?secret=JBSWY3DPEHPK3PXP&issuer=MyApp');
|
|
166
|
-
document.getElementById('qr')!.innerHTML = svg;
|
|
76
|
+
await authon.signOut();
|
|
167
77
|
```
|
|
168
78
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
| 메서드 | 반환값 | 설명 |
|
|
172
|
-
|--------|---------|-------------|
|
|
173
|
-
| `setupMfa()` | `Promise<MfaSetupResponse & { qrCodeSvg: string }>` | MFA 설정 시작, 시크릿 및 QR 코드 반환 |
|
|
174
|
-
| `verifyMfaSetup(code)` | `Promise<void>` | TOTP 코드 검증으로 설정 완료 |
|
|
175
|
-
| `verifyMfa(mfaToken, code)` | `Promise<AuthonUser>` | 로그인 중 TOTP 코드 검증 |
|
|
176
|
-
| `disableMfa(code)` | `Promise<void>` | MFA 비활성화 |
|
|
177
|
-
| `getMfaStatus()` | `Promise<MfaStatus>` | 현재 MFA 상태 조회 |
|
|
178
|
-
| `regenerateBackupCodes(code)` | `Promise<string[]>` | 복구 코드 재생성 |
|
|
179
|
-
|
|
180
|
-
## ShadowDOM 모달
|
|
79
|
+
## 환경 변수
|
|
181
80
|
|
|
182
|
-
|
|
81
|
+
| 변수 | 필수 | 설명 |
|
|
82
|
+
|------|------|------|
|
|
83
|
+
| `AUTHON_API_URL` | Yes | Authon 서버 URL |
|
|
84
|
+
| `AUTHON_PUBLISHABLE_KEY` | Yes | 프로젝트 퍼블리셔블 키 |
|
|
183
85
|
|
|
184
|
-
##
|
|
86
|
+
## 비교
|
|
185
87
|
|
|
186
|
-
|
|
88
|
+
| 기능 | Authon | Clerk | Auth.js |
|
|
89
|
+
|------|--------|-------|---------|
|
|
90
|
+
| 셀프 호스팅 | Yes | No | 부분적 |
|
|
91
|
+
| 가격 | 무료 | $25/월+ | 무료 |
|
|
92
|
+
| OAuth 프로바이더 | 10+ | 20+ | 80+ |
|
|
93
|
+
| ShadowDOM 모달 | Yes | No | No |
|
|
94
|
+
| MFA/패스키 | Yes | Yes | 플러그인 |
|
|
95
|
+
| Web3 인증 | Yes | No | No |
|
|
187
96
|
|
|
188
97
|
## 라이선스
|
|
189
98
|
|
|
190
|
-
|
|
99
|
+
MIT
|