Azure API 管理和后端 Web API
Azure API Management and Backend Web API
我在 Azure 应用服务中部署了 Web API。 Web API 使用 Azure AD 进行保护。我计划使用 API 管理将 api 公开给各种用户。
现在,我已经在 API 管理中启用了对开发人员门户的基本身份验证。另外,我为后端服务器启用了 OAuth 2.0 身份验证(用户授权)。所以,如果我登录到开发人员门户,我可以看到两个字段 - 订阅密钥和授权。订阅密钥将是开发者对门户的订阅,授权将是后端服务器所需的 OAuth 授权。
此外,如果api管理url需要任何用户访问,用户需要在查询字符串中传递订阅密钥和授权header中的令牌(例如:桌面客户端)。
有没有办法只使用 JWT 令牌而不使用订阅密钥来调用 api 管理 url(但我仍然需要知道哪个 developer/user 有访问了服务)。我期待的是单一令牌,可用于向开发人员门户验证用户身份,并可用于向后端进行身份验证 api(通过转换为后端服务器令牌或任何其他意思是)
谢谢,
约翰
是的,你可以做到(有点 hack)。你必须为此使用 REST Api,特别是这个 call。对我来说,编辑现有的 API 不起作用(它们的密钥仍然存在),但是当我创建新的 API 时,密钥不存在:
我不得不模糊我所有的东西,对此感到抱歉。因此,要实现这一点,您需要发出以下查询:
路径:
PUT https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/apis/{apiId}?api-version=2016-07-07&import=true&path={APIpostfix}
Headers:
Authorization = "Bearer TOKEN_GOES_HERE" ## Space after 'Bearer' is mandatory
Content-Type = "application/vnd.swagger.link+json" ## Look for the proper "Content-Type" on the page I've linked. This is the example to import API definition directly from "swagger.json" generated by your running api.
Body:
{
"name": "Name",
"description": "Desc",
"link": "http://url.to/your/swagger.json", ## <<only needed if you import directly from running API
"serviceUrl": "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/apis/{apiId}/backends/{APIpostfix}", ## << declare your API Management backend
"protocols": [
"https"
],
"authenticationSettings": {
"oAuth2": null,
"openid": null
},
"subscriptionKeyParameterNames": { ## << Magic happens here
"header": null,
"query": null
}
}
PS。我从来没有想过 PUT + Send 通过 swagger 文件,但我相信当你知道这一点时它非常简单。
APIM 中的订阅密钥与用户和产品相关联,因此如果您将产品更改(或创建新产品)以不需要订阅(在创建时或产品设置中可用的选项)则无需订阅调用此类产品中包含的任何 API 都需要密钥。
缺点是所有此类调用都会被 APIM 视为匿名,并在分析中显示为匿名。
我在 Azure 应用服务中部署了 Web API。 Web API 使用 Azure AD 进行保护。我计划使用 API 管理将 api 公开给各种用户。
现在,我已经在 API 管理中启用了对开发人员门户的基本身份验证。另外,我为后端服务器启用了 OAuth 2.0 身份验证(用户授权)。所以,如果我登录到开发人员门户,我可以看到两个字段 - 订阅密钥和授权。订阅密钥将是开发者对门户的订阅,授权将是后端服务器所需的 OAuth 授权。
此外,如果api管理url需要任何用户访问,用户需要在查询字符串中传递订阅密钥和授权header中的令牌(例如:桌面客户端)。
有没有办法只使用 JWT 令牌而不使用订阅密钥来调用 api 管理 url(但我仍然需要知道哪个 developer/user 有访问了服务)。我期待的是单一令牌,可用于向开发人员门户验证用户身份,并可用于向后端进行身份验证 api(通过转换为后端服务器令牌或任何其他意思是)
谢谢,
约翰
是的,你可以做到(有点 hack)。你必须为此使用 REST Api,特别是这个 call。对我来说,编辑现有的 API 不起作用(它们的密钥仍然存在),但是当我创建新的 API 时,密钥不存在:
我不得不模糊我所有的东西,对此感到抱歉。因此,要实现这一点,您需要发出以下查询:
路径:
PUT https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/apis/{apiId}?api-version=2016-07-07&import=true&path={APIpostfix}
Headers:
Authorization = "Bearer TOKEN_GOES_HERE" ## Space after 'Bearer' is mandatory
Content-Type = "application/vnd.swagger.link+json" ## Look for the proper "Content-Type" on the page I've linked. This is the example to import API definition directly from "swagger.json" generated by your running api.
Body:
{
"name": "Name",
"description": "Desc",
"link": "http://url.to/your/swagger.json", ## <<only needed if you import directly from running API
"serviceUrl": "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/apis/{apiId}/backends/{APIpostfix}", ## << declare your API Management backend
"protocols": [
"https"
],
"authenticationSettings": {
"oAuth2": null,
"openid": null
},
"subscriptionKeyParameterNames": { ## << Magic happens here
"header": null,
"query": null
}
}
PS。我从来没有想过 PUT + Send 通过 swagger 文件,但我相信当你知道这一点时它非常简单。
APIM 中的订阅密钥与用户和产品相关联,因此如果您将产品更改(或创建新产品)以不需要订阅(在创建时或产品设置中可用的选项)则无需订阅调用此类产品中包含的任何 API 都需要密钥。
缺点是所有此类调用都会被 APIM 视为匿名,并在分析中显示为匿名。