DidConnect コンポーネントと useConnect フックは、すべての認証方法に対応する包括的なビルド済み UI を提供しますが、カスタムの認証フローを構築する必要がある場合もあります。useOAuth フックと usePasskey フックは、ソーシャルログイン (OAuth) とパスワードレス認証 (Passkey) の基盤となるロジックへの直接アクセスを提供します。
これらのフックは、オーダーメイドのユーザーエクスペリエンスを作成するための強力なツールです。これらは、それぞれのコンテキストプロバイダーである OAuthProvider と PasskeyProvider に依存しており、これらは通常、メインの SessionProvider 内に含まれています。セッション管理の詳細については、SessionProvider ドキュメント を参照してください。
useOAuth
useOAuth フックは、サードパーティのソーシャルログインフローを処理するための関数と状態を提供します。
インポート
import { useOAuth } from '@arcblock/did-connect-react/lib/OAuth';戻り値
このフックは、以下のプロパティとメソッドを含むオブジェクトを返します。
- loginOAuth
function(required) — 指定された OAuth プロバイダーでログインフローを開始します。ユーザー認証のためのポップアップを開き、ログイン結果で解決されるプロミスを返します。 - bindOAuth
function(required) — 現在ログインしているユーザーのセッションに新しい OAuth アカウントをバインドします。 - unbindOAuth
function(required) — 現在のユーザーのセッションから OAuth アカウントのバインドを解除します。 - getOAuthConfigList
function(required) — Blocklet 設定から有効で設定済みの OAuth プロバイダーのリストを取得します。プロバイダー設定オブジェクトの配列に解決されるプロミスを返します。 - switchOAuthPassport
function(required) — 同じIDの異なる接続済みアカウント (パスポート) 間で切り替えるフローを開始します。 - bindAuthLoading
boolean(required) — bindOAuth 操作が進行中に true となるブール値フラグ。 - unbindAuthLoading
boolean(required) — unbindOAuth 操作が進行中に true となるブール値フラグ。 - oauthState
object(required) — 認証プロセスのリアルタイムステータスを含むオブジェクト。- loading
boolean— OAuth 操作が進行中の場合は True。 - error
string— 操作が失敗した場合のエラーメッセージを含みます。 - status
string— フローの現在のステータス (例: 'scanned', 'succeed', 'error')。
- loading
使用例
以下は、カスタムソーシャルログインコンポーネントを構築する方法の例です。
CustomSocialLogin.jsx
import React, { useEffect, useState } from 'react';
import { useOAuth } from '@arcblock/did-connect-react/lib/OAuth';
import { useSession } from '@arcblock/did-connect-react/lib/Session';
export default function CustomSocialLogin() {
const { loginOAuth, getOAuthConfigList } = useOAuth();
const { session } = useSession();
const [providers, setProviders] = useState([]);
const [loading, setLoading] = useState(false);
const [error, setError] = useState('');
useEffect(() => {
// コンポーネントがマウントされたときに、利用可能な OAuth プロバイダーのリストを取得します
getOAuthConfigList().then(setProviders).catch(console.error);
}, [getOAuthConfigList]);
const handleLogin = async (provider) => {
setLoading(true);
setError('');
try {
const result = await loginOAuth({ provider: provider.provider });
// ログインが成功すると、セッションは SessionProvider によって自動的に更新されます。
console.log('Login successful:', result);
// ここでセッションを更新したり、ユーザーをリダイレクトしたりすることができます。
} catch (err) {
setError(err.message);
console.error('Login failed:', err);
} finally {
setLoading(false);
}
};
if (session.user) {
return <div>You are already logged in as {session.user.name}.</div>;
}
if (providers.length === 0) {
return <div>No social login methods configured.</div>;
}
return (
<div>
<h3>Login with Social Media</h3>
{providers.map((p) => (
<button key={p.provider} onClick={() => handleLogin(p)} disabled={loading}>
{loading ? 'Logging in...' : `Login with ${p.provider}`}
</button>
))}
{error && <p style={{ color: 'red' }}>{error}</p>}
</div>
);
}usePasskey
usePasskey フックは、WebAuthn (Passkeys) を使用したパスワードレス認証を処理するための関数と状態を提供します。
インポート
import { usePasskey } from '@arcblock/did-connect-react/lib/Passkey';戻り値
このフックは、以下のプロパティとメソッドを含むオブジェクトを返します。
- loginPasskey
function(required) — 既存の Passkey を使用してログインフローを開始します。ブラウザのネイティブ WebAuthn 認証プロンプトをトリガーします。 - connectPasskey
function(required) — 新しい Passkey を作成し、現在のユーザーのセッションにバインドするフローを開始します。 - disconnectPasskey
function(required) — 検証が成功した後、現在のユーザーのセッションから Passkey のバインドを解除します。 - switchPassport
function(required) — 異なる接続済みアカウント (パスポート) 間で切り替えるフローを開始します。 - connecting
boolean(required) — connectPasskey 操作が進行中に true となるブール値フラグ。 - disconnecting
boolean(required) — disconnectPasskey 操作が進行中に true となるブール値フラグ。 - passkeyState
object(required) — Passkey 操作のリアルタイムステータスを含むオブジェクト。- loading
boolean— Passkey 操作が進行中の場合は True。 - creating
boolean— Passkey 作成フェーズ中は True。 - verifying
boolean— Passkey 検証フェーズ中は True。 - error
string— 操作が失敗した場合のエラーメッセージを含みます。 - status
string— フローの現在のステータス (例: 'scanned', 'succeed', 'error')。
- loading
使用例
以下は、「Passkeyでログイン」ボタンを作成する方法の例です。
PasskeyLoginButton.jsx
import React, { useState } from 'react';
import { usePasskey } from '@arcblock/did-connect-react/lib/Passkey';
export default function PasskeyLoginButton() {
const { loginPasskey, passkeyState } = usePasskey();
const [error, setError] = useState('');
const handleLogin = async () => {
setError('');
try {
const result = await loginPasskey();
console.log('Passkey login successful:', result);
// セッションは SessionProvider によって自動的に更新されます。
} catch (err) {
setError(err.message);
console.error('Passkey login failed:', err);
}
};
return (
<div>
<button onClick={handleLogin} disabled={passkeyState.loading}>
{passkeyState.loading ? 'Verifying...' : 'Login with Passkey'}
</button>
{error && <p style={{ color: 'red' }}>{error}</p>}
</div>
);
}これらのフックは、DID Connect の強力な認証機能を、完全にカスタムな UI でアプリケーションの任意の部分に統合する柔軟性を提供します。ビルド済みの DidConnect モーダルをプログラムで制御する方法については、useConnect フックのドキュメント に進んでください。