为其他目标站点提供第三方登录聚合服务。以下两套接口可任选其一接入:
彩虹聚合登录协议(/connect.php,兼容彩虹官方)与自研 REST 风格接口(/api/v1/oauth/*)。
appid / appkey
调用本平台接口完成第三方登录。统一返回 {code, msg, ...}:
code=0 成功,code=1 失败,code=2 登录未完成。
接口访问根路径 /connect.php(/api/connect.php 为等价别名),
支持 GET / POST,参数可放查询串或 application/x-www-form-urlencoded 表单体。
connect.php?act=login,携带 appid/appkey/type/redirect_uri,获取第三方授权地址。url,引导用户在第三方平台完成授权。redirect_uri,并携带 type、code 两个参数。connect.php?act=callback,用 code 换取用户信息(一次性),完成登录。| 参数 | 必填 | 说明 |
|---|---|---|
| act | 是 | 动作:login / callback / query |
| appid | 是 | 应用 ID |
| appkey | 是 | 应用密钥 |
| type | 是 | 登录类型,见下方「类型对照表」 |
| redirect_uri | act=login 时必填 | 登录完成后的回跳地址,域名须在应用白名单内 |
| code | act=callback 时必填 | 回调携带的授权码(一次性) |
| social_uid | act=query 时必填 | 第三方平台用户唯一标识 |
GET /connect.php?act=login&appid=10001&appkey=your_appkey&type=gitee&redirect_uri=https%3A%2F%2Fexample.com%2Fcallback
{ "code": 0, "msg": "succ", "type": "gitee",
"url": "https://gitee.com/oauth/authorize?client_id=xxx&redirect_uri=xxx&state=xxx",
"qrcode": "" }
返回的 url 即为第三方授权地址(已附带一次性 state),目标站点直接 302 跳转即可。
用户完成授权后,平台自动跳转到目标站点的 redirect_uri,并追加以下参数:
https://example.com/callback?type=gitee&code=xxxx
GET /connect.php?act=callback&appid=10001&appkey=your_appkey&type=gitee&code=xxxx
{ "code": 0, "msg": "succ", "type": "gitee",
"access_token": "xxxx",
"social_uid": "123456",
"faceimg": "https://avatar.example.com/1.png",
"nickname": "张三",
"location": "广东深圳",
"gender": "男",
"ip": "1.2.3.4" }
若 code 已使用、过期或登录未完成,返回 code=2:
{ "code": 2, "msg": "未完成登录", "type": "gitee" }
用于目标站点在本地用户登录时校验第三方 UID 是否已绑定,无需携带 code:
GET /connect.php?act=query&appid=10001&appkey=your_appkey&type=gitee&social_uid=123456
{ "code": 0, "msg": "succ", "type": "gitee",
"social_uid": "123456",
"faceimg": "https://avatar.example.com/1.png",
"nickname": "张三",
"location": "广东深圳",
"ip": "1.2.3.4" }
| type 参数 | 第三方平台 |
|---|---|
| QQ 互联 | |
| wx | 微信开放平台 |
| alipay | 支付宝开放平台 |
| sina | 微博开放平台 |
| baidu | 百度开放平台 |
| douyin | 抖音开放平台 |
| dingtalk | 钉钉开放平台 |
| gitee | Gitee(码云) |
| wework | 企业微信 |
{code, message, data}。
登录接口(/api/v1/oauth/login)明文校验 appid/appkey;信息接口
(userinfo / query)只传 appid,通过服务端 MD5 签名校验身份,避免 appkey 泄漏。
POST /api/v1/oauth/login,携带 appid/appkey/type/redirect_uri,获取第三方授权地址。redirect_uri,携带 type、code。POST /api/v1/oauth/userinfo,用 code + sign 换取用户信息(一次性),完成登录。信息接口使用 MD5 签名:将接口相关参数按 key 升序拼接为
k1=v1&k2=v2,末尾追加 &key=<appkey>,整体取 MD5(小写)。
以 userinfo 为例,参数为 appid / type / code:
原串 = appid=10001&code=xxxx&type=gitee&key=your_appkey
sign = md5(原串)
| 接口 | 签名参与参数 |
|---|---|
| POST /api/v1/oauth/userinfo | appid、type、code |
| POST /api/v1/oauth/query | appid、type、social_uid |
POST /api/v1/oauth/login,请求体(JSON):
{ "appid": "10001", "appkey": "your_appkey", "type": "gitee",
"redirect_uri": "https://example.com/callback" }
{ "code": 0, "message": "success",
"data": { "url": "https://gitee.com/oauth/authorize?client_id=xxx&redirect_uri=xxx&state=xxx",
"type": "gitee" } }
用户授权完成后,平台 302 跳回 redirect_uri:
https://example.com/callback?type=gitee&code=xxxx
POST /api/v1/oauth/userinfo,请求体(JSON):
{ "appid": "10001", "code": "xxxx", "type": "gitee",
"sign": "32 位 MD5 小写" }
{ "code": 0, "message": "success",
"data": { "type": "gitee", "openid": "123456", "unionid": "u_8888",
"nickname": "张三", "avatar": "https://avatar.example.com/1.png",
"email": "zhangsan@example.com", "gender": "男",
"location": "广东深圳", "access_token": "xxxx", "ip": "1.2.3.4" } }
POST /api/v1/oauth/query,请求体(JSON):
{ "appid": "10001", "type": "gitee", "social_uid": "123456",
"sign": "32 位 MD5 小写" }
{ "code": 0, "message": "success",
"data": { "type": "gitee", "openid": "123456", "nickname": "张三",
"avatar": "https://avatar.example.com/1.png",
"location": "广东深圳", "ip": "1.2.3.4" } }
GET /api/oauth/providers,公开接口,无需鉴权:
[ { "name": "gitee", "display_name": "Gitee", "category": "social" } ]
| code | 含义 |
|---|---|
| 0 | 成功 |
| 1 | 业务失败(message 中给出具体原因) |
| 2 | 登录未完成(code 无效 / 已使用) |