Quarkus 同时使用 Authorization 和 Cookie 进行 jwt 授权

Quarkus use both Authorization and Cookie for jwt authorization

我想编写一个允许两种 RESTful 形式的数据交互的应用程序;常规 REST CRUD 端点和 web-ui.

过去,我曾在 JS 中实现 UI 的大部分功能,这将调用常规的 REST 端点。这工作正常,但对于这个应用程序,我想使用 Qute 来执行生成页面内容的大部分基本功能。但是,为了正确管理端点并确保正确的 RBAC 控制,我需要通过 cookie 访问 jwt,而不是正常的 headers。这似乎是可能的,但不是与我的其他端点同时以 header 形式需要它。(来源:https://quarkus.io/guides/security-jwt#microprofile-jwt-configuration

这里最好的做法是什么?我是否应该将这两个应用程序完全分开,并在 Javascript 中完成所有操作?

关于我如何在代码中使用 jwt 作为参考:(来自 UI qute 生成的示例,但我以相同的方式将 JWT 用于 CRUD 端点)

@Traced
@Slf4j
@Path("/")
@Tags({@Tag(name = "UI")})
@RequestScoped
@Produces(MediaType.TEXT_HTML)
public class Index extends UiProvider {

    @Inject
    Template index;

    @Inject
    JsonWebToken jwt;

    @Inject
    UserService userService;

    @GET
    @PermitAll
    @Produces(MediaType.TEXT_PLAIN)
    public TemplateInstance index(
            @Context SecurityContext securityContext
    ) {
        logRequestContext(jwt, securityContext);

        return index.data("hasToken", hasJwt(jwt));
    }

相关扩展:

    implementation 'io.quarkus:quarkus-resteasy-jackson'
    implementation 'io.quarkus:quarkus-resteasy'
    implementation 'io.quarkus:quarkus-smallrye-jwt'
    implementation 'io.quarkus:quarkus-smallrye-jwt-build'
    implementation 'io.quarkus:quarkus-qute'
    implementation 'io.quarkus:quarkus-resteasy-qute'

尝试配置(使用 yaml 扩展),导致所有其余交互的 jwt 处理异常:

mp:
  jwt:
    token:
      header: Cookie
      cookie: jwt

smallrye:
  jwt:
    always-check-authorization: true

Caused by: org.jose4j.jwt.consumer.InvalidJwtException: JWT processing failed. Additional details: [[17] Unable to process JOSE object (cause: org.jose4j.lang.JoseException: Invalid JOSE Compact Serialization. Expecting either 3 or 5 parts for JWS or JWE respectively but was 23.): function(n){var%20r%2Ce%2Ci%2Ct=this[0]%3Breturn%20arguments.length?(i=m(n)%2Cthis.each(function(e){var%20t%3B1===this.nodeType&&(null==(t=i?n.call(this%2Ce%2CS(this).val()):n)?t=%22%22:%22number%22==typeof%20t?t+=%22%22:Array.isArray(t)&&(t=S.map(t%2Cfunction(e){return%20null==e?%22%22:e+%22%22}))%2C(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&%22set%22in%20r&&void%200!==r.set(this%2Ct%2C%22value%22)||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&%22get%22in%20r&&void%200!==(e=r.get(t%2C%22value%22))?e:%22string%22==typeof(e=t.value)?e.replace(yt%2C%22%22):null==e?%22%22:e:void%200}] 应该注意的是,JWT 在常规 header 中对我来说工作正常,并且在没有设置 cookie 或 header 时发生此错误。

我正在使用最新的 Quarkus 2.4。1.Final

更新:我尝试只切换到“Cookie”方法以仅使用生成的令牌测试 ui 端,并发现它似乎已损坏...代码无法正确解析来自 cookie 的令牌。现在,我将继续进行完整的 JS 实现,但仍然很想知道在某个时候这是否可行

重现:https://github.com/Epic-Breakfast-Productions/OpenQuarterMaster/tree/main/software/open-qm-base-station and uncomment the lines at https://github.com/Epic-Breakfast-Productions/OpenQuarterMaster/blob/main/software/open-qm-base-station/src/main/resources/application.yaml#L70 您需要将库发布在 parent 目录中,以便 build,并且为了使用大多数 REST 端点,它需要一个 Mongodb 实例与之通信。

smallrye.jwt.always-check-authorization=true 将确保同时检查授权和 Cookie headers