# OAuth 授权码授权
扣子编程支持应用程序通过 OAuth 授权码授权(Authorization Code Grant)的方式调用扣子编程 API。用户通过浏览器访问包含扣子编程功能的 Web 应用程序时,Web 应用程序重定向用户到扣子编程服务端以获取授权码(code),然后使用授权码向扣子编程服务端交换访问令牌。例如 Web 应用程序通过扣子编程 API 封装了扣子编程的查看 Bot 的详细信息和指定 Bot 对话等功能,用户使用这些功能之前,需要经由扣子编程服务端鉴权。
通过 OAuth 授权码方式授权时,应用程序需要拥有可通过 Web 访问的前端页面,否则无法实现重定向等一系列授权流程;同时应有稳定的后端架构,可处理前端请求、安全存储客户端密钥(Client Secret),与 OAuth 授权服务器和 OpenAPI 交互。
# 授权流程
Web 应用程序授权流程如下图所示。

具体流程说明如下:
1. 在扣子编程创建 OAuth 应用。
2. 应用程序调用 API [获取授权页面 URL](https://docs.coze.cn/api/open/docs/developer_guides/oauth_code#54010bd0)和[获取 OAuth Access Token](https://docs.coze.cn/api/open/docs/developer_guides/oauth_code#b4f74244),获取 OAuth 访问令牌。
3. 应用程序根据访问令牌调用扣子编程 API。
详细步骤如下:
## 1 创建 OAuth 应用
在扣子企业版(企业标准版、企业旗舰版)中,仅组织**超级管理员**和**管理员**有权限创建、编辑、删除 OAuth 应用,以及对应用进行授权操作。
1. 登录[扣子编程](https://code.coze.cn/home)。
2. 在左侧导航栏选择 **API & SDK。**
3. 在顶部单击**授权** > **OAuth 应用**页签。
4. 在 OAuth 应用页面右上角单击**创建新应用**,填写应用的基本信息。
| **配置** | **说明** |
| --- | --- |
| 应用类型 | 应用的类型,此处设置为**普通**。 |
| 客户端类型 | 客户端类型,此处设置为**Web 后端应用**。 |
| 应用名称 | 应用的名称,在扣子编程中全局唯一。 |
| 描述 | 应用的基本描述信息。 |
5. 填写 App 的配置信息。
| **配置** | **说明** |
| --- | --- |
| 权限 | 应用程序调用扣子 API 时需要的权限范围。
此处配置旨在于划定应用的权限范围,并未完成授权操作。创建 Oauth 应用后还需要参考后续操作完成授权。
|
| 重定向 URL | 重定向的 URL 地址。用户完成授权后,扣子编程的授权服务器将通过重定向 URL 返回授权相关的凭据。最多可添加 3 个不同的 URL 地址。
* 重定向 URL 仅支持 HTTP 和 HTTPs。为了保证数据传输安全,请勿在生产环境使用HTTP 协议地址。
* 对于测试场景,您可以指定引用本地机器的 URL,例如 `http://localhost:8080`。 |
| 客户端 ID 和客户端密钥
| 客户端 ID 和客户端密钥均由扣子编程自动生成并配置。单击生成客户端密钥,并复制系统自动生成的客户端密钥。
* 客户端 ID:即 client id,是应用程序的公共标识符。
* 客户端密钥:即 client secret,仅应用程序和授权服务器有权访问的密钥。用于获取已登录用户的访问令牌。
* 此客户端密钥仅显示一次。请将其保存到安全且易于访问的地方。不要与他人分享,或在其他环境中暴露。
* 支持生成多个客户端密钥,当您发现密钥泄露时,可以通过此方法进行密钥轮转。
* 扣子编程在任何时候都不会存储您的客户端密钥,扣子服务端仅存储符合行业规范的密钥摘要值。
|
6. 单击**确定**,完成配置。
## 2 获取访问令牌
1. 终端用户在 Web 应用程序中触发授权操作,例如点击和 Bot 对话的按钮。该动作对应扣子发起对话 API,应用程序需要获得扣子账号的授权。
2. Web 应用程序重定向用户到授权服务器以获取 code。
应用程序通过302重定向方式发起 [获取授权页面 URL](https://docs.coze.cn/api/open/docs/developer_guides/oauth_code#54010bd0) API 请求。
请求中携带 OAuth 应用的客户端 ID 和客户端密钥 、重定向 URL 等信息。请求示例如下:
```Shell
curl --location --request GET 'https://www.coze.cn/api/permission/oauth2/authorize?response_type=code&client_id=8173420653665306615182245269****.app.coze&redirect_uri=https://www.coze.cn/open/oauth/apps&state=1294848'
```
Response Header 中的 location 字段中为跳转链接。例如`https://www.coze.cn/oauth/consent?authorize_key=JacVeqTW93ps5m5N9n349bEBgIsWrnNp`。浏览器跳转到此 URL,引导用户完成扣子账号授权。授权页面示例如下:

* 如果你是组织超级管理员和管理员,单击**授权**后,可以主动安装该应用。
* 如果你是组织成员,单击**授权**后,如果系统提示授权失败,说明超级管理员或管理员未安装该应用,请单击**发起申请**。超级管理员或管理员收到安装请求后,在对话框中单击**安装**或在**应用安装管理**页面的**操作**列中单击**安装**。
* 扣子支持多人协作场景下跨账号的 OAuth 授权,发起 [获取授权页面 URL](https://docs.coze.cn/api/open/docs/developer_guides/oauth_code#54010bd0) API 请求时如果指定空间 ID,空间协作者也可以为应用程序授予团队空间中的资源权限。详细说明可参考[OAuth 授权(多人协作场景)](https://docs.coze.cn/api/open/docs/developer_guides/oauth_collaborate)。
3. 扣子服务端会在 API 的响应中返回 code。
从重定向的 URL 地址中获取 code,例如本示例中 code 为 `code_WZmPRDcjJhfwHD****`。
```Shell
https://www.coze.cn/open/oauth/apps?code=code_WZmPRDcjJhfwHD****&state=1294848
```
4. 使用授权码交换访问令牌。
应用程序向扣子服务端发起 [获取 OAuth Access Token](https://docs.coze.cn/api/open/docs/developer_guides/oauth_code#b4f74244) 请求,请求中携带 code,扣子服务端会在 API 的响应中返回 access_token 和 refresh_token。其中:
* access_token 即访问令牌,用于发起扣子 API 请求时鉴权,有效期为 15 分钟。
* refresh_token 用于刷新 access_token,有效期为 30 天。refresh_token 到期前可以多次调用 [刷新 OAuth Access Token ](https://docs.coze.cn/api/open/docs/developer_guides/oauth_code#9c63ccf1)接口获取新的 refresh_token 和 access_token。
接口示例如下: