forked from wangziqi/gongxue-base
feat: add china auth providers
This commit is contained in:
@@ -19,31 +19,109 @@ Supabase Auth 可继续作为最终 JWT 用户体系目标;本地重构期先
|
||||
- `POST /api/auth/sms/verify`:验证码登录,自动创建或复用 `platform_users`。
|
||||
- `GET /api/auth/me`:通过 Bearer token 获取当前用户。
|
||||
- `POST /api/auth/logout`:吊销迁移期 session。
|
||||
- `POST /api/auth/oauth/wechat`、`/wechat-miniapp`、`/qq`:provider 占位,已固定错误码 `PROVIDER_NOT_CONFIGURED`。
|
||||
- `POST /api/auth/oauth/wechat-miniapp`:微信小程序 `code2Session` 登录,后端换取 openid/unionid,签发 `tk_` session。
|
||||
- `POST /api/auth/oauth/wechat`、`/qq`:provider 占位,已固定 `PROVIDER_NOT_CONFIGURED` / `PROVIDER_NOT_IMPLEMENTED`。
|
||||
- `tenant_auth_providers`:租户级公开认证配置。
|
||||
- `sms_verification_codes`:验证码审计表,不保存明文 code。
|
||||
- `auth_login_events`:登录事件审计。
|
||||
- `app_private.auth_sessions`:迁移期 session token hash。
|
||||
- 阿里云短信 `SendSms` provider:使用租户级 AccessKey、签名、模板发送。
|
||||
- 腾讯云短信 `SendSms` provider:使用租户级 SecretId/SecretKey、SdkAppId、签名、模板发送。
|
||||
|
||||
## 短信 Provider
|
||||
|
||||
本地默认是 `AUTH_SMS_PROVIDER=mock`,仅开发环境返回 `debugCode`。生产环境如果仍为 mock,会直接拒绝发送。
|
||||
|
||||
后续真实 provider:
|
||||
真实 provider:
|
||||
|
||||
- `aliyun`:接阿里云短信 `SendSms`,需要 AccessKey、签名、模板 ID。
|
||||
- `tencent`:接腾讯云短信 `SendSms`,需要 SecretId、SecretKey、SdkAppId、签名、模板 ID。
|
||||
- `aliyun` / `aliyun-sms`:阿里云短信 `SendSms`,需要 AccessKey、签名、模板 ID。
|
||||
- `tencent` / `tencent-sms`:腾讯云短信 `SendSms`,需要 SecretId、SecretKey、SdkAppId、签名、模板 ID。
|
||||
|
||||
密钥策略:
|
||||
|
||||
- AccessKey/SecretKey 不进入 `tenant_settings.public_config`。
|
||||
- 租户级密钥写 `app_private.tenant_secrets(secret_scope='sms')` 或生产 Vault。
|
||||
- 前端只能看到 provider 是否启用、签名展示名、隐私协议链接等非敏感配置。
|
||||
- provider endpoint 默认使用官方域名,生产环境只允许 HTTPS 官方域名;本地测试可使用 `localhost/127.0.0.1` fake server。
|
||||
|
||||
### 阿里云短信配置示例
|
||||
|
||||
```json
|
||||
{
|
||||
"provider": "aliyun",
|
||||
"status": "active",
|
||||
"configPublic": {
|
||||
"signName": "工学教育",
|
||||
"templateCode": "SMS_123456789",
|
||||
"regionId": "cn-hangzhou"
|
||||
},
|
||||
"secret": {
|
||||
"secretScope": "sms",
|
||||
"secretKey": "aliyun",
|
||||
"secretJson": {
|
||||
"accessKeyId": "LTAI...",
|
||||
"accessKeySecret": "..."
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 腾讯云短信配置示例
|
||||
|
||||
```json
|
||||
{
|
||||
"provider": "tencent",
|
||||
"status": "active",
|
||||
"configPublic": {
|
||||
"smsSdkAppId": "1400000000",
|
||||
"signName": "工学教育",
|
||||
"templateId": "123456",
|
||||
"region": "ap-guangzhou",
|
||||
"templateParamSet": ["{code}"]
|
||||
},
|
||||
"secret": {
|
||||
"secretScope": "sms",
|
||||
"secretKey": "tencent",
|
||||
"secretJson": {
|
||||
"secretId": "AKID...",
|
||||
"secretKey": "..."
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 微信/QQ 登录
|
||||
|
||||
微信小程序登录应由前端传 `wx.login` code 到 `/api/auth/oauth/wechat-miniapp`,后端调用微信 `code2Session` 换取 openid/session_key/unionid,再落 `user_identities`。
|
||||
|
||||
已实现微信小程序登录主链路:
|
||||
|
||||
- 前端传 `code` 和可选 `profile`。
|
||||
- 后端读取租户 `wechat-miniapp` / `wechat_miniapp` provider 配置。
|
||||
- `appId` 存在 `config_public`,`appSecret` 存在 `app_private.tenant_secrets(secret_scope='oauth')`。
|
||||
- `provider_subject` 使用 `appId:openid`,避免不同小程序 openid 碰撞。
|
||||
- `session_key` 不返回前端,不写入公开 `raw_profile`;当前只记录 `hasSessionKey` 和更新时间标记。
|
||||
- 登录成功写 `auth_login_events`,并签发 `tk_` session。
|
||||
|
||||
配置示例:
|
||||
|
||||
```json
|
||||
{
|
||||
"provider": "wechat-miniapp",
|
||||
"displayName": "微信小程序登录",
|
||||
"status": "active",
|
||||
"configPublic": {
|
||||
"appId": "wx...",
|
||||
"envVersion": "release"
|
||||
},
|
||||
"secret": {
|
||||
"secretScope": "oauth",
|
||||
"secretKey": "wechat-miniapp",
|
||||
"secretValue": "小程序 AppSecret"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
微信网页 OAuth 和 QQ OAuth 也必须在后端完成 code 换 token、获取 openid/unionid、验错、账号合并和登录事件审计。旧 PocketBase hooks 中的邀请码/销售归属逻辑后续应拆到 `referral` feature,不继续堆在 auth 模块里。
|
||||
|
||||
## 支付 Provider
|
||||
|
||||
Reference in New Issue
Block a user