

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 为 OAuth 2.0 身份验证设置 OneDrive
<a name="kb-managed-onedrive-oauth2-setup"></a>

**OAuth 2.0 身份验证 (`OAUTH2`) 使用应用程序客户端 ID 和密钥以及委托的刷新令牌进行身份验证。**连接器使用刷新令牌来获取访问令牌，这些令牌用于在登录用户的委托上下文中抓取内容。数据源涵盖用户可以访问的 OneDrive 内容——他们自己的云端硬盘，以及与他们共享的任何云端硬盘或他们拥有 SharePoint 管理员访问权限的地方。已登录用户无法访问的驱动器会被静默跳过。

**重要**  
我们建议[设置 Microsoft Entra 应用程序 ID 身份验证 OneDrive](kb-managed-onedrive-entra-setup.md)大多数数据源使用。OAuth 2.0 身份验证有以下限制：  
它仅抓取登录用户可以访问的 OneDrive 内容（他们自己的云端硬盘，以及与他们共享的任何云端硬盘或他们拥有 SharePoint 管理员访问权限的地方）。用户无法访问的驱动器会被静默跳过。要统一抓取租户 OneDrive 中的每个用户，请使用 Microsoft Entra 应用程序 ID 身份验证。
它需要刷新令牌，您可以通过一次性用户登录获得刷新令牌（步骤 4）。
刷新令牌的 Microsoft-side 生命周期是有限的。当刷新令牌过期或被撤销时，同步将失败，直到您获取新令牌并更新密钥。
它不支持文档级访问控制 (ACL)。要按用户权限筛选查询结果，请使用 Microsoft Entra 应用程序 ID 身份验证。

## 先决条件
<a name="kb-managed-onedrive-oauth2-prereqs"></a>
+ Microsoft Entra ID 管理员访问权限，用于注册应用程序、授予管理员同意和创建客户端密钥。
+ 一个可以访问你想要抓取的 OneDrive 内容的 Microsoft 365 用户帐户。您以该用户身份登录一次即可获得刷新令牌。
+ 获取您的 Microsoft 365 租户 ID。

## 第 1 步：在 Microsoft Entra ID 中注册应用程序
<a name="kb-managed-onedrive-oauth2-step1"></a>

1. 登录 [Microsoft Entra 管理中心](https://entra.microsoft.com/)。

1. 在左侧导航栏中，展开 **Entra ID**，然后选择**应用程序注册**。

1. 选择 “**新注册**”。

1. 在 “**名称**” 中，输入描述性名称，例如。`bedrock-onedrive-oauth2`

1. 对于**支持的帐户类型**，请选择 “**仅限此组织目录中的帐户（单租户）**”。

1. 在 “**重定向 URI**” 下，选择 **Web** 作为平台并输入`http://localhost:53672/callback`。在步骤 4 中获取刷新令牌时，您可以使用此重定向 URI。您可以使用任何免费的 localhost 端口；如果您在此处更改端口，请在步骤 4 中使用相同的端口。

1. 选择**注册**。

1. 在应用程序**概述**页面上，记录**应用程序（客户端）ID** 和**目录（租户）ID**。

## 第 2 步：添加 API 权限并授予管理员同意
<a name="kb-managed-onedrive-oauth2-step2"></a>

OAuth 2.0 身份验证使用委托登录，因此应用程序需要**委托**权限，而不是应用程序权限。

1. 在您的应用程序注册中，选择 **API 权限**，然后选择**添加权限**。

1. 选择 **Microsoft Graph**，然后选择**委托权限**。

1. 选择以下委派权限，然后选择**添加权限**：
   + `Files.Read.All`— 读取用户可以访问的文件。
   + `Sites.Read.All`— 阅读用户可以访问的 OneDrive 站点。
   + `User.Read.All`— 识别用户。
   + `offline_access`— 必填项，因此登录会返回刷新令牌。

1. 在 **API 权限**页面上，选择 **[您的组织] 授予管理员同意**并确认。

## 步骤 3：创建客户机密钥
<a name="kb-managed-onedrive-oauth2-step3"></a>

1. 在应用程序注册中，选择**证书和密钥**，然后选择**客户端密钥**，然后选择**新客户机密**。

1. 输入描述，选择到期时间，然后选择**添加**。

1. 立即记录秘密**值** ——它只显示一次。记录**值**，而不是**秘密 ID**。

## 步骤 4：获取刷新令牌
<a name="kb-managed-onedrive-oauth2-step4"></a>

连接器需要刷新令牌，您可以通过一次性用户登录获得该令牌。以下步骤使用带有本地主机重定向的 OAuth 2.0 授权代码流，适用于具有多重身份验证 (MFA) 的用户。对于非 MFA 服务账户，最后提供了一种更简单的替代方案。

**授权码流程（推荐）**

1. **生成登录网址。**将占位符替换为您的租户 ID 和步骤 1 中的应用程序（客户端）ID。如果您在步骤 1 中使用了不同的本地主机端口，请更新`redirect_uri`以匹配该端口。

   ```
   https://login.microsoftonline.com/{{TENANT_ID}}/oauth2/v2.0/authorize?client_id={{CLIENT_ID}}&response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A53672%2Fcallback&response_mode=query&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default%20offline_access
   ```

1. **登录。**在浏览器中打开网址，然后以你希望连接器使用其访问权限的 Microsoft 365 用户身份登录。完成任何 MFA 挑战。

   然后，浏览器会重定向到 localhost URL，该网址不会加载（这是预料之中的，因为该端口上没有任何东西在监听）。浏览器地址栏现在包含重定向 URI 后跟一个`code`参数，例如：`http://localhost:53672/callback?code=0.AXoA...&session_state=...`。

1. **复制授权码。**从地址栏中复制`code`参数的值（介于`code=`和下一个之间的所有值`&`）。该代码在几分钟内有效；请立即完成步骤 4。

1. **用代码兑换刷新令牌。**将占位符替换为您的租户 ID、应用程序（客户端）ID、步骤 3 中的客户端密钥以及您刚刚复制的授权码。

   ```
   curl -s -X POST \
     "https://login.microsoftonline.com/{{TENANT_ID}}/oauth2/v2.0/token" \
     -H "Content-Type: application/x-www-form-urlencoded" \
     -d "grant_type=authorization_code" \
     -d "client_id={{CLIENT_ID}}" \
     -d "client_secret={{CLIENT_SECRET}}" \
     -d "code={{AUTHORIZATION_CODE}}" \
     -d "redirect_uri=http://localhost:53672/callback" \
     -d "scope=https://graph.microsoft.com/.default offline_access"
   ```

   该响应包括`refresh_token`。为步骤 5 录制下来。

**资源所有者密码凭证（非 MFA 服务账户的替代方案）**

如果您的账户不需要 MFA，并且不受强制交互式登录的条件访问策略的约束，则可以跳过浏览器流程，直接将用户的凭据交换为刷新令牌。用您的值替换占位符，包括用户的 UPN 和密码。

```
curl -s -X POST \
  "https://login.microsoftonline.com/{{TENANT_ID}}/oauth2/v2.0/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=password" \
  -d "client_id={{CLIENT_ID}}" \
  -d "client_secret={{CLIENT_SECRET}}" \
  -d "username={{USER_UPN}}" \
  -d "password={{USER_PASSWORD}}" \
  -d "scope=https://graph.microsoft.com/.default offline_access"
```

该响应包括`refresh_token`。为步骤 5 录制下来。此流程不适用于强制执行 MFA 的账户；请改用上面的授权代码流程。

## 第 5 步：创建 Secrets Manager 密钥
<a name="kb-managed-onedrive-oauth2-step5"></a>

使用以下键值对将凭证存储在 AWS Secrets Manager 密钥中：
+ `clientId`— 步骤 1 中的应用程序（客户端）ID。
+ `clientSecret`— 步骤 3 中的客户机密值。
+ `refreshToken`— 步骤 4 中的刷新令牌。

```
{
    "clientId": "{{your-client-id}}",
    "clientSecret": "{{your-client-secret}}",
    "refreshToken": "{{your-refresh-token}}"
}
```

使用以下命令创建密钥 AWS Command Line Interface：

```
aws secretsmanager create-secret \
  --name {{bedrock-onedrive-oauth2-creds}} \
  --secret-string file://secret.json
```

记录响应中的秘密 ARN。您可以将其用作数据源`secretArn`。

**注意**  
`OAUTH2`连接器从你的密钥中读取一次刷新令牌，并在每次同步时重复使用它，它不会保存 Microsoft 返回的轮换值。计划铸造一个新的刷新令牌（步骤 4），并在现有刷新令牌到期之前更新密钥中的`refreshToken`字段。如果您没有及时更新密钥，则同步会失败，并出现令牌刷新错误，直到您这样做。

## 后续步骤
<a name="kb-managed-onedrive-oauth2-next"></a>

存储密钥后，在`authType`设置为的情况下创建数据源`OAUTH2`。您没有为此方法提供证书。请参阅[Connect OneDrive 数据源](kb-managed-ds-onedrive-connect.md)。