Azure APIM:外部后端API OAuth2身份验证,支持持有者令牌集成

5lhxktic  于 2022-09-21  发布在  其他
关注(0)|答案(2)|浏览(140)

我们目前的情况是:

  • 在Azure API管理器中,我们基于Swagger定义构建一些API。
  • API提供商向我们提供了客户端ID和密码。
  • 其中一些API调用需要使用承载令牌进行身份验证,该令牌是在提供商的API基础设施上使用上面提到的/Token端点生成的,我们希望在APIM中集成这些API调用的身份验证流(因为前端将以另一种方式进行身份验证(可能是CORS))
  • 我们尝试了各种方法,使用了APIM设置中“OAuth2.0”服务配置的各种变体,并将它们应用到我们不断获得未经授权的401的API定义中。

作为起点,我们使用了https://docs.microsoft.com/en-us/azure/api-management/api-management-howto-protect-backend-with-aad,但我们发现的大多数解释都与使用AD有关,据我们所知,我们不需要使用AD。

我们尝试将以下OAuth 2.0 Postman 授权配置实现到APIM中(它实际上在Postman中工作)。

有没有一种简单直接的方法来告诉APIM使用给定的ClientID和密码调用令牌URL,并将带有承载令牌的授权头添加到后端API中?

xeufq47z

xeufq47z1#

感谢Gary为我指明了正确的方向。我对这个主题还很陌生,所以我的方法可能远不是完美的,但它是有效的。

最后,我修改了API调用的入站策略,并添加了以下内容(将xxxx替换为适当的设置)

<policies>
<inbound>
//....
<send-request mode="new" response-variable-name="tokenstate" timeout="20" ignore-error="true">
    <set-url>https://xxxxxxxxxx.azurewebsites.net/connect/token</set-url>
    <set-method>POST</set-method>
    <set-header name="Content-Type" exists-action="override">
        <value>application/x-www-form-urlencoded</value>
    </set-header>
    <set-header name="Accept" exists-action="override">
        <value>*.*</value>
    </set-header>
    <set-body>
 @("grant_type=client_credentials&scope=xxxxxx&client_id=xxxxxxxx&client_secret=xx") 
        </set-body>
</send-request>
<set-variable name="bearerToken" value="@(((IResponse)context.Variables["tokenstate"]).Body.As<JObject>()["access_token"].ToString())" />
<set-header name="Authorization" exists-action="override">
<value>@("Bearer " + (string)context.Variables["bearerToken"])</value>
</set-header>
<set-header name="Content-Type" exists-action="override">            
 <value>application/json</value>
</set-header>
<set-header name="Accept" exists-action="override">
 <value>*/*</value>
</set-header>
</inbound>

简短说明

1.发起一个新的请求,该响应将存储在变量(令牌状态)中

  • 方法定义为POST
  • 设置请求头部(Centent-Type&Accept)
  • 定义请求的正文

1.由于令牌请求的响应(存储在tokenState中)是JSON格式的,因此请求的响应被强制转换为JObject,而“Access_Token”存储在“bearerToken”变量中(或者,您也可以不赋值该变量,并将该行立即放入下一步。
1.设置AutorizationHeader,取值为“Beeller”+[BearerToken]

我需要能够调试的附加步骤(设置头部Content-Type和Accept),但在正常情况下,它们将由API的请求客户端添加。

rqdpfwrv

rqdpfwrv2#

是的-您可以做到这一点,下面是一个遵循类似过程的安全资源:

  • 根据传入凭据发出OAuth请求以获取JWT
  • 转发到下游接口
  • 缓存结果,以便后续请求使用相同的传入凭据

您的案例略有不同,但使用了相同的构建块。您只需调整OAuth消息以使用客户端凭据流。

相关问题