概述

身份验证#

Agentic Wallet 支持两种验证方式#

使用邮箱验证 Agentic Wallet#

用邮箱即可创建/使用钱包,无需注册开发者账号或配置密钥,适合快速上手体验。

第一步

告诉你的 Agent:

Plain
使用邮箱登录 Agentic Wallet

第二步

输入你的邮箱,并等待验证码返回:

Plain
<email>

第三步

输入验证码:

Plain
<otp-code>

验证通过,首次登录 Agent 会自动创建钱包:

Plain
钱包创建成功!
EVM 地址:    <evm-address>
Solana 地址: <solana-address>
说明
私钥在 TEE 环境中生成和保管,不会暴露给任何人,包括你的 Agent。同一邮箱再次登录将恢复已有钱包,无需重新创建。

使用 API Key 验证 Agentic Wallet#

通过 OKX 开发者后台生成 API Key、Secret Key 和 Passphrase,写入 .env 文件完成认证。可调用更多开发者接口,适合需要完整 API 能力的场景。

  1. 前往 OKX 开发者平台
  2. 生成你的 API Key、Secret Key 和 Passphrase

告诉你的 Agent:

Plain
创建一个 .env 文件,包含以下变量:OKX_API_KEY、OKX_SECRET_KEY 和 OKX_PASSPHRASE。
同时把 .env 添加到 .gitignore。为我打开 .env 并告诉我下一步该做什么,提醒我保存文件。

Agent 会创建文件并打开它——把你的密钥粘贴进去即可。

注意
切勿将 .env 提交到 git(请添加到 .gitignore),也不要在日志、截图或聊天中暴露这些凭证。

通过 API Key 验证,使用 Onchain OS#

使用 Onchain OS Skills/Open API 也可以通过 API Key 验证,你需要先在开发者管理平台创建项目并生成 API key。详细的步骤和相关资源请参考这里

所有对 API 发起访问的请求都需要包括下面信息来进行身份认证。

  • OK-ACCESS-KEY:API key
  • OK-ACCESS-TIMESTAMP:发起请求的时间 (UTC)。ISO 格式,如:2020-12-08T09:08:57.715Z
  • OK-ACCESS-PASSPHRASE:创建 API key 时指定的 passphrase
  • OK-ACCESS-SIGN:签名

签名步骤:

  • 第一步:将 timestamp、method、requestPath、body 拼接成一个字符串
  • 第二步:以 HMAC SHA256 算法和 secret key (在创建 API key 时生成) 对预哈希字符串 (第一步产生的结果) 进行签名
  • 第三步:以 Base64 算法对签名进行编码
解释
例如,sign=CryptoJS.enc.Base64.stringify(CryptoJS.HmacSHA256(timestamp + 'GET' + '/api/v6/dex/aggregator/swap', SecretKey))。其中,timestamp 与 OK-ACCESS-TIMESTAMP 必须相同。GET 是 method(HTTP请求方法,字母全部大写)。/api/v6/dex/aggregator/swap 是 requestPath(请求接口路径)。body 为空,如果请求没有请求体(通常为 GET 请求),那 body 可省略。
注意
时间戳与服务端时差不得超过 30 秒。POST 请求需包含原始请求体参与签名计算。Secret key 仅创建时可见,请通过安全渠道存储。

Postman 示例

Postman 是一款流行的 API 开发和测试工具,允许开发人员设计、测试和记录 API。它提供了对用户友好的图形界面,用于向 API 发送 HTTP 请求。

如果你还没有安装 Postman,你可以免费从 Postman 网站下载它:https://www.postman.com/

提示
这个示例需要你具备对 Postman 的基础理解。

添加参数#

  • 这通常适用于 GET 请求。
  • 如果你的请求需要查询参数,你可以在 Params 选项卡下添加它们。在这里,你可以添加查询参数的 key-value pair。

设置标题#

Headers 选项卡下,添加以下键-值对:

  • OK-ACCESS-KEY
  • OK-ACCESS-PASSPHRASE

添加正文#

  • 这通常适用于 POST 请求。
  • 如果你的请求需要一个请求主体,你可以在 Body 选项卡下添加它们。
  • 在下拉菜单中选择 rawJSON
  • 使用 JSON 格式输入你的请求主体。

设置预请求脚本#

  • 用于生成所需的签名 (OK-ACCESS-SIGN) 和时间戳 (OK-ACCESS-TIMESTAMP)。
  • Pre-request Script 选项卡下,插入与请求类型相对应的脚本。
  • 在生成预哈希字符串时,GET 请求会排除请求主体。
  • 根据需要编辑密钥。

GET 请求:

Javascript
var method = pm.request.method;
var now = new Date();
var isoString = now.toISOString();
var path = pm.request.url.getPathWithQuery();
var sign=CryptoJS.enc.Base64.stringify(CryptoJS.HmacSHA256(isoString + method + path, pm.variables.replaceIn('{{secret_key}}')));

pm.request.headers.add({
    key: 'OK-ACCESS-SIGN',
    value: sign
});

pm.request.headers.add({
    key: 'OK-ACCESS-TIMESTAMP',
    value: isoString
});

POST 请求:

Javascript
var method = pm.request.method;
var now = new Date();
var isoString = now.toISOString();
var path = pm.request.url.getPathWithQuery();
var bodyStr = pm.request.body.raw;
var sign=CryptoJS.enc.Base64.stringify(CryptoJS.HmacSHA256(isoString + method + path + bodyStr, pm.variables.replaceIn('{{secret_key}}')))

pm.request.headers.add({
    key: 'OK-ACCESS-SIGN',
    value: sign
});

pm.request.headers.add({
    key: 'OK-ACCESS-TIMESTAMP',
    value: isoString
});

Javascript 示例

若要通过 Javascript 脚本调用 API,请参考以下代码示例:

Javascript
const https = require('https');
const crypto = require('crypto');
const querystring = require('querystring');

// 定义 API 凭证
const api_config = {
  "api_key": '',
  "secret_key": '',
  "passphrase": '',
};

function preHash(timestamp, method, request_path, params) {
  // 根据字符串和参数创建预签名
  let query_string = '';
  if (method === 'GET' && params) {
    query_string = '?' + querystring.stringify(params);
  }
  if (method === 'POST' && params) {
    query_string = JSON.stringify(params);
  }
  return timestamp + method + request_path + query_string;
}

function sign(message, secret_key) {
  // 使用 HMAC-SHA256 对预签名字符串进行签名
  const hmac = crypto.createHmac('sha256', secret_key);
  hmac.update(message);
  return hmac.digest('base64');
}

function createSignature(method, request_path, params) {
  // 获取 ISO 8601 格式时间戳
  const timestamp = new Date().toISOString().slice(0, -5) + 'Z';
  // 生成签名
  const message = preHash(timestamp, method, request_path, params);
  const signature = sign(message, api_config['secret_key']);
  return { signature, timestamp };
}

function sendGetRequest(request_path, params) {
  // 生成签名
  const { signature, timestamp } = createSignature("GET", request_path, params);

  // 生成请求头
  const headers = {
    'OK-ACCESS-KEY': api_config['api_key'],
    'OK-ACCESS-SIGN': signature,
    'OK-ACCESS-TIMESTAMP': timestamp,
    'OK-ACCESS-PASSPHRASE': api_config['passphrase'],
  };

  const options = {
    hostname: 'web3.okx.com',
    path: request_path + (params ? `?${querystring.stringify(params)}` : ''),
    method: 'GET',
    headers: headers
  };

  const req = https.request(options, (res) => {
    let data = '';
    res.on('data', (chunk) => {
      data += chunk;
    });
    res.on('end', () => {
      console.log(data);
    });
  });

  req.end();
}

function sendPostRequest(request_path, params) {
  // 生成签名
  const { signature, timestamp } = createSignature("POST", request_path, params);

  // 生成请求头
  const headers = {
    'OK-ACCESS-KEY': api_config['api_key'],
    'OK-ACCESS-SIGN': signature,
    'OK-ACCESS-TIMESTAMP': timestamp,
    'OK-ACCESS-PASSPHRASE': api_config['passphrase'],
    'Content-Type': 'application/json'
  };

  const options = {
    hostname: 'web3.okx.com',
    path: request_path,
    method: 'POST',
    headers: headers
  };

  const req = https.request(options, (res) => {
    let data = '';
    res.on('data', (chunk) => {
      data += chunk;
    });
    res.on('end', () => {
      console.log(data);
    });
  });

  if (params) {
    req.write(JSON.stringify(params));
  }

  req.end();
}

// GET 请求示例
const getRequestPath = '/api/v6/dex/aggregator/quote';
const getParams = {
  'chainIndex': 42161,
  'amount': 1000000000000,
  'toTokenAddress': '0xff970a61a04b1ca14834a43f5de4533ebddb5cc8',
  'fromTokenAddress': '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1'
};
sendGetRequest(getRequestPath, getParams);

// POST 请求示例
const postRequestPath = '/api/v5/mktplace/nft/ordinals/listings';
const postParams = {
  'slug': 'sats'
};
sendPostRequest(postRequestPath, postParams);