实现密码授权类型

<ph type="x-smartling-placeholder"></ph> 您正在查看 Apigee Edge 文档。
转到 Apigee X 文档
信息

资源所有者密码(或“密码”)授予类型大多在高度信任该应用的情况下使用。在此配置中,用户向客户端应用提供其资源服务器凭据(用户名/密码),该凭据会以访问令牌请求的形式将它们发送到 Apigee Edge。身份服务器验证凭据,如果凭据有效,则 Edge 将继续创建访问令牌并将其返回给应用。

关于此主题

本主题概述了 OAuth 2.0 资源所有者密码授权类型流,并讨论了如何在 Apigee Edge 上实现此流。

您可能会发现有用的示例

  • 请求访问令牌:密码授权类型:介绍如何构建令牌请求、为密码授权类型配置 OAuthV2 政策,以及如何在 Edge 中为政策配置端点。
  • oauth-validate-key-secret:GitHub 中可部署到 Edge 并试用的示例代理。这是一个具有密码授权类型的端到端示例。它演示了一个最佳做法,即在将用户的凭据发送到身份提供商之前,先对客户端应用的凭据(密钥/密码)进行身份验证。

视频

视频:观看此视频,了解如何实现密码授权类型。

使用场景

此授权类型适用于高度可信或特权应用,因为用户必须向应用授予其资源服务器凭据。通常,应用提供了一个登录屏幕,供用户输入其凭据。

流程图

以下流程图说明了以 Apigee Edge 作为授权服务器的资源所有者密码授权类型的流程。

提示:要查看此图表的较大版本,请右键点击并在新的标签页中打开它,也可以将其保存并在图片查看器中打开。

密码授权类型流程中的步骤

以下是在 Apigee Edge 用作授权服务器的情况下实施密码授予类型所需的步骤的摘要。

前提条件:客户端应用必须在 Apigee Edge 上注册才能获得客户端 ID 和客户端密钥。如需了解详情,请参阅注册客户端应用

1. 用户启动流程并输入凭据

如果应用需要访问用户的受保护资源(例如,用户点击应用中的按钮),则用户会被重定向到登录表单。

2. 应用向 Apigee Edge 请求访问令牌

该应用将访问令牌请求(包括用户的凭据)发送到 Apigee Edge 上的 GenerateAccessToken 端点。

下面是一个 POST 请求示例,其中包含此授权类型所需的参数:

$ curl -i \
  -X POST \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'Authorization: Basic c3FIOG9vSGV4VHo4QzAySVg5T1JvNnJoZ3ExaVNyQWw6WjRsanRKZG5lQk9qUE1BVQ' \
  -d 'grant_type=password&username=the-user-name&password=the-users-password' \
  https://docs-test.apigee.net/oauth/token

或者,该命令可以按以下方式执行,即为您使用 -u 选项通过 curl 创建 base64 编码的基本身份验证标头。

$ curl -i \
  -X POST \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -u sqH8ooHexTz8C02IX9ORo6rhgq1iSrAl:Z4ljtJdneBOjPMAU \
  -d 'grant_type=password&username=the-user-name&password=the-users-password' \
  https://docs-test.apigee.net/oauth/token

(这些命令中的每一个都应放在一行上。)

用户凭据包含在表单参数中,而客户端凭据在 HTTP 基本身份验证标头中进行编码。如需此 API 调用的详细说明(包括所需的基本 Auth 标头的详细信息),请参阅请求访问令牌和授权代码中的密码授权部分。

3.Edge 验证客户端应用

在将用户的用户名和密码发送到身份提供商之前,Edge 需要知道发出请求的客户端应用是有效可信的应用。一种方法是在 API 调用中使用 API 密钥进行身份验证。在某些情况下,您可能需要验证客户端密钥和密文这两者。在 GitHub 上的 api-platform-samples 代码库中有一个示例代理说明了这种替换方法。

4.Edge 会处理登录凭据

验证客户端应用后,您可以使用服务调出或 JavaScript 政策来调用身份服务,并发送用户的凭据。例如,可以是 LDAP 服务,或您想要用于验证凭据的任何服务。如需详细了解这些政策,请参阅提取变量政策JavaScript 政策

如果身份服务验证凭据并返回 200 响应,则 Edge 将继续处理请求;否则,Edge 将停止处理并向客户端应用返回错误。

5. OAuthV2 政策执行

如果凭据有效,则下一处理步骤将执行为密码授权类型配置的 OAuthV2 政策。示例如下。<UserName> 和 <PassWord> 元素是必需的,您可以从使用 ExtractVariables 政策保存的流变量中检索这些元素。如需详细了解此政策,请参阅 OAuthV2 政策

<OAuthV2 name="GetAccessToken">
  <Operation>GenerateAccessToken</Operation>
  <ExpiresIn>360000000</ExpiresIn> 
  <SupportedGrantTypes> 
     <GrantType>password</GrantType> 
  </SupportedGrantTypes> 
  <GrantType>request.queryparam.grant_type</GrantType> 
  <UserName>login</UserName>
  <PassWord>password</PassWord>
  <GenerateResponse/> 
</OAuthV2>

如果此政策成功,系统将生成包含访问令牌的返回客户端的响应。响应采用 JSON 格式。示例如下:请注意,access_token 是以下元素之一:

{
    "issued_at": "1420258685042",
    "scope": "READ",
    "application_name": "ce1e94a2-9c3e-42fa-a2c6-1ee01815476b",
    "refresh_token_issued_at": "1420258685042",
    "status": "approved",
    "refresh_token_status": "approved",
    "api_product_list": "[PremiumWeatherAPI]",
    "expires_in": "1799",
    "developer.email": "tesla@weathersample.com",
    "organization_id": "0",
    "token_type": "BearerToken",
    "refresh_token": "IFl7jlijYuexu6XVSSjLMJq8SVXGOAAq",
    "client_id": "5jUAdGv9pBouF0wOH5keAVI35GBtx3dT",
    "access_token": "I6daIgMSiUgYX1K2qgQWPi37ztS6",
    "organization_name": "docs",
    "refresh_token_expires_in": "0",
    "refresh_count": "0"
}

6. 客户端调用受保护的 API

现在,通过有效的访问代码,客户端便可以向受保护的 API 发出调用。在这种情况下,系统会向 Apigee Edge(代理)发出请求,Edge 负责在将 API 调用传递到目标资源服务器之前验证访问令牌。访问令牌在 Authorization 标头中传递。例如:

$ curl -H "Authorization: Bearer I6daIgMSiUgYX1K2qgQWPi37ztS6
" http://{org_name}-test.apigee.net/weather/forecastrss?w=12797282