实现客户端凭据授权类型

您正在查看的是 Apigee Edge 文档。
转到 Apigee X 文档
信息

使用客户端凭据授权类型时,应用会将自己的凭据(客户端 ID 和客户端密钥)发送到 Apigee Edge 上的端点,后者将设置为生成访问令牌。如果凭据有效,则 Edge 会向客户端应用返回访问令牌。

关于此主题

本主题对 OAuth 2.0 客户端凭据授权类型进行了大致说明,并讨论了如何在 Apigee Edge 上实现此流。

用例

通常,如果应用也是资源所有者,则使用此授权类型。例如,应用可能需要访问一项后端云端存储服务,才能存储和检索用于执行其工作的数据,而不是最终用户专门拥有的数据。此授权类型流严格在客户端应用与授权服务器之间进行。最终用户不参与此授权类型流。

角色

角色指定参与 OAuth 流的“演员”。我们来简单了解一下客户端凭据角色,以帮助说明 Apigee Edge 适合的用途。如需查看完整的 OAuth 2.0 角色讨论,请参阅 IETF OAuth 2.0 规范

  • 客户端应用 - 需要访问用户受保护的资源的应用。通常,在使用此流时,应用在服务器上运行,而不是在用户的笔记本电脑或设备上本地运行。
  • Apigee Edge - 在此流中,Apigee Edge 是 OAuth 授权服务器。其角色是生成访问令牌、验证访问令牌,并将受保护的资源的授权请求传递到资源服务器。
  • 资源服务器 - 用于存储客户端应用需要访问权限的受保护数据的后端服务。如果要保护 Apigee Edge 上托管的 API 代理,那么 Apigee Edge 也是资源服务器。

代码示例

您可以在 GitHub 上找到客户端凭据授权类型的完整有效实现示例。如需更多示例的链接,请参阅下文的其他资源

流程图

以下流程图说明了 Apigee Edge 充当授权服务器时的客户端凭据流。通常,Edge 也是此流中的资源服务器,即 API 代理是受保护的资源。


客户端凭据流中的步骤

以下是在 Apigee Edge 用作授权服务器的情况下实现客户端凭据代码授权类型所需的步骤的摘要。请注意,使用此流时,客户端应用只会提供其客户端 ID 和客户端密钥;如果它们有效,Apigee Edge 会返回一个访问令牌。

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

1. 客户端请求访问令牌

如需接收访问令牌,客户端会向 Edge 发出 API 调用,其中使用从注册的开发者应用获取的客户端 ID 和客户端密钥的值。此外,必须将 grant_type=client_credentials 参数作为查询参数传递。(但是,您可以将 OAuthV2 政策配置为在请求标头或正文中接受此参数 - 如需了解详情,请参阅 OAuthV2 政策)。

例如:

$ curl -i -H 'Content-Type: application/x-www-form-urlencoded' -X POST 'https://docs-test.apigee.net/oauth/accesstoken' -d 'grant_type=client_credentials&client_id=ns4fQc14Zg4hKFCNaSzArVuwszX95X&client_secret=ZIjFyTsNgQNyxI'

注意:虽然您可以将 client_id 和 client_secret 值作为查询参数传递,如上所示,但最好在 Authorization 标头中将其作为 base64 网址编码字符串传递。为此,您需要使用 base64 编码工具或实用程序对这两个值进行编码,并使用冒号分隔它们。如下所示: aBase64EncodeFunction(clientidvalue:clientsecret)。因此,上述示例将按如下方式编码:

result = aBase64EncodeFunction(ns4fQc14Zg4hKFCNaSzArVuwszX95X:ZIjFyTsNgQNyxI) // 注意分隔连个值的冒号。

上述字符串的 base64 编码结果如下所示: bnM0ZlFjMTRaZzRoS0ZDTmFTekFyVnV3c3pYOTVYOlpJakZ5VHNOZ1FOeXhJOg==

然后,按照如下方式发出令牌请求:

$ curl -i -H 'Content-Type: application/x-www-form-urlencoded' -X POST 'https://docs-test.apigee.net/oauth/accesstoken' -d 'grant_type=client_credentials' -H 'Authorization: Basic bnM0ZlFjMTRaZzRoS0ZDTmFTekFyVnV3c3pYOTVYOlpJakZ5VHNOZ1FOeXhJOg=='

2. Edge 验证凭据

请注意,API 调用将发送到 /accesstoken 端点。此端点附加了一个政策,用于验证应用的凭据。也就是说,该政策会将提交的密钥与 Apigee Edge 在注册应用时创建的密钥进行比较。如需详细了解 Edge 上的 OAuth 端点,请参阅配置 OAuth 端点和政策

3. Edge 返回响应

如果凭据可以使用,则 Edge 会向客户端返回一个访问令牌。否则,将返回错误。

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

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

配置流和政策

作为授权服务器,Edge 会处理访问令牌请求。作为 API 开发者,您需要创建具有自定义流的代理来处理令牌请求,以及添加和配置 OAuthV2 政策。本部分介绍如何配置该端点。

自定义流配置

展示如何配置 API 代理流的最简单方法是显示 XML 流定义。以下示例 API 代理流旨在处理访问令牌请求。例如,如果请求传入且路径后缀与 /accesstoken 匹配,则会触发 GetAccessToken 政策。如需大致了解创建此类自定义流所需的步骤,请参阅配置 OAuth 端点和政策

<Flows>
  <Flow name="GetAccessToken">
         <!-- This policy flow is triggered when the URI path suffix
         matches /oauth/accesstoken. Publish this URL to app developers 
         to use when obtaining an access token using an auth code   
         -->
    <Condition>proxy.pathsuffix == "/oauth/accesstoken"</Condition>
    <Request>
        <Step><Name>GetAccessToken</Name></Step>
    </Request>
  </Flow>
</Flows>

使用政策配置流

您需要将政策附加到端点,如下所示。如需大致了解向代理端点添加 OAuthV2 政策所需的步骤,请参阅配置 OAuth 端点和政策

获取访问令牌

此政策将附加到 /accesstoken 路径。它使用指定了 GenerateAccessToken 操作的 OAuthV2 政策。

<OAuthV2 name="GetAccessToken">
  <Operation>GenerateAccessToken</Operation>
  <ExpiresIn>3600000</ExpiresIn>
  <SupportedGrantTypes>
    <GrantType>client_credentials</GrantType>
  </SupportedGrantTypes>
  <GenerateResponse/>
</OAuthV2>

用于获取访问令牌的 API 调用是 POST,其中包含带有 base64 编码 client_id + client+secret 的授权标头,以及查询参数 grant_type=client_credentials。它还可以包含 scope 和 state 的可选参数。例如:

$ curl -i -H 'Content-Type: application/x-www-form-urlencoded' -X POST 'https://docs-test.apigee.net/oauth/accesstoken' -d 'grant_type=client_credentials' -H 'Authorization: Basic c3FIOG9vSGV4VHo4QzAySVgT1JvNnJoZ3ExaVNyQWw6WjRsanRKZG5lQk9qUE1BVQ'

附加验证访问令牌政策

如需使用 OAuth 2.0 安全性保护您的 API,您需要添加具有 VerifyAccessToken 操作的 OAuthV2 政策。此政策会检查传入请求是否具有有效的访问令牌。如果令牌有效,Edge 将处理请求。如果无效,Edge 将返回错误。如需了解基本步骤,请参阅验证访问令牌

<OAuthV2 async="false" continueOnError="false" enabled="true" name="VerifyAccessToken">
    <DisplayName>VerifyAccessToken</DisplayName>
    <ExternalAuthorization>false</ExternalAuthorization>
    <Operation>VerifyAccessToken</Operation>
    <SupportedGrantTypes/>
    <GenerateResponse enabled="true"/>
    <Tokens/>
</OAuthV2>

调用受保护的 API

如需调用使用 OAuth 2.0 安全性保护的 API,您需要提供有效的访问令牌。正确的模式是将令牌添加到 Authorization 标头,如下所示:请注意,访问令牌也称为“不记名令牌”。

$ curl -H "Authorization: Bearer UAj2yiGAcMZGxfN2DhcUbl9v8WsR" \
  http://myorg-test.apigee.net/v0/weather/forecastrss?w=12797282 

另请参阅发送访问令牌

其他资源

  • Apigee 为 API 开发者提供在线培训,包括 API 安全课程,其中涵盖 OAuth。
  • OAuthV2 政策 - 展示如何向授权服务器发出请求以及如何配置 OAuthV2 政策的许多示例。