OAuth 外部 URL 和认证 URL

您可以使用“认证 URL”或“外部 URL”参数来请求来自远程服务器的用户定义的内容,并将其包含在访问令牌中或者包含在含有访问令牌的响应有效内容中。

在令牌中包含定制元数据

在许多场景中,在访问令牌生成过程中需要包含定制元数据。 这些元数据存储在访问令牌中,或者随访问令牌一起发送到客户机应用程序。 然后,客户机应用程序可以在后续请求中将该访问令牌或有效内容中的元数据发送到 IBM® API Connect ,在此请求中根据需要检索,验证或将元数据发送到下游系统。

示例包括但不限于:
  • 对资源所有者进行认证时,需要将有关接受认证的资源所有者的元数据存储在访问令牌中。
  • 用于获取令牌的授权类型同样是访问令牌中存储的元数据的示例。
  • 需要随访问令牌一起发送至客户机应用程序的确认代码作为元数据存储在访问令牌内。

API Connect 中配置外部 URL 或验证 URL 以获取元数据

可使用以下任一 URL 或同时使用以下两个 URL 来设置元数据:
  • 外部 URL - 当您调用外部 URL 时,系统会发送一个 HTTP GET 请求,并 API Connect 期望收到 HTTP 200 OK 状态码,同时可选地包含一组指定的响应头。
  • 身份验证 URL - 当您调用身份验证 URL 时 API Connect ,网关会发送一个包含 HTTP 头部的 GET 请求,然后处理来自 URL 的任何 HTTP 响应。 对于认证,预计在认证 URL 处提供 REST 认证服务。

    参见: 身份验证 URL

在 Cloud Manager 或 API Manager UI 中配置 OAuth 提供者时,在元数据部分中输入“外部 URL”端点。

根据您使用的网关类型,在响应中使用以下 HTTP 标头:
  • DataPower® API Gateway:
    X-API-OAUTH-METADATA-FOR-PAYLOAD
    X-API-OAUTH-METADATA-FOR-ACCESSTOKEN
    注意: 前面的标题是 OAuth 提供程序的默认标题名称, DataPower API Gateway 但您可以覆盖它们,请参阅《配置原生提供程序的元数据》。
  • DataPower Gateway (v5 compatible):
    API-OAUTH-METADATA-FOR-PAYLOAD
    API-OAUTH-METADATA-FOR-ACCESSTOKEN

来自 X-API-OAUTH-METADATA-FOR-PAYLOADAPI-OAUTH-METADATA-FOR-PAYLOAD 的响应头值将放置在响应有效内容中,并指示为 metadata

来自 X-API-OAUTH-METADATA-FOR-ACCESSTOKENAPI-OAUTH-METADATA-FOR-ACCESSTOKEN 的响应头值将放在访问令牌中并指示为 miscinfo

这两个元数据响应头不区分大小写,且字符串值中的任何特殊字符都必须进行转义。

在访问令牌中包含元数据的响应有效内容示例如下:
{
"token_type":  "bearer",
"access_token":  "AAEkNzhjDHYyyYy...cL0Mv6ctl37w7ZU",
"metadata":  "m:metadata-for-payload_content"
"expires_in":  3600,
"scope":  "read",
"refresh_token":  "AAEnj5SynCMybF...oEZ6JjxYax_HdNg",
}
以下来自令牌自省端点的此示例输出显示了访问令牌的内容以及包含元数据信息的 "miscinfo"

{
"active":  true,
"token_type":  "bearer",
"client_id":  "78c2f10f-799a-4e1f-8e0a-098634997a35",
"username":  "Fred Smith",
"sub":  "fred",
"exp":  1479850049,
"expstr":  "2016-11-22T21:27:29Z",
"iat":  1479846449,
"nbf":  1479846449,
"nbfstr":  2016-11-22T20:27:29Z",
"scope":  "read",
"miscinfo":  "m:metadata-for-accesstoken_content",
"client_name":  "MobileApp"
}

输入到外部 URL

以下请求头发送到“外部 URL”。
注意: 之前从身份验证 URL 发送的任何现有元数据值也会在两个请求标头 x-existing-metadata-for-payloadx-existing-metadata-for-access-token 中发送。 元数据 URL 可以利用这些信息生成一组新的元数据值。
发送到“元数据 URL”的两个请求头以粗体文本显示。
X-existing-metadata-for-payload     payload-from-auth-url
X-existing-metadata-for-access-token     token-from-auth-url
X-URI-in     /org/env/miscinfo/oauth2/token (the URL that was sent to APIConnect for this particular token request)
X-METHOD-in     POST
X-POST-Body-in     client_id=client_id&grant_type=password&scope=read&username=name&password=password
X-X-Client-IP     IP_address
X-X-Global-Transaction-ID     ID_number
...

正在 API Connect 中检索元数据

如先前示例场景中所述,可以从“应用程序 API”中的访问令牌检索元数据,并将其发送到下游系统。 可以在 API 组合件中完成检索,这是接受安全性定义中的令牌的安全方式。

在接受访问令牌的资源 API 中,可在组合件中使用 oauth.miscinfo 上下文变量访问 miscinfo 字段,如以下示例中所示。
apim.setvariable('message.body',apim.getvariable('oauth.miscinfo'));

您还可以使用令牌自省来查看访问令牌的内容。

刷新令牌和元数据

在对资源所有者进行身份验证时,会首先启动身份验证 URL (如果已配置用于身份验证)。 外部 URL 作为最后一步启动,紧接在生成访问令牌之前。 唯一例外是从刷新令牌生成访问令牌时。 当使用刷新令牌生成新的访问令牌时,外部 URL 不会被启动。 保留来自刷新令牌的元数据,然后将其复制到新生成的访问令牌。

识别元数据的源

元数据以关键字为前缀,指示是源自外部 URL 还是认证 URL。

  • 来自外部 URL 的元数据以 m: 为前缀
  • 来自认证 URL 的元数据以 a: 为前缀
注: 当启用撤销时,某些内部详细信息也存储在 miscinfo 字段中,位于访问令牌的方括号内,如以下示例中所示:
"miscinfo": "[tlsprofile@https://api-revoke-url:443/server/revocation-url]m:metadata-for-accesstoken_content"

元数据的最大大小

访问令牌的元数据不能超过 512 个字节。

有效内容的元数据没有特定的大小限制,除非您使用授权代码授权类型。 以下各节将对这些限制进行说明。

元数据中不允许使用某些字符

在使用授权码或带同意的隐式授权时,来自认证的 URL 的元数据会被临时存储。

API Connect 系统内部使用两个前缀—— !ma!mp ——来区分从身份验证 URL 接收到的有效载荷和令牌元数据,并将它们存储在内部的临时状态/代码中。 因此,这些特定字符序列 - !ma!mp 不应用作为元数据本身。

授权类型和元数据

下文所述的 OAuth 资助类型包括 authorization code (access code)implicit、和 client credentials (application)

授权代码授权类型
  • 在三步授权码流程中,来自身份验证 URL 的元数据会被存储在 dp-state 并传递至授权码和访问令牌。 在存储于. dp-state文件时,系统会使用大约10个字符来区分有效负载的元数据和访问令牌的元数据。 此外,如果启用了撤销功能,该信息也会作为令牌元数据的一部分。 令牌元数据、有效载荷元数据(包括内部数据)以及内部撤销详细信息的总大小不得超过 512 字节。

    如果元数据的总体大小超过 512 字节,那么访问令牌生成成功,但元数据字段包含错误消息 "metadata too large" 如示例中所示。
    "metadata":"m:error: metadata too large for AZ code grant type[Authorization Code-metadata-url-payload]"
    "miscinfo":"[r:gateway]m:error: metadata too large for AZ code grant type[Authorization Code-metadata-url-token]"

    当元数据是从元数据端点( URL )而非认证端点( URL )发送时,该大小限制不适用,因为元数据并未存储在授权 dp-state 码中。

    authorization code (access code) 授权类型的示例:
     $ curl -k -d
    "grant_type=authorization_code&code=$mycode&client_id=$myid&scope=scope_introspect&redirect_uri=" https://9.70.153.90/fei/sb/introspectp1/oauth2/token
    { "token_type":"bearer",
    "access_token":"AAEkOThlZDhhNjYtYTQ1ZS00YTMzLWE0N2QtZmE2OGZkMzQ0NzQ20ZN5Tl_TqYFeIfB7BFf6HFgibEoOjWXXEA84oFsWuE4NY-RRZVdnGSaXAIYJz7s5vczfk5EV-BIb_6P_1YKm3ahrfhR5kI3sPO0uADEoseIP5-O9anUpEM5yhsayXvZbJ_6VDYz-hyXSJHTNqVj-PHBialoRkBD5qca6kO0fV2M", "metadata":"a:[Authorization Code-Test-auth-url-payload]", "expires_in":3600, "scope":"scope_introspect", "refresh_token":"AAFAg1EVMbwicr_L0fTZ4q6HZ-RcQygniXFC9zbSKO4wd3hcniC4KQX21X0fL2c8cnmzCZgws8xxLzNyfjQhUJNGl5C1GbIe3dwhXJdiWA0Go-dduhVtCbG26sJRRXyYrMeRxWnJsylBETPI8HQEN4a_D7fmxKcTVRZBvq86byg95qe1ZKyERi0Lhxdd_O4Nvss" }
    
    
    $ curl -k -H "X-IBM-Client-Id: $myid" -H "X-IBM-Client-Secret: $mysecret" -d "token_type_hint=access_token&token=$mytoken" https://9.70.153.90/fei/sb/introspectp1/oauth2/introspect
    { "active":true, "token_type":"bearer", "client_id":"98ed8a66-a45e-4a33-a47d-fa68fd344746", "username":"anyuser", "sub":"anyuser", "exp":1484766368, "expstr":"2017-01-18T19:06:08Z", "iat":1484762768, "nbf":1484762768, "nbfstr":"2017-01-18T18:06:08Z", "scope":"scope_introspect", "miscinfo":"[r:gateway]a:[Authorization Code-Test-auth-url-token]", "client_name":"oauth_app" }
隐式授权类型
  • 使用隐式授权类型时,在 location 头中将访问令牌和元数据作为片段返回,如以下示例所示。
    < Location:
     https://localhost#access_token=AAEkOThlZDhhNjYtYTQ1ZS00YTMzLWE0N2QtZmE2OGZkMzQ0NzQ2buS2KfWdq-nYBJSi4nmPxQBtLae17tKBPRMzwP5BC386nlxpoOTE1G748ZVH6Mq_TJL3GeV3PtXTVIkWOLBJi_7tljiQfpnVfrNkovvZkhUexYmFkcDsmLSdaWxZ6PcIMPAC4ojT8qV1sYV-ChTk36yqOx_NiKimZaDikDk7WTg&expires_in=3600&scope=scope_introspect&token_type=bearer&metadata=a%3A[Implicit-Test-auth-url-payload]
    
    $ curl -k -H "X-IBM-Client-Id: $myid" -H "X-IBM-Client-Secret: $mysecret" -d "token_type_hint=access_token&token=$mytoken" https://9.70.153.90/fei/sb/introspectp1/oauth2/introspect
                  { "active":true, "token_type":"bearer", "client_id":"98ed8a66-a45e-4a33-a47d-fa68fd344746", "username":"anyuser", "sub":"anyuser", "exp":1484768365, "expstr":"2017-01-18T19:39:25Z", "iat":1484764765, "nbf":1484764765, "nbfstr":"2017-01-18T18:39:25Z", "scope":"scope_introspect", "miscinfo":"[r:gateway]a:[Implicit-Test-auth-url-token]", "client_name":"oauth_app" }
    
客户机凭证授权类型

在使用客户端凭据授权类型时, URL 无法启动,因为没有资源所有者。 来自认证 URL 的元数据不可用于此授权类型。 不过,从元数据 URL 返回的内容会被作为元数据包含在内。

使用外部 URL 和认证 URL 检索元数据时的行为

如果配置了外部 URL 并且成功连接外部服务器,那么响应头将覆盖从认证 URL 获取的任何现有元数据,以成为最终值。 因此,您必须仔细检查入局请求头,并通过外部 URL 创建相应的响应头。

如果配置了外部 URL ,但与外部 URL 的连接失败,则会出现"...... "的失败消息error on metadata url" 同时写入有效内容和访问令牌中的元数据。

如果远程服务器未发送指定的 HTTP 响应头,则元数据将填入空值。
注意: 外部 URL 会覆盖来自Authentication URL 的现有值,包括空值。

如果未配置外部 URL,那么通过授权 URL 获取的元数据将保留为最终值。