# 高级主题

当您熟悉 `SessionProvider` 和 `DidConnect` 等核心组件后，就可以开始探索 `@arcblock/did-connect-react` 库更强大、更灵活的功能了。本节将介绍一些高级主题，帮助您构建更复杂、更健壮、更用户友好的去中心化身份应用。

我们将探讨三个主要领域：

1.  **替代身份验证方法**：超越默认的二维码扫描方式，集成 OAuth（社交登录）、Passkeys（无密码登录）和统一登录等流行的登录方法。
2.  **实用工具函数**：利用一套辅助函数来处理常见任务，如 URL 编码、创建 API 客户端和管理弹出窗口。
3.  **错误处理**：学习如何优雅地处理常见错误，从弹出窗口被阻止到 WebAuthn API 失败，以确保流畅的用户体验。

---

## 身份验证方法

虽然 DID Connect 是主要的身份验证方法，但该库也无缝集成了其他流行的登录流程。这使您可以为用户提供多种登录方式，以满足不同的偏好和安全级别。

<x-card data-title="探索身份验证方法" data-icon="lucide:key-round" data-href="/advanced/authentication-methods" data-cta="了解更多">
深入了解在您的应用中实现 OAuth（社交登录）、Passkeys（无密码登录）和统一登录的详细指南。
</x-card>

## 实用工具

该库导出了一系列实用工具函数，旨在简化常见任务并减少应用程序中的样板代码。这些辅助工具涵盖了从数据编码和加密操作到管理身份验证流程的浏览器弹出窗口等所有方面。

<x-card data-title="浏览实用工具函数" data-icon="lucide:wrench" data-href="/advanced/utilities" data-cta="查看参考">
查看所有辅助函数的综合参考，包括 URL 操作、API 客户端创建、数据加密等示例。
</x-card>

## 错误处理

构建一个健壮的应用程序需要优雅的错误处理。`@arcblock/did-connect-react` 库提供了特定的错误类型和辅助函数，使这个过程更容易。

### 弹出窗口错误

当使用需要弹出窗口的身份验证方法（如 OAuth）时，浏览器的弹出窗口拦截器可能会造成干扰。如果 `openPopup` 函数无法打开窗口，它将抛出一个 `NotOpenError`。您应该捕获此错误并向用户提供适当的反馈。

```javascript 处理弹出窗口错误 icon=logos:javascript
import { openPopup, runPopup } from '@arcblock/did-connect-react/lib/utils';
import { NotOpenError } from '@arcblock/did-connect-react/lib/error';

async function startOAuthFlow(url) {
  try {
    const popup = openPopup(url);
    const result = await runPopup({ popup });
    console.log('OAuth 成功:', result);
  } catch (err) {
    if (err instanceof NotOpenError) {
      alert('弹出窗口被阻止。请允许此站点的弹出窗口并重试。');
    } else {
      alert(`发生错误: ${err.message}`);
    }
  }
}
```

### API 和 WebAuthn 错误

对于与后端服务或 WebAuthn API（由 Passkeys 使用）的交互，该库提供了辅助函数，可将复杂的错误对象解析为用户友好的消息。

- `getApiErrorMessage(err, defaultMessage)`：从 Axios 错误响应中提取错误消息。
- `getWebAuthnErrorMessage(err, defaultMessage, t)`：处理 WebAuthn 特定错误（例如，用户取消、浏览器不支持）并提供可翻译的用户友好消息。

```javascript 处理 WebAuthn 错误 icon=logos:javascript
import { usePasskey } from '@arcblock/did-connect-react';
import { getWebAuthnErrorMessage } from '@arcblock/did-connect-react/lib/utils';

function PasskeyLoginButton() {
  const { loginWithPasskey } = usePasskey();

  const handleLogin = async () => {
    try {
      await loginWithPasskey();
      // 处理成功登录
    } catch (err) {
      // 使用该实用工具获取用户友好的消息
      const friendlyMessage = getWebAuthnErrorMessage(err, '发生未知错误。');
      alert(friendlyMessage);
    }
  };

  return <button onClick={handleLogin}>使用 Passkey 登录</button>;
}
```

通过实施适当的错误处理，您可以在出现意外情况时显著改善用户体验。

---

## 后续步骤

既然您已经对高级功能有了大致了解，您可以更深入地研究与您的项目最相关的主题。

- **[身份验证方法](./advanced-authentication-methods.md)**：为您的用户实现新的登录方式。
- **[实用工具](./advanced-utilities.md)**：使用我们的辅助函数简化您的代码。
- **[API 参考](./api-reference.md)**：全面、详细地了解所有组件、钩子和函数。