【问题标题】:How to (can you) configure Azure API Management for Auth0 single page application如何(你能)为 Auth0 单页应用程序配置 Azure API 管理
【发布时间】:2018-05-28 08:53:11
【问题描述】:
场景:Auth0 单页应用程序客户端。 .NET Web API 和 Angular SPA 都配置为使用此客户端。效果很好。
我想将 Azure API 管理添加为 API 前面的一个层。已在管理门户中设置 API,更新 SPA 以调用 API,测试来自 SPA 的调用,效果很好。
现在,我想使用正确的安全设置配置 API 管理门户,以便人们可以从开发人员门户调用 API。我用这个 [https://auth0.com/docs/integrations/azure-api-management/configure-azure] 作为指导。
我在哪里:
在开发者门户中,我可以选择授权代码作为身份验证类型,使用 Auth0 完成成功的登录过程并取回不记名令牌。但是,对 API 的调用总是返回 401。我认为这是因为我对如何正确设置它感到困惑。据我了解:
要么我按照说明在 Auth0 中设置一个新的 API 客户端,但如果是这种情况,那么它肯定不会起作用,因为从一个客户端生成的令牌不会对我的 SPA 客户端起作用? (或者我需要改变什么才能让它工作)
或者,我应该如何配置 Azure API 管理以使用 SPA 应用程序。 (这将是我的首选方法,在 Auth0 中有两个客户端似乎“混乱”)。但是,我的授权端点 URL 中不需要“受众”值吗?我怎么得到它?
如果有人这样做,将非常感谢这里的一些指导。
【问题讨论】:
标签:
single-page-application
auth0
azure-api-management
【解决方案1】:
由于您可以使用 .Net API 验证 jwts,因此实际上只需进行少量更改即可使用 Azure API 管理。
在 API 管理中,
在操作(或所有操作)上创建 validate-jwt 入站策略
将audiences 和issuers 设置为与您在.NET web api 中使用的相同。 (如果您还不知道,可以查看 Auth0 门户中的值)
此时缺少的重要字段是Open ID URLs,因为 auth0 默认使用 RS256。该 url 可以在您的 Auth0 门户中找到:应用程序 -> 您的单页应用程序 -> 设置 -> 向下滚动,Show Advanced Settings -> 端点。然后复制OpenID Configuration
Here's the reference API 管理对 JWT 令牌的要求
optional reading
【解决方案2】:
嗯,我不认为我会这么快回来回答我自己的问题。原因主要在于我对这些东西的普遍无知,再加上试图举出例子并将它们融合在一起以满足我的需要。发布此内容是为了帮助其他发现自己在这里的人。
我没有采用 Auth0 中的单一应用程序客户端并使其与 Azure API 管理一起使用,而是决定采用另一种方式,让非交互式客户端与我的 SPA 一起使用。这最终“感觉”更正确:API 是我要保护的东西,我应该让 API 管理门户正常工作,然后更改我的 SPA 以使用它。
一旦我记得/意识到我需要更新 API 中的受众以匹配 Auth0 中客户端中设置的受众,管理门户就开始工作了。让 SPA 与 API 一起工作变成了一个挑战:我试图找出如何更改 auth0 角度代码以传递受众以匹配 API 发送的受众,但它一直在发送 ClientID。 (顺便说一句,通过使用https://jwt.io/ 来解密 Bearer 令牌并弄清楚发生了什么,可以更轻松地找出所有这些 - 看看观众的 'aud' 值。
最后,我更改了我的API,在new JwtBearerAuthenticationOptions对象中,TokenValidationParameters对象(TokenValidationParameters类型)有一个属性ValidAudiences(是的,还有一个ValidAudience属性,混淆) 可以吸引多个观众。所以,我在其中添加了我的 ClientID。
我随后更改的唯一另一件事(可能是特定于我,不确定)是我必须为我的非交互式客户端更改 Auth0 中的 JsonWebToken 签名算法 值(高级设置, oAuth 选项卡)从 HS256 到 RS256。
完成所有这些后,现在来自 API 管理门户和我的 SPA 工作的请求。
很想知道这是否是“正确”的做法,或者我是否在这里做了任何被认为是危险的事情。