跳到主要內容

工具程式

@arcblock/did-connect-react 函式庫匯出了一系列工具函式,旨在簡化與身份驗證流程、資料處理和 API 通訊相關的常見任務。雖然核心元件和掛鉤(hooks)處理了大多數使用情境,但這些工具程式為進階整合或自訂實作提供了精細的控制。

API 客戶端

createAxios

此函式是一個用於建立預先設定的 axios 實例的工廠。它會自動包含必要的標頭,如 x-did-connect-versionx-blocklet-visitor-id,以確保與基於 Blocklet 的服務正常通訊。這是您應用程式中建立 API 客戶端的建議方法。

參數

  • options object — 標準的 Axios 設定物件。
  • lazyOptions object — 延遲發送的設定。
    • lazy boolean (default: false) — 是否啟用延遲發送。
    • lazyTime number (default: 300) — 延遲發送的去抖動時間(毫秒)。

回傳值

  • axiosInstance AxiosInstance — 一個已設定的 Axios 實例。

範例

apiClient.js

javascript
import { createAxios } from '@arcblock/did-connect-react/lib/utils';

const apiClient = createAxios({
  baseURL: '/api',
});

export default apiClient;

URL 和彈出視窗處理

這些函式有助於管理在 DID Connect 身份驗證過程中使用的 URL 和彈出視窗。

函式說明
encodeConnectUrl(url)將 URL 編碼,以便安全地作為 __connect_url__ 查詢參數傳遞。
decodeConnectUrl(encoded)解碼由 encodeConnectUrl 編碼的 URL。
parseTokenFromConnectUrl(connectUrl)從 DID Connect URL 中提取會話權杖 (_t_)。
openPopup(url, options)開啟一個新的、置中的彈出視窗。DidConnect 元件內部使用它來顯示錢包連接介面。如果彈出視窗被阻擋,則會拋出 NotOpenError
runPopup(config)一個基於 promise 的包裝器,用於管理由 openPopup 建立的彈出視窗的生命週期。它監聽來自彈出視窗的 message 事件,處理超時,並在身份驗證流程完成時解析。
decodeUrlParams()從當前視窗的 URL 中解析自訂的 __did-connect__ 參數。

範例:自訂彈出視窗流程

customAuthButton.js

javascript
import { openPopup, runPopup } from '@arcblock/did-connect-react/lib/utils';

const handleCustomLogin = async () => {
  const authUrl = 'https://your-auth-service.com/connect';
  try {
    const popup = openPopup(authUrl);
    const result = await runPopup({ popup, timeoutInSeconds: 600 });
    console.log('Authentication successful:', result);
    // Handle successful login
  } catch (error) {
    console.error('Authentication failed:', error.message);
    // Handle popup closed or timeout
  }
};

這些輔助函式用於將使用者連接資訊讀寫到 Cookie,從而實現跨頁面載入的會話持久性。

函式說明
getConnectedInfo(data)將來自連接請求的原始回應資料格式化為適合 Cookie 儲存的標準化物件。
updateConnectedInfo(info, parsed)在成功連接後設定必要的 Cookie (connected_did, connected_pk, connected_app)。這讓函式庫可以優化後續的身份驗證檢查。
getVisitorId()從 Cookie 中檢索唯一訪客 ID。
setVisitorId(id)在 Cookie 中設定唯一訪客 ID。

範例

sessionManager.js

javascript
import { getConnectedInfo, updateConnectedInfo } from '@arcblock/did-connect-react/lib/utils';

// Assuming 'authResponse' is the object returned from your login API
function persistSession(authResponse) {
  const connectedInfo = getConnectedInfo(authResponse);
  updateConnectedInfo(connectedInfo, true);
  console.log('Session info saved to cookies.');
}

加密工具

對於需要客戶端加密或解密的進階情境,該函式庫公開了包裝 tweetnacl-sealedbox-js 函式庫的輔助函式。

函式說明
encodeKey(key)將金鑰進行 Base64URL 編碼以便傳輸。
decodeKey(str)將 Base64URL 字串解碼為 Uint8Array 金鑰。
encrypt(value, encryptKey)使用公鑰加密字串值。
decrypt(value, encryptKey, decryptKey)使用對應的公鑰和私鑰解密 base64 字串。

錯誤處理

為了向使用者提供更好的回饋,您可以使用這些函式將技術性錯誤物件解析為人類可讀的訊息。

函式說明
getApiErrorMessage(err, defaultMessage)axios 錯誤物件中提取使用者友善的錯誤訊息。
getWebAuthnErrorMessage(err, defaultMessage, t)處理 WebAuthn/Passkey 特定錯誤(例如,使用者取消、瀏覽器不支援),並回傳本地化的、使用者友善的訊息。

範例

errorHandling.js

javascript
import { getApiErrorMessage } from '@arcblock/did-connect-react/lib/utils';
import apiClient from './apiClient';

async function fetchData() {
  try {
    const response = await apiClient.get('/data');
    return response.data;
  } catch (error) {
    const message = getApiErrorMessage(error, 'Failed to fetch data.');
    alert(message);
  }
}

透過利用這些工具程式,您可以建立更複雜和自訂的身份驗證體驗。有關所有匯出成員及其類型的完整列表,請參閱 API 參考