Install
openclaw skills install secondme-connect-miaodaSecondMe Connect - 数字分身集成器。让百度秒哒应用轻松接入SecondMe生态,一键实现OAuth2登录和完整API调用。3步完成集成,开箱即用。
openclaw skills install secondme-connect-miaoda让百度秒哒应用轻松接入SecondMe生态,一键实现OAuth2登录和API调用
快速集成 | 开箱即用 | 安全可靠 | 完整文档
专为百度秒哒应用打造的SecondMe OAuth2登录和API集成工具,30分钟完成接入,无需OAuth2专业知识。
SUPABASE_SERVICE_ROLE_KEY:
SECONDME_CLIENT_SECRET:
存储方式:
profiles.secondme_access_token 字段前端访问说明:
RLS 策略:
-- 用户只能访问自己的 profile(包括 access_token)
CREATE POLICY "Users can view own profile"
ON profiles FOR SELECT USING (auth.uid() = id);
安全建议:
必须配置ALLOWED_ORIGINS:
# ✅ 正确:只允许您的域名
supabase secrets set ALLOWED_ORIGINS="https://yourdomain.com,https://www.yourdomain.com"
# ❌ 错误:允许任何网站调用(不安全)
# 不配置ALLOWED_ORIGINS或配置为'*'
安全风险:
npm install @supabase/supabase-js react-router-dom
前端 .env:
VITE_SUPABASE_URL=https://your-project.supabase.co
VITE_SUPABASE_ANON_KEY=your-anon-key
VITE_SECONDME_CLIENT_ID=your-client-id
VITE_SECONDME_REDIRECT_URI=https://yourdomain.com/auth/callback
Edge Function 环境变量:
# 必需环境变量
supabase secrets set SUPABASE_URL=https://your-project.supabase.co
supabase secrets set SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
supabase secrets set SECONDME_CLIENT_ID=your-client-id
supabase secrets set SECONDME_CLIENT_SECRET=your-client-secret
supabase secrets set SECONDME_REDIRECT_URI=https://yourdomain.com/auth/callback
# ⚠️ 重要:配置CORS允许的域名
supabase secrets set ALLOWED_ORIGINS="https://yourdomain.com"
# 1. 创建数据库表
# 在Supabase SQL Editor执行 templates/database/profiles.sql
# 2. 部署Edge Function
supabase functions deploy secondme-oauth-callback
# 3. 复制前端代码到项目
cp -r templates/src/* your-project/src/
# 4. 启动项目
npm run dev
templates/
├── database/
│ └── profiles.sql # 数据库初始化脚本
├── supabase/
│ └── functions/
│ └── secondme-oauth-callback/
│ └── index.ts # Edge Function主文件
├── src/
│ ├── lib/
│ │ ├── supabase.ts # Supabase客户端
│ │ └── secondme-api.ts # SecondMe API封装
│ ├── hooks/
│ │ └── useSecondMe.ts # React Hook
│ ├── components/
│ │ ├── LoginButton.tsx # 登录按钮
│ │ └── LoginButton.css
│ ├── pages/
│ │ ├── HomePage.tsx # 首页
│ │ ├── AuthCallbackPage.tsx # OAuth回调页
│ │ └── *.css
│ └── App.tsx # 路由配置
├── .env.template # 环境变量模板
└── INTEGRATION.md # 百度秒哒集成指南
import { LoginButton } from './components/LoginButton';
<LoginButton>使用 SecondMe 登录</LoginButton>
import { useSecondMe } from './hooks/useSecondMe';
function YourComponent() {
const {
isLoggedIn, // 是否已登录
profile, // 用户信息
login, // 登录函数
logout, // 登出函数
chat, // 聊天API
searchMemory, // 搜索记忆API
addNote, // 添加笔记API
} = useSecondMe();
// 使用API
const response = await chat('你好');
const memories = await searchMemory('Python');
await addNote('重要笔记');
}
import { SecondMeAPI, createSecondMeAPI } from './lib/secondme-api';
const api = await createSecondMeAPI();
// 获取用户信息
const user = await api.getUserInfo();
// 流式聊天
for await (const chunk of api.chat('你好')) {
console.log(chunk.content);
}
// 搜索记忆
const memories = await api.searchMemory('关键词');
前端 → 点击登录
↓
跳转SecondMe授权页
↓
用户授权 → 回调
↓
Edge Function处理(服务端):
- 验证state
- code换token(使用client_secret)
- 获取用户信息
- 创建Supabase用户
- token安全存储到数据库
- 返回hashed_token(不返回access_token)
↓
前端换取Session
↓
登录成功 → 可调用SecondMe API
.env.env 文件所有API响应都是:
{
"code": 0,
"data": { /* 实际数据 */ }
}
必须取 .data 字段!
| API | 功能 | 所需Scope |
|---|---|---|
getUserInfo() | 获取用户信息 | userinfo |
chat(message) | 流式聊天 | chat.write |
searchMemory(query) | 搜索记忆 | memory.read |
addNote(content) | 添加笔记 | note.write |
getPlazaFeed() | 浏览广场 | plaza.read |
createPost(content) | 发布帖子 | plaza.write |
textToSpeech(text) | 语音合成 | voice |
A: 检查三处redirect_uri是否完全一致
A: 确认Edge Function使用 application/x-www-form-urlencoded 格式
A: 检查profile表中的secondme_access_token是否正确存储
A: Edge Function已自动处理,生成虚拟邮箱
A: 确保配置了ALLOWED_ORIGINS环境变量
如有问题:
templates/INTEGRATION.md 详细说明supabase functions logs secondme-oauth-callbackv1.2.0 (2026-04-08)
v1.1.0 (2026-04-08)
v1.0.0 (2026-04-07)
让百度秒哒应用轻松接入SecondMe生态! 🔐