@arcblock/did-connect-react 3.1.40 → 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,188 @@
1
+ # useOAuth & usePasskey
2
+
3
+ `DidConnect` コンポーネントと `useConnect` フックは、すべての認証方法に対応する包括的なビルド済み UI を提供しますが、カスタムの認証フローを構築する必要がある場合もあります。`useOAuth` フックと `usePasskey` フックは、ソーシャルログイン (OAuth) とパスワードレス認証 (Passkey) の基盤となるロジックへの直接アクセスを提供します。
4
+
5
+ これらのフックは、オーダーメイドのユーザーエクスペリエンスを作成するための強力なツールです。これらは、それぞれのコンテキストプロバイダーである `OAuthProvider` と `PasskeyProvider` に依存しており、これらは通常、メインの `SessionProvider` 内に含まれています。セッション管理の詳細については、[SessionProvider ドキュメント](./core-components-session-provider.md) を参照してください。
6
+
7
+ ## useOAuth
8
+
9
+ `useOAuth` フックは、サードパーティのソーシャルログインフローを処理するための関数と状態を提供します。
10
+
11
+ ### インポート
12
+
13
+ ```javascript icon=logos:javascript
14
+ import { useOAuth } from '@arcblock/did-connect-react/lib/OAuth';
15
+ ```
16
+
17
+ ### 戻り値
18
+
19
+ このフックは、以下のプロパティとメソッドを含むオブジェクトを返します。
20
+
21
+ <x-field-group>
22
+ <x-field data-name="loginOAuth" data-type="function" data-required="true">
23
+ <x-field-desc markdown>指定された OAuth プロバイダーでログインフローを開始します。ユーザー認証のためのポップアップを開き、ログイン結果で解決されるプロミスを返します。</x-field-desc>
24
+ </x-field>
25
+ <x-field data-name="bindOAuth" data-type="function" data-required="true">
26
+ <x-field-desc markdown>現在ログインしているユーザーのセッションに新しい OAuth アカウントをバインドします。</x-field-desc>
27
+ </x-field>
28
+ <x-field data-name="unbindOAuth" data-type="function" data-required="true">
29
+ <x-field-desc markdown>現在のユーザーのセッションから OAuth アカウントのバインドを解除します。</x-field-desc>
30
+ </x-field>
31
+ <x-field data-name="getOAuthConfigList" data-type="function" data-required="true">
32
+ <x-field-desc markdown>Blocklet 設定から有効で設定済みの OAuth プロバイダーのリストを取得します。プロバイダー設定オブジェクトの配列に解決されるプロミスを返します。</x-field-desc>
33
+ </x-field>
34
+ <x-field data-name="switchOAuthPassport" data-type="function" data-required="true">
35
+ <x-field-desc markdown>同じIDの異なる接続済みアカウント (パスポート) 間で切り替えるフローを開始します。</x-field-desc>
36
+ </x-field>
37
+ <x-field data-name="bindAuthLoading" data-type="boolean" data-required="true">
38
+ <x-field-desc markdown>`bindOAuth` 操作が進行中に `true` となるブール値フラグ。</x-field-desc>
39
+ </x-field>
40
+ <x-field data-name="unbindAuthLoading" data-type="boolean" data-required="true">
41
+ <x-field-desc markdown>`unbindOAuth` 操作が進行中に `true` となるブール値フラグ。</x-field-desc>
42
+ </x-field>
43
+ <x-field data-name="oauthState" data-type="object" data-required="true">
44
+ <x-field-desc markdown>認証プロセスのリアルタイムステータスを含むオブジェクト。</x-field-desc>
45
+ <x-field data-name="loading" data-type="boolean" data-desc="OAuth 操作が進行中の場合は True。"></x-field>
46
+ <x-field data-name="error" data-type="string" data-desc="操作が失敗した場合のエラーメッセージを含みます。"></x-field>
47
+ <x-field data-name="status" data-type="string" data-desc="フローの現在のステータス (例: 'scanned', 'succeed', 'error')。"></x-field>
48
+ </x-field>
49
+ </x-field-group>
50
+
51
+ ### 使用例
52
+
53
+ 以下は、カスタムソーシャルログインコンポーネントを構築する方法の例です。
54
+
55
+ ```jsx CustomSocialLogin.jsx icon=logos:react
56
+ import React, { useEffect, useState } from 'react';
57
+ import { useOAuth } from '@arcblock/did-connect-react/lib/OAuth';
58
+ import { useSession } from '@arcblock/did-connect-react/lib/Session';
59
+
60
+ export default function CustomSocialLogin() {
61
+ const { loginOAuth, getOAuthConfigList } = useOAuth();
62
+ const { session } = useSession();
63
+ const [providers, setProviders] = useState([]);
64
+ const [loading, setLoading] = useState(false);
65
+ const [error, setError] = useState('');
66
+
67
+ useEffect(() => {
68
+ // コンポーネントがマウントされたときに、利用可能な OAuth プロバイダーのリストを取得します
69
+ getOAuthConfigList().then(setProviders).catch(console.error);
70
+ }, [getOAuthConfigList]);
71
+
72
+ const handleLogin = async (provider) => {
73
+ setLoading(true);
74
+ setError('');
75
+ try {
76
+ const result = await loginOAuth({ provider: provider.provider });
77
+ // ログインが成功すると、セッションは SessionProvider によって自動的に更新されます。
78
+ console.log('Login successful:', result);
79
+ // ここでセッションを更新したり、ユーザーをリダイレクトしたりすることができます。
80
+ } catch (err) {
81
+ setError(err.message);
82
+ console.error('Login failed:', err);
83
+ } finally {
84
+ setLoading(false);
85
+ }
86
+ };
87
+
88
+ if (session.user) {
89
+ return <div>You are already logged in as {session.user.name}.</div>;
90
+ }
91
+
92
+ if (providers.length === 0) {
93
+ return <div>No social login methods configured.</div>;
94
+ }
95
+
96
+ return (
97
+ <div>
98
+ <h3>Login with Social Media</h3>
99
+ {providers.map((p) => (
100
+ <button key={p.provider} onClick={() => handleLogin(p)} disabled={loading}>
101
+ {loading ? 'Logging in...' : `Login with ${p.provider}`}
102
+ </button>
103
+ ))}
104
+ {error && <p style={{ color: 'red' }}>{error}</p>}
105
+ </div>
106
+ );
107
+ }
108
+ ```
109
+
110
+ ## usePasskey
111
+
112
+ `usePasskey` フックは、WebAuthn (Passkeys) を使用したパスワードレス認証を処理するための関数と状態を提供します。
113
+
114
+ ### インポート
115
+
116
+ ```javascript icon=logos:javascript
117
+ import { usePasskey } from '@arcblock/did-connect-react/lib/Passkey';
118
+ ```
119
+
120
+ ### 戻り値
121
+
122
+ このフックは、以下のプロパティとメソッドを含むオブジェクトを返します。
123
+
124
+ <x-field-group>
125
+ <x-field data-name="loginPasskey" data-type="function" data-required="true">
126
+ <x-field-desc markdown>既存の Passkey を使用してログインフローを開始します。ブラウザのネイティブ WebAuthn 認証プロンプトをトリガーします。</x-field-desc>
127
+ </x-field>
128
+ <x-field data-name="connectPasskey" data-type="function" data-required="true">
129
+ <x-field-desc markdown>新しい Passkey を作成し、現在のユーザーのセッションにバインドするフローを開始します。</x-field-desc>
130
+ </x-field>
131
+ <x-field data-name="disconnectPasskey" data-type="function" data-required="true">
132
+ <x-field-desc markdown>検証が成功した後、現在のユーザーのセッションから Passkey のバインドを解除します。</x-field-desc>
133
+ </x-field>
134
+ <x-field data-name="switchPassport" data-type="function" data-required="true">
135
+ <x-field-desc markdown>異なる接続済みアカウント (パスポート) 間で切り替えるフローを開始します。</x-field-desc>
136
+ </x-field>
137
+ <x-field data-name="connecting" data-type="boolean" data-required="true">
138
+ <x-field-desc markdown>`connectPasskey` 操作が進行中に `true` となるブール値フラグ。</x-field-desc>
139
+ </x-field>
140
+ <x-field data-name="disconnecting" data-type="boolean" data-required="true">
141
+ <x-field-desc markdown>`disconnectPasskey` 操作が進行中に `true` となるブール値フラグ。</x-field-desc>
142
+ </x-field>
143
+ <x-field data-name="passkeyState" data-type="object" data-required="true">
144
+ <x-field-desc markdown>Passkey 操作のリアルタイムステータスを含むオブジェクト。</x-field-desc>
145
+ <x-field data-name="loading" data-type="boolean" data-desc="Passkey 操作が進行中の場合は True。"></x-field>
146
+ <x-field data-name="creating" data-type="boolean" data-desc="Passkey 作成フェーズ中は True。"></x-field>
147
+ <x-field data-name="verifying" data-type="boolean" data-desc="Passkey 検証フェーズ中は True。"></x-field>
148
+ <x-field data-name="error" data-type="string" data-desc="操作が失敗した場合のエラーメッセージを含みます。"></x-field>
149
+ <x-field data-name="status" data-type="string" data-desc="フローの現在のステータス (例: 'scanned', 'succeed', 'error')。"></x-field>
150
+ </x-field>
151
+ </x-field-group>
152
+
153
+ ### 使用例
154
+
155
+ 以下は、「Passkeyでログイン」ボタンを作成する方法の例です。
156
+
157
+ ```jsx PasskeyLoginButton.jsx icon=logos:react
158
+ import React, { useState } from 'react';
159
+ import { usePasskey } from '@arcblock/did-connect-react/lib/Passkey';
160
+
161
+ export default function PasskeyLoginButton() {
162
+ const { loginPasskey, passkeyState } = usePasskey();
163
+ const [error, setError] = useState('');
164
+
165
+ const handleLogin = async () => {
166
+ setError('');
167
+ try {
168
+ const result = await loginPasskey();
169
+ console.log('Passkey login successful:', result);
170
+ // セッションは SessionProvider によって自動的に更新されます。
171
+ } catch (err) {
172
+ setError(err.message);
173
+ console.error('Passkey login failed:', err);
174
+ }
175
+ };
176
+
177
+ return (
178
+ <div>
179
+ <button onClick={handleLogin} disabled={passkeyState.loading}>
180
+ {passkeyState.loading ? 'Verifying...' : 'Login with Passkey'}
181
+ </button>
182
+ {error && <p style={{ color: 'red' }}>{error}</p>}
183
+ </div>
184
+ );
185
+ }
186
+ ```
187
+
188
+ これらのフックは、DID Connect の強力な認証機能を、完全にカスタムな UI でアプリケーションの任意の部分に統合する柔軟性を提供します。ビルド済みの `DidConnect` モーダルをプログラムで制御する方法については、[useConnect フックのドキュメント](./hooks-use-connect.md) に進んでください。
@@ -0,0 +1,188 @@
1
+ # useOAuth & usePasskey
2
+
3
+ While the `DidConnect` component and `useConnect` hook provide a comprehensive, pre-built UI for all authentication methods, you may need to build a custom authentication flow. The `useOAuth` and `usePasskey` hooks offer direct access to the underlying logic for social logins (OAuth) and passwordless authentication (Passkey).
4
+
5
+ These hooks are powerful tools for creating bespoke user experiences. They depend on their respective context providers, `OAuthProvider` and `PasskeyProvider`, which are typically included within the main `SessionProvider`. For more information on session management, see the [SessionProvider documentation](./core-components-session-provider.md).
6
+
7
+ ## useOAuth
8
+
9
+ The `useOAuth` hook provides functions and state for handling third-party social login flows.
10
+
11
+ ### Import
12
+
13
+ ```javascript icon=logos:javascript
14
+ import { useOAuth } from '@arcblock/did-connect-react/lib/OAuth';
15
+ ```
16
+
17
+ ### Return Value
18
+
19
+ The hook returns an object containing the following properties and methods:
20
+
21
+ <x-field-group>
22
+ <x-field data-name="loginOAuth" data-type="function" data-required="true">
23
+ <x-field-desc markdown>Initiates a login flow with a specified OAuth provider. It opens a popup for user authorization and returns a promise that resolves with the login result.</x-field-desc>
24
+ </x-field>
25
+ <x-field data-name="bindOAuth" data-type="function" data-required="true">
26
+ <x-field-desc markdown>Binds a new OAuth account to the currently logged-in user's session.</x-field-desc>
27
+ </x-field>
28
+ <x-field data-name="unbindOAuth" data-type="function" data-required="true">
29
+ <x-field-desc markdown>Unbinds an OAuth account from the current user's session.</x-field-desc>
30
+ </x-field>
31
+ <x-field data-name="getOAuthConfigList" data-type="function" data-required="true">
32
+ <x-field-desc markdown>Fetches the list of enabled and configured OAuth providers from the blocklet settings. Returns a promise that resolves to an array of provider configuration objects.</x-field-desc>
33
+ </x-field>
34
+ <x-field data-name="switchOAuthPassport" data-type="function" data-required="true">
35
+ <x-field-desc markdown>Initiates a flow to switch between different connected accounts (passports) of the same identity.</x-field-desc>
36
+ </x-field>
37
+ <x-field data-name="bindAuthLoading" data-type="boolean" data-required="true">
38
+ <x-field-desc markdown>A boolean flag that is `true` while the `bindOAuth` operation is in progress.</x-field-desc>
39
+ </x-field>
40
+ <x-field data-name="unbindAuthLoading" data-type="boolean" data-required="true">
41
+ <x-field-desc markdown>A boolean flag that is `true` while the `unbindOAuth` operation is in progress.</x-field-desc>
42
+ </x-field>
43
+ <x-field data-name="oauthState" data-type="object" data-required="true">
44
+ <x-field-desc markdown>An object containing the real-time status of the authentication process.</x-field-desc>
45
+ <x-field data-name="loading" data-type="boolean" data-desc="True if an OAuth operation is in progress."></x-field>
46
+ <x-field data-name="error" data-type="string" data-desc="Contains an error message if the operation failed."></x-field>
47
+ <x-field data-name="status" data-type="string" data-desc="The current status of the flow (e.g., 'scanned', 'succeed', 'error')."></x-field>
48
+ </x-field>
49
+ </x-field-group>
50
+
51
+ ### Usage Example
52
+
53
+ Here's an example of how to build a custom social login component.
54
+
55
+ ```jsx CustomSocialLogin.jsx icon=logos:react
56
+ import React, { useEffect, useState } from 'react';
57
+ import { useOAuth } from '@arcblock/did-connect-react/lib/OAuth';
58
+ import { useSession } from '@arcblock/did-connect-react/lib/Session';
59
+
60
+ export default function CustomSocialLogin() {
61
+ const { loginOAuth, getOAuthConfigList } = useOAuth();
62
+ const { session } = useSession();
63
+ const [providers, setProviders] = useState([]);
64
+ const [loading, setLoading] = useState(false);
65
+ const [error, setError] = useState('');
66
+
67
+ useEffect(() => {
68
+ // Fetch the list of available OAuth providers when the component mounts
69
+ getOAuthConfigList().then(setProviders).catch(console.error);
70
+ }, [getOAuthConfigList]);
71
+
72
+ const handleLogin = async (provider) => {
73
+ setLoading(true);
74
+ setError('');
75
+ try {
76
+ const result = await loginOAuth({ provider: provider.provider });
77
+ // After successful login, the session will be updated automatically by the SessionProvider.
78
+ console.log('Login successful:', result);
79
+ // You might want to refresh the session or redirect the user here.
80
+ } catch (err) {
81
+ setError(err.message);
82
+ console.error('Login failed:', err);
83
+ } finally {
84
+ setLoading(false);
85
+ }
86
+ };
87
+
88
+ if (session.user) {
89
+ return <div>You are already logged in as {session.user.name}.</div>;
90
+ }
91
+
92
+ if (providers.length === 0) {
93
+ return <div>No social login methods configured.</div>;
94
+ }
95
+
96
+ return (
97
+ <div>
98
+ <h3>Login with Social Media</h3>
99
+ {providers.map((p) => (
100
+ <button key={p.provider} onClick={() => handleLogin(p)} disabled={loading}>
101
+ {loading ? 'Logging in...' : `Login with ${p.provider}`}
102
+ </button>
103
+ ))}
104
+ {error && <p style={{ color: 'red' }}>{error}</p>}
105
+ </div>
106
+ );
107
+ }
108
+ ```
109
+
110
+ ## usePasskey
111
+
112
+ The `usePasskey` hook provides functions and state for handling passwordless authentication using WebAuthn (Passkeys).
113
+
114
+ ### Import
115
+
116
+ ```javascript icon=logos:javascript
117
+ import { usePasskey } from '@arcblock/did-connect-react/lib/Passkey';
118
+ ```
119
+
120
+ ### Return Value
121
+
122
+ The hook returns an object containing the following properties and methods:
123
+
124
+ <x-field-group>
125
+ <x-field data-name="loginPasskey" data-type="function" data-required="true">
126
+ <x-field-desc markdown>Initiates a login flow using an existing Passkey. It triggers the browser's native WebAuthn authentication prompt.</x-field-desc>
127
+ </x-field>
128
+ <x-field data-name="connectPasskey" data-type="function" data-required="true">
129
+ <x-field-desc markdown>Initiates a flow to create and bind a new Passkey to the current user's session.</x-field-desc>
130
+ </x-field>
131
+ <x-field data-name="disconnectPasskey" data-type="function" data-required="true">
132
+ <x-field-desc markdown>Unbinds a Passkey from the current user's session after successful verification.</x-field-desc>
133
+ </x-field>
134
+ <x-field data-name="switchPassport" data-type="function" data-required="true">
135
+ <x-field-desc markdown>Initiates a flow to switch between different connected accounts (passports).</x-field-desc>
136
+ </x-field>
137
+ <x-field data-name="connecting" data-type="boolean" data-required="true">
138
+ <x-field-desc markdown>A boolean flag that is `true` while the `connectPasskey` operation is in progress.</x-field-desc>
139
+ </x-field>
140
+ <x-field data-name="disconnecting" data-type="boolean" data-required="true">
141
+ <x-field-desc markdown>A boolean flag that is `true` while the `disconnectPasskey` operation is in progress.</x-field-desc>
142
+ </x-field>
143
+ <x-field data-name="passkeyState" data-type="object" data-required="true">
144
+ <x-field-desc markdown>An object containing the real-time status of the Passkey operation.</x-field-desc>
145
+ <x-field data-name="loading" data-type="boolean" data-desc="True if a Passkey operation is in progress."></x-field>
146
+ <x-field data-name="creating" data-type="boolean" data-desc="True during the Passkey creation phase."></x-field>
147
+ <x-field data-name="verifying" data-type="boolean" data-desc="True during the Passkey verification phase."></x-field>
148
+ <x-field data-name="error" data-type="string" data-desc="Contains an error message if the operation failed."></x-field>
149
+ <x-field data-name="status" data-type="string" data-desc="The current status of the flow (e.g., 'scanned', 'succeed', 'error')."></x-field>
150
+ </x-field>
151
+ </x-field-group>
152
+
153
+ ### Usage Example
154
+
155
+ Here's an example of how to create a "Login with Passkey" button.
156
+
157
+ ```jsx PasskeyLoginButton.jsx icon=logos:react
158
+ import React, { useState } from 'react';
159
+ import { usePasskey } from '@arcblock/did-connect-react/lib/Passkey';
160
+
161
+ export default function PasskeyLoginButton() {
162
+ const { loginPasskey, passkeyState } = usePasskey();
163
+ const [error, setError] = useState('');
164
+
165
+ const handleLogin = async () => {
166
+ setError('');
167
+ try {
168
+ const result = await loginPasskey();
169
+ console.log('Passkey login successful:', result);
170
+ // The session will be updated automatically by the SessionProvider.
171
+ } catch (err) {
172
+ setError(err.message);
173
+ console.error('Passkey login failed:', err);
174
+ }
175
+ };
176
+
177
+ return (
178
+ <div>
179
+ <button onClick={handleLogin} disabled={passkeyState.loading}>
180
+ {passkeyState.loading ? 'Verifying...' : 'Login with Passkey'}
181
+ </button>
182
+ {error && <p style={{ color: 'red' }}>{error}</p>}
183
+ </div>
184
+ );
185
+ }
186
+ ```
187
+
188
+ These hooks provide the flexibility to integrate DID Connect's powerful authentication features into any part of your application with a completely custom UI. To learn about programmatically controlling the pre-built `DidConnect` modal, proceed to the [useConnect hook documentation](./hooks-use-connect.md).
@@ -0,0 +1,188 @@
1
+ # useOAuth & usePasskey
2
+
3
+ 雖然 `DidConnect` 元件和 `useConnect` hook 為所有驗證方法提供了一套全面、預先建置好的 UI,但您可能需要建置自訂的驗證流程。`useOAuth` 和 `usePasskey` hook 提供了直接存取社交登入(OAuth)和無密碼驗證(Passkey)底層邏輯的方法。
4
+
5
+ 這些 hook 是建立客製化使用者體驗的強大工具。它們依賴於各自的 context provider,即 `OAuthProvider` 和 `PasskeyProvider`,而這些 provider 通常包含在主 `SessionProvider` 中。有關 session 管理的更多資訊,請參閱 [SessionProvider 文件](./core-components-session-provider.md)。
6
+
7
+ ## useOAuth
8
+
9
+ `useOAuth` hook 提供了用於處理第三方社交登入流程的函式和狀態。
10
+
11
+ ### 匯入
12
+
13
+ ```javascript icon=logos:javascript
14
+ import { useOAuth } from '@arcblock/did-connect-react/lib/OAuth';
15
+ ```
16
+
17
+ ### 返回值
18
+
19
+ 此 hook 會返回一個包含以下屬性和方法的物件:
20
+
21
+ <x-field-group>
22
+ <x-field data-name="loginOAuth" data-type="function" data-required="true">
23
+ <x-field-desc markdown>使用指定的 OAuth provider 啟動登入流程。它會開啟一個彈出視窗供使用者授權,並返回一個 promise,該 promise 會解析為登入結果。</x-field-desc>
24
+ </x-field>
25
+ <x-field data-name="bindOAuth" data-type="function" data-required="true">
26
+ <x-field-desc markdown>將新的 OAuth 帳號綁定到目前登入使用者的 session。</x-field-desc>
27
+ </x-field>
28
+ <x-field data-name="unbindOAuth" data-type="function" data-required="true">
29
+ <x-field-desc markdown>從目前使用者的 session 解除綁定一個 OAuth 帳號。</x-field-desc>
30
+ </x-field>
31
+ <x-field data-name="getOAuthConfigList" data-type="function" data-required="true">
32
+ <x-field-desc markdown>從 blocklet 設定中取得已啟用和已設定的 OAuth provider 列表。返回一個 promise,該 promise 會解析為一個 provider 設定物件的陣列。</x-field-desc>
33
+ </x-field>
34
+ <x-field data-name="switchOAuthPassport" data-type="function" data-required="true">
35
+ <x-field-desc markdown>啟動一個流程,以在相同身分的不同已連接帳號(passports)之間切換。</x-field-desc>
36
+ </x-field>
37
+ <x-field data-name="bindAuthLoading" data-type="boolean" data-required="true">
38
+ <x-field-desc markdown>一個布林值標誌,在 `bindOAuth` 操作進行中時為 `true`。</x-field-desc>
39
+ </x-field>
40
+ <x-field data-name="unbindAuthLoading" data-type="boolean" data-required="true">
41
+ <x-field-desc markdown>一個布林值標誌,在 `unbindOAuth` 操作進行中時為 `true`。</x-field-desc>
42
+ </x-field>
43
+ <x-field data-name="oauthState" data-type="object" data-required="true">
44
+ <x-field-desc markdown>一個包含驗證過程即時狀態的物件。</x-field-desc>
45
+ <x-field data-name="loading" data-type="boolean" data-desc="如果 OAuth 操作正在進行中,則為 True。"></x-field>
46
+ <x-field data-name="error" data-type="string" data-desc="如果操作失敗,則包含錯誤訊息。"></x-field>
47
+ <x-field data-name="status" data-type="string" data-desc="流程的目前狀態(例如 'scanned', 'succeed', 'error')。"></x-field>
48
+ </x-field>
49
+ </x-field-group>
50
+
51
+ ### 使用範例
52
+
53
+ 這是一個如何建置自訂社交登入元件的範例。
54
+
55
+ ```jsx CustomSocialLogin.jsx icon=logos:react
56
+ import React, { useEffect, useState } from 'react';
57
+ import { useOAuth } from '@arcblock/did-connect-react/lib/OAuth';
58
+ import { useSession } from '@arcblock/did-connect-react/lib/Session';
59
+
60
+ export default function CustomSocialLogin() {
61
+ const { loginOAuth, getOAuthConfigList } = useOAuth();
62
+ const { session } = useSession();
63
+ const [providers, setProviders] = useState([]);
64
+ const [loading, setLoading] = useState(false);
65
+ const [error, setError] = useState('');
66
+
67
+ useEffect(() => {
68
+ // 當元件掛載時,取得可用的 OAuth provider 列表
69
+ getOAuthConfigList().then(setProviders).catch(console.error);
70
+ }, [getOAuthConfigList]);
71
+
72
+ const handleLogin = async (provider) => {
73
+ setLoading(true);
74
+ setError('');
75
+ try {
76
+ const result = await loginOAuth({ provider: provider.provider });
77
+ // 成功登入後,SessionProvider 會自動更新 session。
78
+ console.log('Login successful:', result);
79
+ // 您可能需要在此處重新整理 session 或重新導向使用者。
80
+ } catch (err) {
81
+ setError(err.message);
82
+ console.error('Login failed:', err);
83
+ } finally {
84
+ setLoading(false);
85
+ }
86
+ };
87
+
88
+ if (session.user) {
89
+ return <div>You are already logged in as {session.user.name}.</div>;
90
+ }
91
+
92
+ if (providers.length === 0) {
93
+ return <div>No social login methods configured.</div>;
94
+ }
95
+
96
+ return (
97
+ <div>
98
+ <h3>Login with Social Media</h3>
99
+ {providers.map((p) => (
100
+ <button key={p.provider} onClick={() => handleLogin(p)} disabled={loading}>
101
+ {loading ? 'Logging in...' : `Login with ${p.provider}`}
102
+ </button>
103
+ ))}
104
+ {error && <p style={{ color: 'red' }}>{error}</p>}
105
+ </div>
106
+ );
107
+ }
108
+ ```
109
+
110
+ ## usePasskey
111
+
112
+ `usePasskey` hook 提供了使用 WebAuthn(Passkeys)處理無密碼驗證的函式和狀態。
113
+
114
+ ### 匯入
115
+
116
+ ```javascript icon=logos:javascript
117
+ import { usePasskey } from '@arcblock/did-connect-react/lib/Passkey';
118
+ ```
119
+
120
+ ### 返回值
121
+
122
+ 此 hook 會返回一個包含以下屬性和方法的物件:
123
+
124
+ <x-field-group>
125
+ <x-field data-name="loginPasskey" data-type="function" data-required="true">
126
+ <x-field-desc markdown>使用現有的 Passkey 啟動登入流程。它會觸發瀏覽器原生的 WebAuthn 驗證提示。</x-field-desc>
127
+ </x-field>
128
+ <x-field data-name="connectPasskey" data-type="function" data-required="true">
129
+ <x-field-desc markdown>啟動一個流程,以建立並將新的 Passkey 綁定到目前使用者的 session。</x-field-desc>
130
+ </x-field>
131
+ <x-field data-name="disconnectPasskey" data-type="function" data-required="true">
132
+ <x-field-desc markdown>成功驗證後,從目前使用者的 session 解除綁定 Passkey。</x-field-desc>
133
+ </x-field>
134
+ <x-field data-name="switchPassport" data-type="function" data-required="true">
135
+ <x-field-desc markdown>啟動一個流程,以在不同的已連接帳號(passports)之間切換。</x-field-desc>
136
+ </x-field>
137
+ <x-field data-name="connecting" data-type="boolean" data-required="true">
138
+ <x-field-desc markdown>一個布林值標誌,在 `connectPasskey` 操作進行中時為 `true`。</x-field-desc>
139
+ </x-field>
140
+ <x-field data-name="disconnecting" data-type="boolean" data-required="true">
141
+ <x-field-desc markdown>一個布林值標誌,在 `disconnectPasskey` 操作進行中時為 `true`。</x-field-desc>
142
+ </x-field>
143
+ <x-field data-name="passkeyState" data-type="object" data-required="true">
144
+ <x-field-desc markdown>一個包含 Passkey 操作即時狀態的物件。</x-field-desc>
145
+ <x-field data-name="loading" data-type="boolean" data-desc="如果 Passkey 操作正在進行中,則為 True。"></x-field>
146
+ <x-field data-name="creating" data-type="boolean" data-desc="在 Passkey 建立階段為 True。"></x-field>
147
+ <x-field data-name="verifying" data-type="boolean" data-desc="在 Passkey 驗證階段為 True。"></x-field>
148
+ <x-field data-name="error" data-type="string" data-desc="如果操作失敗,則包含錯誤訊息。"></x-field>
149
+ <x-field data-name="status" data-type="string" data-desc="流程的目前狀態(例如 'scanned', 'succeed', 'error')。"></x-field>
150
+ </x-field>
151
+ </x-field-group>
152
+
153
+ ### 使用範例
154
+
155
+ 這是一個如何建立「使用 Passkey 登入」按鈕的範例。
156
+
157
+ ```jsx PasskeyLoginButton.jsx icon=logos:react
158
+ import React, { useState } from 'react';
159
+ import { usePasskey } from '@arcblock/did-connect-react/lib/Passkey';
160
+
161
+ export default function PasskeyLoginButton() {
162
+ const { loginPasskey, passkeyState } = usePasskey();
163
+ const [error, setError] = useState('');
164
+
165
+ const handleLogin = async () => {
166
+ setError('');
167
+ try {
168
+ const result = await loginPasskey();
169
+ console.log('Passkey login successful:', result);
170
+ // SessionProvider 會自動更新 session。
171
+ } catch (err) {
172
+ setError(err.message);
173
+ console.error('Passkey login failed:', err);
174
+ }
175
+ };
176
+
177
+ return (
178
+ <div>
179
+ <button onClick={handleLogin} disabled={passkeyState.loading}>
180
+ {passkeyState.loading ? 'Verifying...' : 'Login with Passkey'}
181
+ </button>
182
+ {error && <p style={{ color: 'red' }}>{error}</p>}
183
+ </div>
184
+ );
185
+ }
186
+ ```
187
+
188
+ 這些 hook 提供了將 DID Connect 強大的驗證功能整合到您應用程式的任何部分,並使用完全自訂 UI 的靈活性。要了解如何以程式化方式控制預先建置的 `DidConnect` 互動視窗,請繼續閱讀 [useConnect hook 文件](./hooks-use-connect.md)。