@arcblock/did-connect-react 3.1.41 → 3.1.42

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.
Files changed (81) hide show
  1. package/.aigne/doc-smith/config.yaml +83 -0
  2. package/.aigne/doc-smith/output/structure-plan.json +197 -0
  3. package/.aigne/doc-smith/upload-cache.yaml +168 -0
  4. package/docs/_sidebar.md +18 -0
  5. package/docs/advanced-authentication-methods.ja.md +261 -0
  6. package/docs/advanced-authentication-methods.md +261 -0
  7. package/docs/advanced-authentication-methods.zh-TW.md +261 -0
  8. package/docs/advanced-authentication-methods.zh.md +261 -0
  9. package/docs/advanced-utilities.ja.md +132 -0
  10. package/docs/advanced-utilities.md +132 -0
  11. package/docs/advanced-utilities.zh-TW.md +132 -0
  12. package/docs/advanced-utilities.zh.md +132 -0
  13. package/docs/advanced.ja.md +95 -0
  14. package/docs/advanced.md +95 -0
  15. package/docs/advanced.zh-TW.md +95 -0
  16. package/docs/advanced.zh.md +95 -0
  17. package/docs/api-reference.ja.md +178 -0
  18. package/docs/api-reference.md +178 -0
  19. package/docs/api-reference.zh-TW.md +178 -0
  20. package/docs/api-reference.zh.md +178 -0
  21. package/docs/core-components-did-connect.ja.md +214 -0
  22. package/docs/core-components-did-connect.md +213 -0
  23. package/docs/core-components-did-connect.zh-TW.md +214 -0
  24. package/docs/core-components-did-connect.zh.md +213 -0
  25. package/docs/core-components-session-provider.ja.md +239 -0
  26. package/docs/core-components-session-provider.md +239 -0
  27. package/docs/core-components-session-provider.zh-TW.md +239 -0
  28. package/docs/core-components-session-provider.zh.md +239 -0
  29. package/docs/core-components.ja.md +16 -0
  30. package/docs/core-components.md +16 -0
  31. package/docs/core-components.zh-TW.md +16 -0
  32. package/docs/core-components.zh.md +16 -0
  33. package/docs/getting-started.ja.md +138 -0
  34. package/docs/getting-started.md +138 -0
  35. package/docs/getting-started.zh-TW.md +138 -0
  36. package/docs/getting-started.zh.md +138 -0
  37. package/docs/hooks-use-connect.ja.md +214 -0
  38. package/docs/hooks-use-connect.md +214 -0
  39. package/docs/hooks-use-connect.zh-TW.md +214 -0
  40. package/docs/hooks-use-connect.zh.md +214 -0
  41. package/docs/hooks-use-did.ja.md +107 -0
  42. package/docs/hooks-use-did.md +107 -0
  43. package/docs/hooks-use-did.zh-TW.md +107 -0
  44. package/docs/hooks-use-did.zh.md +107 -0
  45. package/docs/hooks-use-oauth-passkey.ja.md +188 -0
  46. package/docs/hooks-use-oauth-passkey.md +188 -0
  47. package/docs/hooks-use-oauth-passkey.zh-TW.md +188 -0
  48. package/docs/hooks-use-oauth-passkey.zh.md +188 -0
  49. package/docs/hooks.ja.md +23 -0
  50. package/docs/hooks.md +23 -0
  51. package/docs/hooks.zh-TW.md +23 -0
  52. package/docs/hooks.zh.md +23 -0
  53. package/docs/overview.ja.md +159 -0
  54. package/docs/overview.md +159 -0
  55. package/docs/overview.zh-TW.md +159 -0
  56. package/docs/overview.zh.md +160 -0
  57. package/docs/ui-components-address.ja.md +121 -0
  58. package/docs/ui-components-address.md +121 -0
  59. package/docs/ui-components-address.zh-TW.md +121 -0
  60. package/docs/ui-components-address.zh.md +121 -0
  61. package/docs/ui-components-avatar.ja.md +65 -0
  62. package/docs/ui-components-avatar.md +65 -0
  63. package/docs/ui-components-avatar.zh-TW.md +65 -0
  64. package/docs/ui-components-avatar.zh.md +65 -0
  65. package/docs/ui-components-button.ja.md +99 -0
  66. package/docs/ui-components-button.md +99 -0
  67. package/docs/ui-components-button.zh-TW.md +99 -0
  68. package/docs/ui-components-button.zh.md +99 -0
  69. package/docs/ui-components-logo.ja.md +52 -0
  70. package/docs/ui-components-logo.md +52 -0
  71. package/docs/ui-components-logo.zh-TW.md +52 -0
  72. package/docs/ui-components-logo.zh.md +52 -0
  73. package/docs/ui-components.ja.md +57 -0
  74. package/docs/ui-components.md +57 -0
  75. package/docs/ui-components.zh-TW.md +57 -0
  76. package/docs/ui-components.zh.md +57 -0
  77. package/glossary.md +1 -0
  78. package/lib/package.json.js +1 -1
  79. package/package.json +5 -5
  80. package/src/Session/hooks/use-federated.js +3 -0
  81. package/src/Session/libs/federated.js +3 -0
@@ -0,0 +1,261 @@
1
+ # 認証方法
2
+
3
+ DID Walletは主要かつ最も安全な認証方法ですが、`@arcblock/did-connect-react`は、柔軟性を提供し、多様なユーザーの好みに応えるために、いくつかの代替ログイン方法を強力にサポートしています。このセクションでは、OAuth(ソーシャルログイン)、パスキー(パスワードレス認証)、および統一ログインをアプリケーションに統合する方法について詳しく説明します。
4
+
5
+ これらの方法は、特定のReact Context Providerを介して有効になり、対応するフックを介してアクセスされます。これらはメインの`SessionProvider`内にネストする必要があります。
6
+
7
+ ---
8
+
9
+ ## OAuth(ソーシャルログイン)
10
+
11
+ Google、GitHub、Appleなどの人気のあるソーシャルログインプロバイダーを統合し、ユーザーが既存のアカウントでサインインできるようにします。この機能は`OAuthProvider`と`useOAuth`フックによって管理されます。
12
+
13
+ ### 1. OAuthProviderでのセットアップ
14
+
15
+ OAuth機能を有効にするには、コンポーネントツリーを`OAuthProvider`でラップします。`SessionProvider`内に配置するのが一般的です。
16
+
17
+ ```jsx OAuthProvider Setup icon=logos:react
18
+ import { SessionProvider } from '@arcblock/did-connect-react';
19
+ import { OAuthProvider } from '@arcblock/did-connect-react/lib/OAuth';
20
+
21
+ function App() {
22
+ return (
23
+ <SessionProvider>
24
+ <OAuthProvider
25
+ onBindOAuth={(provider) => console.log(`${provider.provider} bound!`)}
26
+ onUnbindOAuth={(account) => console.log(`${account.provider} unbound!`)}>
27
+ {/* Your application components */}
28
+ </OAuthProvider>
29
+ </SessionProvider>
30
+ );
31
+ }
32
+ ```
33
+
34
+ **`OAuthProvider`のProps**
35
+
36
+ <x-field-group>
37
+ <x-field data-name="children" data-type="ReactNode" data-required="true" data-desc="OAuthコンテキストにアクセスできる子コンポーネント。"></x-field>
38
+ <x-field data-name="locale" data-type="string" data-default="en" data-desc="UIメッセージとトーストの言語。"></x-field>
39
+ <x-field data-name="onBindOAuth" data-type="function" data-desc="ユーザーがOAuthアカウントのバインドに成功した後にトリガーされるコールバック関数。"></x-field>
40
+ <x-field data-name="onUnbindOAuth" data-type="function" data-desc="ユーザーがOAuthアカウントのバインド解除に成功した後にトリガーされるコールバック関数。"></x-field>
41
+ <x-field data-name="onSwitchPassport" data-type="function" data-desc="ユーザーがパスポートを切り替えた後にトリガーされるコールバック関数。"></x-field>
42
+ <x-field data-name="session" data-type="object" data-desc="現在のユーザーセッションオブジェクト。パスポート切り替えUIに必要です。"></x-field>
43
+ </x-field-group>
44
+
45
+ ### 2. useOAuthフックの使用
46
+
47
+ `useOAuth`フックは、OAuth認証フローと対話するための関数を提供します。
48
+
49
+ ```jsx useOAuth Hook icon=logos:react
50
+ import { useOAuth } from '@arcblock/did-connect-react/lib/OAuth';
51
+
52
+ function SocialLoginButtons() {
53
+ const { loginOAuth, getOAuthConfigList, bindAuthLoading } = useOAuth();
54
+ const [providers, setProviders] = React.useState([]);
55
+
56
+ React.useEffect(() => {
57
+ getOAuthConfigList().then(setProviders);
58
+ }, [getOAuthConfigList]);
59
+
60
+ const handleLogin = async (provider) => {
61
+ try {
62
+ const result = await loginOAuth({ provider: provider.provider });
63
+ console.log('Login successful:', result);
64
+ // ログイン結果を処理します(例:セッションの更新)
65
+ } catch (error) {
66
+ console.error('Login failed:', error.message);
67
+ }
68
+ };
69
+
70
+ if (providers.length === 0) {
71
+ return <p>設定されたサードパーティのログイン方法はありません。</p>;
72
+ }
73
+
74
+ return (
75
+ <div>
76
+ {providers.map((p) => (
77
+ <button key={p.provider} onClick={() => handleLogin(p)} disabled={bindAuthLoading}>
78
+ Login with {p.provider}
79
+ </button>
80
+ ))}
81
+ </div>
82
+ );
83
+ }
84
+ ```
85
+
86
+ ### コア関数
87
+
88
+ - **`loginOAuth({ provider }, { action, ... })`**: 特定のプロバイダーのログインフローを開始します。ユーザー認証のためにポップアップウィンドウが開きます。
89
+ - **`bindOAuth({ session, oauthItem })`**: 新しいソーシャルアカウントを現在ログインしているユーザーにバインドします。
90
+ - **`unbindOAuth({ session, connectedAccount })`**: 現在のユーザーからソーシャルアカウントのバインドを解除します。
91
+ - **`getOAuthConfigList()`**: Blockletの設定で構成された有効なOAuthプロバイダーのリストを非同期で取得します。
92
+ - **`switchOAuthPassport(user)`**: 同じOAuth IDに関連付けられた異なるユーザーアカウント(パスポート)を切り替えるためのダイアログを開きます。
93
+
94
+ ---
95
+
96
+ ## パスキー(パスワードレス)
97
+
98
+ WebAuthn標準に基づく最新で安全なパスワードレス認証であるパスキーを有効にします。これにより、ユーザーは生体認証(指紋、顔認証)、デバイスのPIN、またはセキュリティキーでサインインできます。
99
+
100
+ ### 1. PasskeyProviderでのセットアップ
101
+
102
+ Passkey機能を有効にするには、アプリケーションを`PasskeyProvider`でラップします。
103
+
104
+ ```jsx PasskeyProvider Setup icon=logos:react
105
+ import { SessionProvider } from '@arcblock/did-connect-react';
106
+ import { PasskeyProvider } from '@arcblock/did-connect-react/lib/Passkey';
107
+
108
+ function App() {
109
+ return (
110
+ <SessionProvider>
111
+ <PasskeyProvider
112
+ onAddPasskey={(result) => console.log('Passkey added!', result)}
113
+ onRemovePasskey={(result) => console.log('Passkey removed!', result)}>
114
+ {/* Your application components */}
115
+ </PasskeyProvider>
116
+ </SessionProvider>
117
+ );
118
+ }
119
+ ```
120
+
121
+ **`PasskeyProvider`のProps**
122
+
123
+ <x-field-group>
124
+ <x-field data-name="children" data-type="ReactNode" data-required="true" data-desc="Passkeyコンテキストにアクセスできる子コンポーネント。"></x-field>
125
+ <x-field data-name="locale" data-type="string" data-default="en" data-desc="UIメッセージとトーストの言語。"></x-field>
126
+ <x-field data-name="onAddPasskey" data-type="function" data-desc="ユーザーがパスキーの追加に成功した後にトリガーされるコールバック関数。"></x-field>
127
+ <x-field data-name="onRemovePasskey" data-type="function" data-desc="ユーザーがパスキーの削除に成功した後にトリガーされるコールバック関数。"></x-field>
128
+ <x-field data-name="onSwitchPassport" data-type="function" data-desc="ユーザーがパスポートを切り替えた後にトリガーされるコールバック関数。"></x-field>
129
+ <x-field data-name="session" data-type="object" data-desc="現在のユーザーセッションオブジェクト。パスポート切り替えUIに必要です。"></x-field>
130
+ </x-field-group>
131
+
132
+ ### 2. usePasskeyフックの使用
133
+
134
+ `usePasskey`フックは、パスキーの登録と認証に必要なすべての関数を提供します。
135
+
136
+ ```jsx usePasskey Hook icon=logos:react
137
+ import { usePasskey } from '@arcblock/did-connect-react/lib/Passkey';
138
+ import { useSession } from '@arcblock/did-connect-react';
139
+
140
+ function PasskeyAuth() {
141
+ const { loginPasskey, connectPasskey, connecting } = usePasskey();
142
+ const { session } = useSession();
143
+
144
+ const handleLogin = async () => {
145
+ try {
146
+ const result = await loginPasskey();
147
+ console.log('Passkey login successful:', result);
148
+ // ログイン結果を処理
149
+ } catch (error) {
150
+ console.error('Passkey login failed:', error.message);
151
+ }
152
+ };
153
+
154
+ const handleConnect = async () => {
155
+ // これはユーザーがすでにログインしている場合に呼び出されるべきです
156
+ // そしてプロフィール設定でパスキーを追加したい場合。
157
+ if (!session.user) {
158
+ alert('パスキーを追加するにはログインする必要があります。');
159
+ return;
160
+ }
161
+ try {
162
+ await connectPasskey();
163
+ } catch (error) {
164
+ console.error('Failed to connect passkey:', error.message);
165
+ }
166
+ };
167
+
168
+ return (
169
+ <div>
170
+ <button onClick={handleLogin}>Login with Passkey</button>
171
+ {session.user && (
172
+ <button onClick={handleConnect} disabled={connecting}>
173
+ {connecting ? 'Connecting...' : 'Add a Passkey'}
174
+ </button>
175
+ )}
176
+ </div>
177
+ );
178
+ }
179
+ ```
180
+
181
+ ### コア関数
182
+ - **`loginPasskey({ action, ... })`**: パスキー認証フロー(アサーションとも呼ばれる)を開始します。これは既存のユーザーのログインに使用されます。
183
+ - **`connectPasskey(extraParams)`**: 新しいパスキーを作成し、現在のユーザーのアカウントにバインドするための高レベル関数です。完全な登録セレモニーを処理します。
184
+ - **`disconnectPasskey({ session, connectedAccount })`**: 検証が成功した後、現在のユーザーのアカウントからパスキーを削除します。
185
+ - **`createPasskey(params)`**: WebAuthn登録プロセスを開始する低レベル関数です。`connectPasskey`は内部でこれを使用します。
186
+ - **`verifyPasskey(params)`**: WebAuthn認証プロセスを開始する低レベル関数です。`loginPasskey`と`disconnectPasskey`は内部でこれを使用します。
187
+ - **`switchPassport(user)`**: パスキーを共有する可能性のある異なるユーザーアカウント(パスポート)を切り替えるためのダイアログを開きます。
188
+
189
+ ---
190
+
191
+ ## 統一ログイン
192
+
193
+ 統一ログインは、関連するBlockletアプリケーションのグループ(「統一ログインサイト群」)が単一のログインセッションを共有できるようにします。ユーザーが指定された「マスター」サイトにログインすると、再度ログインする必要なく、どの「メンバー」サイトでも自動的に認証されます。
194
+
195
+ ### 1. コンセプトとセットアップ
196
+
197
+ この機能は、Blockletの設定内のマスター-メンバーサイト構成に依存します。`FederatedProvider`コンポーネントは、特にサードパーティのクッキーアクセスを管理するために、最新のブラウザでこれが機能するために必要なクロスドメイン通信を処理するために必要です。
198
+
199
+ 他のプロバイダーと同様に、`FederatedProvider`はコンポーネントツリーに含まれるべきであり、通常は`SessionProvider`内に配置します。
200
+
201
+ ```jsx FederatedProvider Setup icon=logos:react
202
+ import { SessionProvider } from '@arcblock/did-connect-react';
203
+ import { FederatedProvider } from '@arcblock/did-connect-react/lib/Federated';
204
+
205
+ function App() {
206
+ return (
207
+ <SessionProvider>
208
+ <FederatedProvider>
209
+ {/* Your application components */}
210
+ </FederatedProvider>
211
+ </SessionProvider>
212
+ );
213
+ }
214
+ ```
215
+
216
+ ### 2. 使用方法
217
+
218
+ 統一ログインロジックはセッション管理に直接統合されています。`useSession`が返す`session`オブジェクトで利用可能な`loginFederated`関数を使用してトリガーできます。
219
+
220
+ `loginFederated`は2つのモードをサポートしています:
221
+ - **`auto`**: マスターサイトでアクティブなセッションがある場合、ユーザーをサイレントにログインさせようとします。これはページロード時のチェックに最適です。
222
+ - **`manual`**: 標準のDID Connectログインフローを開始します。ログインに成功すると、マスターサイトとの統一セッションも確立します。
223
+
224
+ ```jsx Federated Login Example icon=logos:react
225
+ import { useSession } from '@arcblock/did-connect-react';
226
+ import React from 'react';
227
+
228
+ function FederatedLogin() {
229
+ const { session } = useSession();
230
+ const { federatedEnabled, loginFederated } = session;
231
+
232
+ // コンポーネントのマウント時に自動ログインを試行
233
+ React.useEffect(() => {
234
+ if (federatedEnabled) {
235
+ loginFederated((err) => {
236
+ if (err) {
237
+ console.warn('Auto federated login failed:', err);
238
+ } else {
239
+ console.log('Auto federated login successful!');
240
+ }
241
+ }, { mode: 'auto' });
242
+ }
243
+ }, [federatedEnabled, loginFederated]);
244
+
245
+ const handleManualLogin = () => {
246
+ loginFederated((err) => {
247
+ if (err) console.error('Manual federated login failed:', err);
248
+ }, { mode: 'manual' });
249
+ };
250
+
251
+ if (!federatedEnabled) {
252
+ return <p>統一ログインは有効になっていません。</p>;
253
+ }
254
+
255
+ return (
256
+ <button onClick={handleManualLogin}>
257
+ マスターサイトのアカウントでログイン
258
+ </button>
259
+ );
260
+ }
261
+ ```
@@ -0,0 +1,261 @@
1
+ # Authentication Methods
2
+
3
+ While DID Wallet is the primary and most secure method for authentication, `@arcblock/did-connect-react` provides robust support for several alternative login methods to offer flexibility and cater to diverse user preferences. This section details how to integrate OAuth (social logins), Passkeys (passwordless authentication), and Federated Login into your application.
4
+
5
+ These methods are enabled through specific React Context Providers and accessed via corresponding hooks, which should be nested within the main `SessionProvider`.
6
+
7
+ ---
8
+
9
+ ## OAuth (Social Login)
10
+
11
+ Integrate popular social login providers like Google, GitHub, or Apple to allow users to sign in with their existing accounts. This functionality is managed by `OAuthProvider` and the `useOAuth` hook.
12
+
13
+ ### 1. Setup with `OAuthProvider`
14
+
15
+ To enable OAuth functionalities, wrap your component tree with `OAuthProvider`. It's common to place it inside the `SessionProvider`.
16
+
17
+ ```jsx OAuthProvider Setup icon=logos:react
18
+ import { SessionProvider } from '@arcblock/did-connect-react';
19
+ import { OAuthProvider } from '@arcblock/did-connect-react/lib/OAuth';
20
+
21
+ function App() {
22
+ return (
23
+ <SessionProvider>
24
+ <OAuthProvider
25
+ onBindOAuth={(provider) => console.log(`${provider.provider} bound!`)}
26
+ onUnbindOAuth={(account) => console.log(`${account.provider} unbound!`)}>
27
+ {/* Your application components */}
28
+ </OAuthProvider>
29
+ </SessionProvider>
30
+ );
31
+ }
32
+ ```
33
+
34
+ **Props for `OAuthProvider`**
35
+
36
+ <x-field-group>
37
+ <x-field data-name="children" data-type="ReactNode" data-required="true" data-desc="The child components that will have access to the OAuth context."></x-field>
38
+ <x-field data-name="locale" data-type="string" data-default="en" data-desc="The language for UI messages and toasts."></x-field>
39
+ <x-field data-name="onBindOAuth" data-type="function" data-desc="Callback function triggered after a user successfully binds an OAuth account."></x-field>
40
+ <x-field data-name="onUnbindOAuth" data-type="function" data-desc="Callback function triggered after a user successfully unbinds an OAuth account."></x-field>
41
+ <x-field data-name="onSwitchPassport" data-type="function" data-desc="Callback function triggered after a user switches passports."></x-field>
42
+ <x-field data-name="session" data-type="object" data-desc="The current user session object, required for passport switching UI."></x-field>
43
+ </x-field-group>
44
+
45
+ ### 2. Usage with `useOAuth` Hook
46
+
47
+ The `useOAuth` hook provides functions to interact with the OAuth authentication flows.
48
+
49
+ ```jsx useOAuth Hook icon=logos:react
50
+ import { useOAuth } from '@arcblock/did-connect-react/lib/OAuth';
51
+
52
+ function SocialLoginButtons() {
53
+ const { loginOAuth, getOAuthConfigList, bindAuthLoading } = useOAuth();
54
+ const [providers, setProviders] = React.useState([]);
55
+
56
+ React.useEffect(() => {
57
+ getOAuthConfigList().then(setProviders);
58
+ }, [getOAuthConfigList]);
59
+
60
+ const handleLogin = async (provider) => {
61
+ try {
62
+ const result = await loginOAuth({ provider: provider.provider });
63
+ console.log('Login successful:', result);
64
+ // Handle login result, e.g., update session
65
+ } catch (error) {
66
+ console.error('Login failed:', error.message);
67
+ }
68
+ };
69
+
70
+ if (providers.length === 0) {
71
+ return <p>No third-party login methods configured.</p>;
72
+ }
73
+
74
+ return (
75
+ <div>
76
+ {providers.map((p) => (
77
+ <button key={p.provider} onClick={() => handleLogin(p)} disabled={bindAuthLoading}>
78
+ Login with {p.provider}
79
+ </button>
80
+ ))}
81
+ </div>
82
+ );
83
+ }
84
+ ```
85
+
86
+ ### Core Functions
87
+
88
+ - **`loginOAuth({ provider }, { action, ... })`**: Initiates the login flow for a specific provider. A popup window will open for user authentication.
89
+ - **`bindOAuth({ session, oauthItem })`**: Binds a new social account to the currently logged-in user.
90
+ - **`unbindOAuth({ session, connectedAccount })`**: Unbinds a social account from the current user.
91
+ - **`getOAuthConfigList()`**: Asynchronously fetches the list of enabled OAuth providers configured in the Blocklet settings.
92
+ - **`switchOAuthPassport(user)`**: Opens a dialog to switch between different user accounts (passports) associated with the same OAuth identity.
93
+
94
+ ---
95
+
96
+ ## Passkeys (Passwordless)
97
+
98
+ Enable modern, secure, and passwordless authentication using Passkeys, which are based on the WebAuthn standard. This allows users to sign in with biometrics (fingerprint, face ID), a device PIN, or a security key.
99
+
100
+ ### 1. Setup with `PasskeyProvider`
101
+
102
+ Wrap your application with `PasskeyProvider` to enable Passkey functionality.
103
+
104
+ ```jsx PasskeyProvider Setup icon=logos:react
105
+ import { SessionProvider } from '@arcblock/did-connect-react';
106
+ import { PasskeyProvider } from '@arcblock/did-connect-react/lib/Passkey';
107
+
108
+ function App() {
109
+ return (
110
+ <SessionProvider>
111
+ <PasskeyProvider
112
+ onAddPasskey={(result) => console.log('Passkey added!', result)}
113
+ onRemovePasskey={(result) => console.log('Passkey removed!', result)}>
114
+ {/* Your application components */}
115
+ </PasskeyProvider>
116
+ </SessionProvider>
117
+ );
118
+ }
119
+ ```
120
+
121
+ **Props for `PasskeyProvider`**
122
+
123
+ <x-field-group>
124
+ <x-field data-name="children" data-type="ReactNode" data-required="true" data-desc="The child components that will have access to the Passkey context."></x-field>
125
+ <x-field data-name="locale" data-type="string" data-default="en" data-desc="The language for UI messages and toasts."></x-field>
126
+ <x-field data-name="onAddPasskey" data-type="function" data-desc="Callback function triggered after a user successfully adds a Passkey."></x-field>
127
+ <x-field data-name="onRemovePasskey" data-type="function" data-desc="Callback function triggered after a user successfully removes a Passkey."></x-field>
128
+ <x-field data-name="onSwitchPassport" data-type="function" data-desc="Callback function triggered after a user switches passports."></x-field>
129
+ <x-field data-name="session" data-type="object" data-desc="The current user session object, required for passport switching UI."></x-field>
130
+ </x-field-group>
131
+
132
+ ### 2. Usage with `usePasskey` Hook
133
+
134
+ The `usePasskey` hook provides all the necessary functions for Passkey registration and authentication.
135
+
136
+ ```jsx usePasskey Hook icon=logos:react
137
+ import { usePasskey } from '@arcblock/did-connect-react/lib/Passkey';
138
+ import { useSession } from '@arcblock/did-connect-react';
139
+
140
+ function PasskeyAuth() {
141
+ const { loginPasskey, connectPasskey, connecting } = usePasskey();
142
+ const { session } = useSession();
143
+
144
+ const handleLogin = async () => {
145
+ try {
146
+ const result = await loginPasskey();
147
+ console.log('Passkey login successful:', result);
148
+ // Handle login result
149
+ } catch (error) {
150
+ console.error('Passkey login failed:', error.message);
151
+ }
152
+ };
153
+
154
+ const handleConnect = async () => {
155
+ // This should be called when a user is already logged in
156
+ // and wants to add a passkey in their profile settings.
157
+ if (!session.user) {
158
+ alert('You must be logged in to add a passkey.');
159
+ return;
160
+ }
161
+ try {
162
+ await connectPasskey();
163
+ } catch (error) {
164
+ console.error('Failed to connect passkey:', error.message);
165
+ }
166
+ };
167
+
168
+ return (
169
+ <div>
170
+ <button onClick={handleLogin}>Login with Passkey</button>
171
+ {session.user && (
172
+ <button onClick={handleConnect} disabled={connecting}>
173
+ {connecting ? 'Connecting...' : 'Add a Passkey'}
174
+ </button>
175
+ )}
176
+ </div>
177
+ );
178
+ }
179
+ ```
180
+
181
+ ### Core Functions
182
+ - **`loginPasskey({ action, ... })`**: Initiates the Passkey authentication flow (also known as assertion). This is used for logging in existing users.
183
+ - **`connectPasskey(extraParams)`**: A high-level function to create and bind a new Passkey to the current user's account. It handles the full registration ceremony.
184
+ - **`disconnectPasskey({ session, connectedAccount })`**: Removes a Passkey from the current user's account after successful verification.
185
+ - **`createPasskey(params)`**: The lower-level function that starts the WebAuthn registration process. `connectPasskey` uses this internally.
186
+ - **`verifyPasskey(params)`**: The lower-level function that starts the WebAuthn authentication process. `loginPasskey` and `disconnectPasskey` use this internally.
187
+ - **`switchPassport(user)`**: Opens a dialog to switch between different user accounts (passports) that might share Passkeys.
188
+
189
+ ---
190
+
191
+ ## Federated Login
192
+
193
+ Federated Login allows a group of associated Blocklet applications (a "Federated Login Group") to share a single login session. When a user logs into the designated "master" site, they can be automatically authenticated on any "member" sites without needing to log in again.
194
+
195
+ ### 1. Concept and Setup
196
+
197
+ This feature relies on a master-member site configuration within your Blocklet's settings. The `FederatedProvider` component is required to handle the cross-domain communication needed for this to work in modern browsers, particularly for managing third-party cookie access.
198
+
199
+ Like other providers, `FederatedProvider` should be included in your component tree, typically within `SessionProvider`.
200
+
201
+ ```jsx FederatedProvider Setup icon=logos:react
202
+ import { SessionProvider } from '@arcblock/did-connect-react';
203
+ import { FederatedProvider } from '@arcblock/did-connect-react/lib/Federated';
204
+
205
+ function App() {
206
+ return (
207
+ <SessionProvider>
208
+ <FederatedProvider>
209
+ {/* Your application components */}
210
+ </FederatedProvider>
211
+ </SessionProvider>
212
+ );
213
+ }
214
+ ```
215
+
216
+ ### 2. Usage
217
+
218
+ Federated login logic is integrated directly into the session management. You can trigger it using the `loginFederated` function available on the `session` object returned by `useSession`.
219
+
220
+ `loginFederated` supports two modes:
221
+ - **`auto`**: Attempts to silently log the user in if they have an active session on the master site. This is ideal for checking on page load.
222
+ - **`manual`**: Initiates a standard DID Connect login flow. Upon successful login, it also establishes the federated session with the master site.
223
+
224
+ ```jsx Federated Login Example icon=logos:react
225
+ import { useSession } from '@arcblock/did-connect-react';
226
+ import React from 'react';
227
+
228
+ function FederatedLogin() {
229
+ const { session } = useSession();
230
+ const { federatedEnabled, loginFederated } = session;
231
+
232
+ // Attempt auto-login on component mount
233
+ React.useEffect(() => {
234
+ if (federatedEnabled) {
235
+ loginFederated((err) => {
236
+ if (err) {
237
+ console.warn('Auto federated login failed:', err);
238
+ } else {
239
+ console.log('Auto federated login successful!');
240
+ }
241
+ }, { mode: 'auto' });
242
+ }
243
+ }, [federatedEnabled, loginFederated]);
244
+
245
+ const handleManualLogin = () => {
246
+ loginFederated((err) => {
247
+ if (err) console.error('Manual federated login failed:', err);
248
+ }, { mode: 'manual' });
249
+ };
250
+
251
+ if (!federatedEnabled) {
252
+ return <p>Federated login is not enabled.</p>;
253
+ }
254
+
255
+ return (
256
+ <button onClick={handleManualLogin}>
257
+ Login with Master Site Account
258
+ </button>
259
+ );
260
+ }
261
+ ```