> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fluz.app/llms.txt
> Use this file to discover all available pages before exploring further.

# OAuth 中的企业账户

> 让用户将你的应用授权给一个企业账户 —— 或为他即将注册的企业预先批准权限 —— 并弄清楚授权码到底解析到哪个账户。

一位 Fluz 用户可以同时拥有一个个人账户和一个或多个企业账户。以前 OAuth 流程总是解析到个人账户，现在不再如此。

如果你的应用服务于企业，本页就是“能用的集成”与“您默默把每一份授权都挂到错误账户上的集成”之间的差别。

<Info>
  本页内容不会改变 authorize URL、回调契约或令牌交换。发生变化的是**返回的授权码绑定到哪个账户**，以及**同意页面是用哪份权限清单构建的**。
</Info>

***

## 两种流程

| 流程       | 何时发生                               | 授权针对的对象                    |
| :------- | :--------------------------------- | :------------------------- |
| **标准授权** | 用户选择一个个人账户或一个已有的企业账户               | 该账户                        |
| **企业注册** | 用户选择申请一个新的企业账户，或你的应用仅限企业而他尚未拥有企业账户 | 他的个人账户，加上一组为即将创建的企业预先批准的权限 |

第二种流程存在的原因是：在用户同意的那一刻，企业还不存在。用户在自己的个人账户上授予“注册企业”的权限，并在同一步骤中预先批准你的应用在该企业存在后所需的企业权限。这些预批权限会挂在用户名下，直到企业被创建。

<Note>
  同一个个人账户可以多次走企业注册流程，随时间推移为多家企业预先批准权限。
</Note>

***

## 在你的应用上启用企业账户

两份权限清单位于应用的 **Permissions** 标签页，由你自行编辑。参见[配置 OAuth 应用](/create-an-o-auth-app)。流程是否允许落在个人账户上，则不在该标签页上 —— 由 Fluz 在你的应用上配置。

<Steps>
  <Step title="填写 Business permissions 清单">
    与消费者 **Permissions** 清单独立编辑。**企业清单非空，才会让你的应用启用企业能力** —— 留空的话，用户永远不会看到申请企业账户的选项。

    注册企业的权限不在这份清单里。它由个人账户授予，因此属于消费者清单。
  </Step>

  <Step title="在消费者 Permissions 清单上启用“注册企业”权限">
    企业注册流程必需。没有它，该流程无法完成。
  </Step>

  <Step title="如有需要，请 Fluz 将应用限制为仅企业账户">
    Fluz 可以为你的应用做配置，使流程永远不会落在个人账户上。这一项不是自助的 —— 如果你的应用只应在企业账户上运行，请联系你的 Fluz 客户经理。

    如果你的应用同时服务于消费者与企业，请跳过此步。在未启用该限制前，没有企业账户的用户会同时看到自己的个人账户和申请企业账户的选项，其中一些人会选个人账户。
  </Step>
</Steps>

***

## 账户是如何被选定的

是跳过选择器还是展示它，由 Fluz 决定。你的应用不控制这一点 —— 但你需要知道你的用户会遇到什么。

| 情形                             | 会发生什么                              |
| :----------------------------- | :--------------------------------- |
| `external_id` 已经解析到一个来自先前授权的账户 | 跳过选择器。复用该账户；若先前的授权是企业注册流程，则继续该流程   |
| 没有企业账户，且应用被限制为仅企业账户            | 跳过选择器。直接进入企业注册                     |
| 没有企业账户，且允许个人账户                 | 选择器展示个人账户；若应用已启用企业能力，还会展示申请企业账户的选项 |
| 已有企业账户                         | 选择器展示它们。仅当允许个人账户时，才会包含个人账户         |
| 已有一份企业申请在处理中                   | “申请企业账户”选项会被隐藏                     |

<Warning>
  正因为存在账户选择这一步，你不应假设收到的授权码绑定的是用户的个人账户。请从交换响应中读取账户并持久化 —— 不要根据你自己关于“谁发起了流程”的记录去推断。
</Warning>

***

## 适用哪份权限清单

同意页面始终根据你的应用配置构建，而不是根据 authorize URL。使用哪份清单取决于流程：

| 流程      | 同意页面展示                                    |
| :------ | :---------------------------------------- |
| 个人账户    | 你的消费者 **Permissions**                     |
| 已有的企业账户 | 你的 **Business permissions**               |
| 企业注册    | 两者都展示，分为两组 —— 现在授予的消费者权限，以及为未来企业预先批准的企业权限 |

每种情况下该清单都是只读的。用户要么全部接受，要么无法完成授权。

权限会在我们这一侧根据适用于该流程的清单进行校验。不在清单内的内容会被拒绝，而不是静默丢弃。

***

## 在企业场景下使用 `external_id`

`external_id` 在每个应用内唯一，首次使用时就会绑定到唯一一个 Fluz 账户。引入企业后，这带来一个值得提前规划的后果：

* 如果用户以 `external_id=acct_123` 授权了一个个人账户，该 ID 就绑定到了个人账户。你无法之后再把它用在他的企业账户上。
* 为每个你想跟踪的账户分配各自的外部 ID。如果你在自己的系统里单独建模企业，请使用你的企业标识符 —— 而不是所有者用户的。

通用规则参见[管理外部引用 ID](/managing-external-reference-ids)。

***

## 组件中的企业账户

当你的集成使用[嵌入式组件](/developers/widgets)时，企业账户可以作为**存款、payout 和 pay-in** 的当前上下文。有两点与消费者上下文不同：

* **消费者身份验证（KYC）不适用。** 企业上下文通过企业验证（KYB）完成核验，不会出现消费者 KYC 提示。
* **PIN 在用户层级设置。** 尚未设置 PIN 的用户可以在任一上下文中设置，且对两者都生效。

***

## 故障排查

| 现象                  | 几乎总是因为                                                                       |
| :------------------ | :--------------------------------------------------------------------------- |
| 没有申请企业账户的选项         | **Business permissions** 为空，应用未启用企业能力 —— 或者用户已有一份企业申请在处理中                    |
| 企业注册流程无法完成          | 消费者 **Permissions** 清单上未启用“注册企业”权限                                           |
| 授权因为无法识别的权限而被拒      | 发送了不在该流程适用清单内的内容。个人账户授权对照 **Permissions** 校验，企业授权对照 **Business permissions** |
| 复用 `external_id` 失败 | 它已经绑定到本应用下的另一个账户                                                             |
| 你期待企业账户，授权却落在了个人账户  | 用户选了个人账户。如果你的应用永远不应接受个人账户，请请你的 Fluz 客户经理将应用限制为仅企业账户                          |

***

## 下一步

<CardGroup cols={2}>
  <Card title="面向客户端的授权流程" icon="user-check" href="/client-facing-o-auth-grant-flow">
    authorize URL、`state` 与回调。
  </Card>

  <Card title="配置 OAuth 应用" icon="sliders" href="/create-an-o-auth-app">
    两份权限清单在哪里。
  </Card>

  <Card title="外部引用 ID" icon="id-card" href="/managing-external-reference-ids">
    选择不会让你后悔的标识符。
  </Card>

  <Card title="交换授权码" icon="arrow-left-right" href="/exchange-an-o-auth-authorization-code">
    将授权码换成令牌。
  </Card>
</CardGroup>
