当前位置: 首页 > 知识库问答 >
问题:

在Spring Boot资源服务器中使用自定义JWT解码器

曾嘉祯
2023-03-14

我正在使用spring boot资源服务器。身份验证服务器发出JWT。这个JWT使用密钥重新编码(使用AES),在资源服务器中,我应该在将JWT发送到JwtAuthenticator之前对其进行解码(来自AES)<现在,我有一个安全配置。

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        JwtAuthenticationConverter jwtAuthenticationConverter = new JwtAuthenticationConverter();
        jwtAuthenticationConverter.setJwtGrantedAuthoritiesConverter(new KeycloakRoleConverter());

        http
                .authorizeRequests()
                .antMatchers(HttpMethod.GET, "/users/status/check")
                .hasRole("developer")
                .anyRequest().authenticated()
                .and()
                .oauth2ResourceServer()
                .jwt()
                .decoder(new JWTDecoder())
                .jwtAuthenticationConverter(jwtAuthenticationConverter);
    }

和JWT解码器

import com.nimbusds.jwt.JWT;
import com.nimbusds.jwt.JWTParser;
import org.springframework.security.oauth2.jwt.Jwt;
import org.springframework.security.oauth2.jwt.JwtDecoder;
import org.springframework.security.oauth2.jwt.JwtException;

import java.text.ParseException;

public class JWTDecoder implements JwtDecoder {
    @Override
    public Jwt decode(String token) throws JwtException {


        //decrypt from AES here


        JWT jwt = null;
        try {
            jwt = JWTParser.parse(token);
        } catch (ParseException e) {
            e.printStackTrace();
        }


        return null;
    }
}

那我该怎么办?函数应该返回org。springframework。安全oauth2.jwt。Jwt。如何将字符串令牌转换为Jwt<我尝试了以下方法,但出现了一个问题。

    private Jwt createJwt(String token, JWT parsedJwt) {
        try {
            Map<String, Object> headers = new LinkedHashMap<>(parsedJwt.getHeader().toJSONObject());
            Map<String, Object> claims = parsedJwt.getJWTClaimsSet().getClaims();
            return Jwt.withTokenValue(token)
                    .headers(h -> h.putAll(headers))
                    .claims(c -> c.putAll(claims))
                    .build();
        } catch (Exception ex) {
            if (ex.getCause() instanceof ParseException) {
                throw new JwtException("There is a problem parsing the JWT.");
            } else {
                throw new JwtException("There is a problem decoding the JWT.");
            }
        }
    }

我收到的错误:

java.lang.IllegalArgumentException:时间戳的类型必须是Instant:java.lang.Long

共有1个答案

司空宣
2023-03-14

因为您的令牌的到期日期是一个时间戳,它应该是一个数字(长)。或者您正试图将时间戳解析为数字长度。

 类似资料:
  • Appium 的 iOS 版本的后端用的是Facebook's WebDriverAgent。该后端是基于苹果公司的 XCTest 框架,所以也有所有XCTest 框架已知的问题。其中有些问题我们正在设法解决,有一些在现阶段可能无法解决。本文中描述的方法已经能够使您完全掌握在设备上如何构建、管理和运行WDA。通过这种方式,您可以在CI环境中对您的自动化测试进行微调,并使其在长期运行的情况下更加稳定

  • 嗨,我正在尝试向当前默认规则添加额外的实体。它在stanfordNLP中的txt.file上工作,但是当我在python中使用stanfordNLPServer时,它不能覆盖默认规则。 我在Python中使用coreNLP的NLTK包装器,输入文本是DataFrame中的一列。默认规则运行良好,但无法添加自定义规则。 适用于StanfordCorenlp的Java命令: 我的猜测是,coreNLP

  • 在一个AnyLogic项目中,在“抓住”块中,我需要从资源集中自定义地选择资源。在“抢占”的属性选项卡中阻止字段“resource Sets”,选中值和标志“Customize resource Choice”。在“资源选择条件”代码部分,我需要做出如下选择: 我如何检查一个资源单元是否来自给定的资源池,然后根据资源的特性区分它们?谢谢你。最诚挚的问候。

  • 我正在通过数据库开发一组rest资源,并使用Spring Data Rest公开核心CRUD功能,以直接与存储库交互。 在我的简化示例中,我有以下用户: 和用户自己的项目: 直接与存储库交互是可以的,所以对于创建用户(其他简单实体),问题来自于创建项目。项目有大量基于用户表单输入的服务器派生字段,所以我编写了一个自定义控制器来生成它们并保存结果。为了持久化结果,我需要将项目与其拥有的用户相关联。我

  • 注意:TPR已经停止维护,kubernetes 1.7及以上版本请使用CRD。 自定义资源是对Kubernetes API的扩展,kubernetes中的每个资源都是一个API对象的集合,例如我们在YAML文件里定义的那些spec都是对kubernetes中的资源对象的定义,所有的自定义资源可以跟kubernetes中内建的资源一样使用kubectl操作。 自定义资源 Kubernetes1.6版

  • 我有一个配置为设置有关用户权限的其他信息的oAuth2 jwt令牌服务器。 我不知道如何配置我的资源服务器,以提取oauth2服务器设置的用户权限,并将该权限用于Spring Security framework中的@Secured annotated Controller。 我的Auth服务器配置如下: 我的资源服务器配置如下所示: 我的测试用例失败得很惨,它说: {“error”:“inval