Jakarta ee 将JWT承载传递给受保护的JAX-RS资源时,Payara Micro返回AuthenticationStatus.SEND_失败

Jakarta ee 将JWT承载传递给受保护的JAX-RS资源时,Payara Micro返回AuthenticationStatus.SEND_失败,jakarta-ee,jax-rs,jwt-auth,microprofile,payara-micro,Jakarta Ee,Jax Rs,Jwt Auth,Microprofile,Payara Micro,我对Java编程比较陌生,所以请耐心听我说。我正在开发一个部署在Payara Micro上的微服务。为了安全起见,我使用JWTs。因为Payara Micro是MicroProfile的一个实现,所以我试图利用MicroProfile JWT auth spec Payara Micro实现spec 1.1。根据规范,我用@LoginConfig注释JAX-RS配置类: @适用范围 @LoginConfigauthMethod=MP-JWT @声明{管理、标准、高级} @应用程序路径/* 公共类

我对Java编程比较陌生,所以请耐心听我说。我正在开发一个部署在Payara Micro上的微服务。为了安全起见,我使用JWTs。因为Payara Micro是MicroProfile的一个实现,所以我试图利用MicroProfile JWT auth spec Payara Micro实现spec 1.1。根据规范,我用@LoginConfig注释JAX-RS配置类:

@适用范围 @LoginConfigauthMethod=MP-JWT @声明{管理、标准、高级} @应用程序路径/* 公共类IdentityService扩展应用程序{} Payara Micro实现了一个过滤器,该过滤器在JAX-RS资源上激活@RoleAllowed注释,这些资源通常是EJB专有的。我正在利用此注释,使用MP JWT auth规范中的JsonWebToken接口识别JWT的声明,以确定是否允许用户根据声明中的id发出GET请求以访问用户信息:

@允许角色{管理、标准、高级} @请求范围 @路径/用户 @ProducesMediaType.APPLICATION_JSON 公共类用户端点{ @注入 私有JsonWebToken jwtPrincipal; @注入 私有用户存储库userRepo; @路径/{id} @得到 公众反应get@PathParamid字符串id{ if!jwtPrincipal.getSubject.equalsIgnoreCaseid 返回Response.statusResponse.Status.probled.build; 用户; user=userRepo.getUUID.fromStringid; 返回Response.statusResponse.Status.OK.entityuser.build; } 此外,根据,我在META-INF/microprofile-config.properties文件中提供以下配置属性供Payara验证:

mp.jwt.verify.issuer = com.someDomain
mp.jwt.verify.publickey.location = jwtPublic.pem
应该注意的是,我是通过基于用户登录信息的separarate@PermitAll端点出售我自己的JWT。然而,这些似乎构造正确,因为它们可以很容易地进行调试,并且签名在的调试器中得到验证,但不提供验证密钥,因为问题已经足够长了:

ew0KICAidHlwIiA6ICJKV1QiLA0KICAiYWxnIiA6ICJSUzI1NiINCn0=.ew0KICAiaXNzIiA6ICJjb20uc29tZURvbWFpbiIsDQogICJzdWIiIDogIjA5M2EzYzRlLWRiZTItNGI2YS05NzU4LTI5YjM2NjU1MTljOSIsDQogICJleHAiIDogMTU2NTM1Mjc2OCwNCiAgImlhdCIgOiAxNTY1MzA5NTY4LA0KICAidXBuIiA6ICJzb21lRW1haWxAZW1haWwuY29tIiwNCiAgImp0aSIgOiAiYmU0OTNhMTgtOGZiOS00NmM3LTgwMmEtNDY1YjFhYmM2YmZlIiwNCiAgImdyb3VwcyIgOiBbICJzdGFuZGFyZCIgXSwNCiAgInByZWZlcnJlZF91c2VybmFtZSIgOiAiY2FtZXJvbjIiDQp9.F97KMZbkPNuMATlYm0pLKalvadf_aAoxgPiNR-V-Y8toeYNqAm-w1WwnttQCeBuWvXjvPCm70y-HDGGv2tB-KuzHFxKxreyDue11db1fQ6o7QtYWSYvu_1y8bhOnB-MUz3MWnhRSHj8GpCQkrYXNACW9VSv8poqgyhyctEhi98LHGCFLyg1JNrzZw2J7fCdOYeoVZlgo-I9F4XA7FIXSQxgUii1T5RcGkky3tBKVUZ8jIigW68LXtYlq12lfo3PDATxou7c5ybMijLYuwPi7A6rb5bvsqAdsO-mSP6M6t42mUYGJuJ9dx_GmhWOpYzfgFaynMHElpuV58q7pXP5_JRvMx37yHMuA0Z_dj9ruSBqqH-lN0gV3CDheuHICbxAwqFvCEgVG7ZC4S3JNkSTqofifw_iXfTJX-v8cfWI3kfH7PrZmSmrMApGQLt5bQw_HIcIWfbHuA9_r-YksdIzJRsW-2JpSEHxRPeGvq5BlXlMSWu4BoefGcTbj6OKj6Gz_Zb5O8l8mOxQAT3wElN3DRxj3M_jxRM6kg-C-DlEFAxFivNQGbpE4CSKnLaY8XnTeL3j3Pq7tnYm1kG4PWeHCppr9CKgITjfrzzY3UNQX56WwDuRFTfgmY2Tnji4xqmLxxVCGE8ahM8mnxouIiwlPjlixkRXJfkxYb8YaQSMjIGw=
但是,@RolesAllowed注释的行为似乎出乎意料。当我在将JWT承载令牌作为授权HTTP头传递时向端点发送curl时:

curl -i --header "Authorization: Bearer ew0KICAidHlwIiA6ICJKV1QiLA0KICAiYWxnIiA6ICJSUzI1NiINCn0=.ew0KICAiaXNzIiA6ICJjb20uc29tZURvbWFpbiIsDQogICJzdWIiIDogIjA5M2EzYzRlLWRiZTItNGI2YS05NzU4LTI5YjM2NjU1MTljOSIsDQogICJleHAiIDogMTU2NTM1Mjc2OCwNCiAgImlhdCIgOiAxNTY1MzA5NTY4LA0KICAidXBuIiA6ICJzb21lRW1haWxAZW1haWwuY29tIiwNCiAgImp0aSIgOiAiYmU0OTNhMTgtOGZiOS00NmM3LTgwMmEtNDY1YjFhYmM2YmZlIiwNCiAgImdyb3VwcyIgOiBbICJzdGFuZGFyZCIgXSwNCiAgInByZWZlcnJlZF91c2VybmFtZSIgOiAiY2FtZXJvbjIiDQp9.F97KMZbkPNuMATlYm0pLKalvadf_aAoxgPiNR-V-Y8toeYNqAm-w1WwnttQCeBuWvXjvPCm70y-HDGGv2tB-KuzHFxKxreyDue11db1fQ6o7QtYWSYvu_1y8bhOnB-MUz3MWnhRSHj8GpCQkrYXNACW9VSv8poqgyhyctEhi98LHGCFLyg1JNrzZw2J7fCdOYeoVZlgo-I9F4XA7FIXSQxgUii1T5RcGkky3tBKVUZ8jIigW68LXtYlq12lfo3PDATxou7c5ybMijLYuwPi7A6rb5bvsqAdsO-mSP6M6t42mUYGJuJ9dx_GmhWOpYzfgFaynMHElpuV58q7pXP5_JRvMx37yHMuA0Z_dj9ruSBqqH-lN0gV3CDheuHICbxAwqFvCEgVG7ZC4S3JNkSTqofifw_iXfTJX-v8cfWI3kfH7PrZmSmrMApGQLt5bQw_HIcIWfbHuA9_r-YksdIzJRsW-2JpSEHxRPeGvq5BlXlMSWu4BoefGcTbj6OKj6Gz_Zb5O8l8mOxQAT3wElN3DRxj3M_jxRM6kg-C-DlEFAxFivNQGbpE4CSKnLaY8XnTeL3j3Pq7tnYm1kG4PWeHCppr9CKgITjfrzzY3UNQX56WwDuRFTfgmY2Tnji4xqmLxxVCGE8ahM8mnxouIiwlPjlixkRXJfkxYb8YaQSMjIGw=" "localhost:8080/users/093a3c4e-dbe2-4b6a-9758-29b3665519c9"
我收到以下答复:

HTTP/1.1 401 Unauthorized
Server: Payara Micro #badassfish
WWW-Authenticate: Authentication resulted in SEND_FAILURE
在翻阅Payara的源代码后,我发现收到了这个响应

显然,当从SecurityContext接收到的主体为null,并且JAX-RS资源中存在@RoleAllowed注释时,就会发生这种情况。然后,容器提供的身份验证模块会被调用,在Payara的情况下,这是基本身份验证:。但是,我不明白在我指定@LoginConfigauthMethod=MP-JWT,我将提供一个JWT作为授权头。github上存在与此相关的问题,但我无法找到关于修复方法的最终答案


因此,我的问题是,我是否错误地解释了如何让Payara生成调用者的可注射JsonWebToken?我如何修复此发送失败响应?

对于可能面临此问题的任何人,在查看后,我意识到Payara不会扫描META-INF/Micropofile-config.properties文件来验证颁发者和公钥。虽然没有明确说明这一点,但您不能从此文件配置颁发者或公钥位置。若要配置接受的颁发者,必须将名为payara-mp-jwt.properties的文件放置在src/main/resources目录下,该文件的密钥为accepted.isser,预期值为,例如accepted.issor=someDomain.com。此外,若要配置公钥,必须将名为publicKey.pem的公钥放在同一目录中。Payara将仅扫描这些文件,而不会扫描META-INF/Micropofile.config以获取配置的公钥和接受的颁发者值:

公共签名JWTidentityStore{ config=ConfigProvider.getConfig; 可选属性=readVendorProperties; acceptedIssuer=ReadVendorySuerProperties .OrelGet->config.getOptionalValueISSUER,String.class .orelsetrow->new IllegalStateException未找到发行人; jwtTokenParser=新的JwtTokenParserreadEnabledNamespaceproperties,readCustomNamespaceproperties; } 私有可选ReadVendorProperty{ URL mpJwtResource=currentThread.getContextClassLoader.getResource/payara-mp-jwt.properties; Properties=null; 如果mpJwtResource!=null{ 试一试{ 属性=新属性; properties.loadmpJwtResource.openStream; }捕捉异常{ 抛出新的IllegalStateException无法从资源文件e加载供应商属性; } } 返回可选的.ofNullableproperties; } 包括这些将导致JsonWebToken被合并 正确注射。我不知道为什么Payara的文档在没有扫描的情况下还要包括其他文件配置选项