OAuth2 接入指南
模力方舟支持基于 OAuth 2.0 协议向第三方应用开放授权能力,当前采用标准授权码模式(Authorization Code)。第三方应用完成接入后,可引导用户在模力方舟完成登录与授权,并在授权成功后获取访问凭证,用于识别用户身份或调用开放能力。
该模式适用于服务端参与的 Web 应用、企业系统和开放平台集成。若您的应用为前后端分离架构,仍建议由服务端负责保存 client_secret、交换令牌和刷新令牌,避免敏感凭证暴露到浏览器或客户端。
接入前准备
在开始接入前,请先确认已具备以下条件:
- 已注册并登录模力方舟平台。
- 已在模力方舟平台创建第三方应用。
- 已为应用配置合法的回调地址
redirect_uri。 - 已获取应用的
client_id与client_secret。
一、接入说明
OAuth 2.0 授权码模式的目标,是在不暴露用户账号密码的前提下,由用户授权第三方应用访问其在模力方舟中的身份信息或开放能力。
标准流程如下:
- 第三方应用将用户重定向到模力方舟授权页面。
- 用户登录并确认授权。
- 模力方舟携带授权码
code回调到第三方应用指定的redirect_uri。 - 第三方应用服务端使用
code换取access_token。 - 第三方应用使用
access_token获取用户信息或访问授权资源。
二、在模力方舟平台创建应用
第三方应用接入 OAuth2 之前,需要先在模力方舟平台完成应用创建,并获取应用凭证。
1. 进入应用管理
登录模力方舟平台后,进入 工作台->设置->第三方应用,点击“创建应用”。

2. 填写应用基础信息
按页面提示填写以下内容:
- 应用 名称:用于平台内展示和授权页展示。
- 应用描述:用于向用户说明应用用途。
- 应用主页:第三方应用的官方网站或访问地址。
- 应用回调地址:OAuth2 授权完成后的回调地址,即
redirect_uri。
回调地址必须与应用实际发起授权时传入的 redirect_uri 保持一致。若不一致,授权请求将被拒绝。

3. 获取应用凭证
应用创建成功后,可在应用详情页查看以下信息:
client_id:应用公开标识,在发起授权请求时使用。client_secret:应用密钥,仅可在服务端保存和使用。
请妥善保管 client_secret,不要写入前端代码、移动端安装包或公开仓库。

三、OAuth2 授权码模式接入流程
以下示例展示标准的 OAuth 2.0 授权码接入流程。
1. 发起授权请求
第三方应用将用户重定向到以下授权地址:
GET https://moark.com/oauth/authorize?
response_type=code&
client_id={client_id}&
redirect_uri={redirect_uri}&
scope={scope}&
state={state}
参数说明如下:
| 参数 | 是否必填 | 说明 |
|---|---|---|
response_type | 是 | 固定为 code |
client_id | 是 | 应用标识 |
redirect_uri | 是 | 应用回调地址 |
scope | 是 | 申请的授权范围,按平台实际定义传入,例如 user_info api_key |
state | 推荐 | 第三方应用生成的随机串,用于防止 CSRF 攻击 |
示例:
https://moark.com/oauth/authorize?response_type=code&client_id={client_id}&redirect_uri={redirect_uri}&scope=user_info%20api_key&state=8f3a2c9d
用户确认授权后,模力方舟会重定向到:
GET https://client.example.com/oauth/callback?code={code}&state=8f3a2c9d
如果用户拒绝授权,通常会返回错误信息,例如:
GET https://client.example.com/oauth/callback?error=access_denied&state=8f3a2c9d
2. 使用授权码换取 OAuth 令牌
第三方应用服务端收到 code 后,向令牌地址发起请求换取 OAuth 令牌:
curl --request POST 'https://moark.com/api/open/oauth/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=authorization_code' \
--data-urlencode 'code={code}' \
--data-urlencode 'client_id={client_id}' \
--data-urlencode 'client_secret={client_secret}' \
--data-urlencode 'redirect_uri={redirect_uri}'
/api/open/oauth/token 接口除支持在请求体中传递 client_id 和 client_secret 外,也支持通过请求头 Authorization: Basic {base64(client_id:client_secret)} 传递应用凭证。
例如:
curl --request POST 'https://moark.com/api/open/oauth/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic {base64(client_id:client_secret)}' \
--data-urlencode 'grant_type=authorization_code' \
--data-urlencode 'code={code}' \
--data-urlencode 'redirect_uri={redirect_uri}'
示例返回:
{
"access_token": "{access_token}",
"token_type": "Bearer",
"expires_in": 7200,
"refresh_token": "{refresh_token}",
"scope": "user_info api_key"
}
字段说明如下:
| 字段 | 说明 |
|---|---|
access_token | OAuth 令牌,用于调用受保护资源 |
token_type | 令牌类型,通常为 Bearer |
expires_in | OAuth 令牌有效期,单位通常为秒 |
refresh_token | OAuth 刷新令牌,用于换取新的 OAuth 令牌 |
scope | 实际授予的权限范围 |
授权码 code 只能使用一次,且通常具有较短有效期。请在服务端收到回调后立即完成换取。
3. 使用 OAuth 令牌获取用户信息
获取到 access_token 后,第三方应用可调用用户信息接口:
curl --request GET 'https://moark.com/api/open/v1/userinfo' \
--header 'Authorization: Bearer {access_token}'
示例返回:
{
"id": 123456,
"login": "demo_user",
"name": "示例用户",
"avatar_url": "https://example.com/avatar.png"
}
第三方应用可根据返回的用户唯一标识完成本地用户绑定、登录态建立或账号注册。
如需查看更多 OAuth 开放接口,请参考 OAuth 开放接口。
4. 刷新 OAuth 令牌
当 access_token 过期后,可使用 refresh_token 换取新的 OAuth 令牌:
curl --request POST 'https://moark.com/api/open/oauth/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=refresh_token' \
--data-urlencode 'refresh_token={refresh_token}' \
--data-urlencode 'client_id={client_id}' \
--data-urlencode 'client_secret={client_secret}'
也可以改为通过 Authorization: Basic {base64(client_id:client_secret)} 传递应用凭证:
curl --request POST 'https://moark.com/api/open/oauth/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic {base64(client_id:client_secret)}' \
--data-urlencode 'grant_type=refresh_token' \
--data-urlencode 'refresh_token={refresh_token}'
示例返回:
{
"access_token": "{access_token}",
"token_type": "Bearer",
"expires_in": 7200,
"refresh_token": "{refresh_token}",
"scope": "user_info api_key"
}
5. 接入建议
为保证接入安全性与稳定性,建议遵循以下实践:
- 始终使用服务端保存和处理
client_secret。 - 始终校验授权回调中的
state参数。 - 回调地址使用 HTTPS,并与平台配置保持严格一致。
- 对
access_token和refresh_token做安全存储,不记录到公开日志中。 - 对授权失败、OAuth 令牌过期、用户撤销授权等场景做好异常处理。
四、进阶场景:通过 OAuth 管理与使用访问令牌
模力方舟支持用户在平台内生成可用于 Serverless API、API 流水线等服务调用的访问令牌。在 OAuth 开放接口场景下,第三方应用可以在获得用户授权后,查询当前用户可访问的访问令牌列表,并获取指定访问令牌的详情。
出于安全考虑,开放接口不会直接返回原始访问令牌明文。第三方应用通过详情接口拿到的 proxy_access_token,是一个短期有效的 JWT 代理访问令牌,可在有效期内用于访问对应服务。
这一能力仅适用于需要代表用户调用其名下 Serverless API 等服务的场景;如果您只需要完成登录和身份识别,前文的标准 OAuth 授权码流程即可。
1. 适用场景
该能力适用于以下场景:
- 第三方应用需要让用户在模力方舟中自行管理访问令牌,而不是由第三方应用代为保存密钥。
- 第三方应用需要在获得用户授权后,代表用户调用其名下的 Serverless API。
- 第三方应用需要支持个人命名空间和组织命名空间下的令牌选择与使用。
2. 完整流程说明
推荐按以下流程接入:
- 用户先在模力方舟平台中创建可用于 Serverless API 的访问令牌。
- 第三方应用发起 OAuth 授权,并在
scope中申请api_key权限。 - 第三方应用通过 OAuth 授权码模式获取开放平台
access_token。 - 第三方应用使用该 OAuth
access_token调用访问令牌列表接口,获取当前用户在指定命名空间下可访问的令牌列表。 - 用户在第三方应用中选择目标访问令牌后,第三方应用调用详情接口。
- 详情接口返回该访问令牌的基础信息,并签发一个 短期有效的代理访问令牌
proxy_access_token。 - 第三方应用使用这个代理访问令牌访问对应的 Serverless API。
这一场景中涉及三类令牌:
- OAuth
access_token:用于调用模力方舟开放接口,例如用户信息接口、组织接口、访问令牌列表与详情接口。 - 原始访问令牌:由用户在模力方舟平台内生成,用于访问具体服务,但不会通过开放接口返回给第三方应用。
- 代理访问令牌:由访问令牌详情接口临时签发的 JWT 令牌,可在有效期内用于调用目标服务。
第三方应用不应将开放接口返回的代理访问令牌视为长期密钥。该令牌具有有效期,且当用户撤销当前 OAuth 应用授权后会立即失效。
3. 查询命名空间下的访问令牌列表
第三方应用可先获取用户可访问的命名空间,再查询对应命名空间下的访问令牌列表。
个人空间可直接使用用户个人命名空间;组织空间建议先调用组织列表接口确认用户所在组织,再使用目标组织的 namespace 发起查询。
请求示例:
curl --request GET 'https://moark.com/api/open/v1/{namespace}/tokens' \
--header 'Authorization: Bearer {access_token}'
示例返回:
[
{
"id": 10001,
"name": "serverless-prod",
"usage_scenario": "paid"
},
{
"id": 10002,
"name": "serverless-trial",
"usage_scenario": "trial"
}
]
字段说明如下:
| 字段 | 说明 |
|---|---|
id | 访问令牌的唯一标识,后续查询详情时使用 |
name | 访问令牌名称,通常用于用户识别和选择 |
usage_scenario | 使用场景,paid 表示付费版,trial 表示体验版 |
该接口只返回令牌元信息,不返回原始访问令牌,也不返回可直接访问服务的代理访问令牌。