使用 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的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JWT 处理更改的权限

使用 React 处理 JWT 身份验证

JWT在PHP使用及问题处理

JWT 使用数据库处理过期

如何正确处理 JWT 刷新?

使用 JWT 处理 401(未授权)angularjs 身份验证