使用 WSO2-AM 处理 JWT
Posted
技术标签:
【中文标题】使用 WSO2-AM 处理 JWT【英文标题】:JWT handling with WSO2-AM 【发布时间】:2018-06-27 14:18:47 【问题描述】:我们计划推出 API 管理解决方案,目前正在使用 WSO2 AM 建立概念验证。我们想使用 WSO2 API 网关来检查是否允许某个消费者应用程序使用 API 并限制请求率。 我从事身份工作流程,我想知道消费应用程序如何通过 WSO2-AM 将 JWT 令牌传递给后端服务。
首先,这是我们当前的场景:
Without API gateway
-
消费应用程序从身份提供者那里为其碳用户获取 JWT 令牌。 JWT 包含一些关于用户的声明,例如他/她所属的角色。
应用程序调用服务并在 Authorization HTTP 标头中传递 JWT 令牌,例如:Authorization: Bearer
该服务验证 JWT 的颁发者和签名,并从中检索声明。
所以,这很简单。现在我们在应用程序和服务之间放置一个 API 网关:
With API gateway
-
消费应用程序从身份提供者那里为其碳用户获取 JWT 令牌。
消费应用程序使用 OAuth2 获取以下 API 调用的访问令牌。我们可以使用 client_credentials 授权类型并简单地传递客户端 ID 和客户端密码。我还没有尝试过,但我们可以使用 JWT 授权类型(请参阅https://docs.wso2.com/display/ISCONNECTORS/Configuring+JWT+Grant+Type)并使用 JWT 将用户信息传递给 API 网关。
在使用 JWT 授权类型时,API 网关会根据身份提供者的公钥验证 JWT。
访问令牌返回给应用程序。
应用向网关发送 API 请求,并在 Authorization HTTP 标头中传递访问令牌。
网关验证访问令牌。
网关将 API 请求转发给服务。
还有我的问题:JWT 怎么能从 1/2.传递给服务?
有一个“使用 JWT 将最终用户属性传递到后端”的文档(请参阅 https://docs.wso2.com/display/AM210/Passing+Enduser+Attributes+to+the+Backend+Using+JWT),但这会引入一个由 WSO2-AM 颁发和签名的新 JWT,我不确定这是否JWT 包含来自用于创建访问令牌(甚至是原始 JWT)的 JWT 的所有信息。
我能想到的另一种方法是使用自定义 HTTP 标头将 JWT 通过网关传递到服务。我不能使用 Authorization 标头(就像我们没有 API 网关一样),因为 WSO2-AM 需要该标头中的访问令牌。
由于我对这两种解决方案都不满意,所以我想问问专家:您将如何解决这个问题?
谢谢, 托斯滕
【问题讨论】:
一个月后知道你最终是如何解决的会很有趣:-) 我知道这是一个日志,但你是怎么解决的?我知道可以按照您发布的链接将 jwt 传递给后端,但是用户角色呢?我想从 SpringBoot 微服务中的 JWT 声明中获取它。 【参考方案1】:我能想到的唯一可能性是在后端服务的自定义标头中发送 JWT 令牌。
【讨论】:
这是最合适的方式,IMO也是。以上是关于使用 WSO2-AM 处理 JWT的主要内容,如果未能解决你的问题,请参考以下文章