我正在考虑使用 Azure API 管理为许多后端 API 提供一致的前端。
大多数 API 使用 OAuth 2.0 应用程序流程(ClientID + 客户端密钥,后端 API 检查声明/范围)进行保护。这非常有效,但是当客户端通过 APIM 使用这些 API 时,他们需要提供 APIM 订阅密钥和 OAuth 2.0 令牌。据我了解,APIM 订阅密钥用于向 APIM 标识客户端(用于速率限制、日志记录等目的),而令牌用于后端身份验证/授权。
有没有什么方法可以使用客户端 ID 来替代 APIM 订阅密钥?也就是说,客户端不需要提供 APIM 订阅密钥,并且 OAuth 2.0 令牌身份用于所有 APIM 功能(例如,通过客户端 ID 限制速率)。
无法使用 OAuth 令牌来识别客户端,但您可以将其用于速率限制和日志记录(某种)。首先创建不需要订阅的新产品,添加到该产品的任何 API 都可以匿名访问。为了解决这个问题,您可以在该产品上放置 validate-jwt 策略来要求 OAuth 令牌并检查其声明,或者如果您真的不关心令牌内容,只想知道它在那里,您可以使用检查标头策略.
使用策略表达式,您可以执行 context.Headers.GetValueOrDefault("Authorization").AsJwt() 将提供的标头解析为 JWT 对象模型,检查其声明,并将其用于按密钥速率限制和按配额配额对每个客户端实施限制的关键策略。
为了使日志记录工作,目前没有其他方法,只能依靠 log-to-eventhub 策略并自己记录必要的信息。这确实意味着您需要维护 EventHub 实例和进一步的基础设施来从中读取记录并将其存储在某个地方。一些变化正在扩大日志记录功能,这将使这变得更容易。
看起来有点老套,但以下是如何更改特定 clientId 的速率限制
<choose>
<!-- Set a different rate for a specific client -->
<when condition="@(((Jwt)context.Variables["jwt"]).Claims["cid"][0] == "<specific clientId>")" >
<rate-limit-by-key calls="10000" renewal-period="60" counter-key="@{ var jwt = (Jwt)context.Variables["jwt"]; return jwt.Claims["cid"][0]; }" />
</when>
<otherwise>
<rate-limit-by-key calls="1000" renewal-period="60" counter-key="@{ var jwt = (Jwt)context.Variables["jwt"]; return jwt.Claims["cid"][0]; }" />
</otherwise>
</choose>