首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在java spring中从identityServer4中提取jwk

在Java Spring中从IdentityServer4中提取JWK,可以通过以下步骤实现:

  1. 首先,确保你已经在Java Spring项目中添加了相关的依赖。可以使用Maven或Gradle来管理依赖关系。以下是一些常用的依赖项:
代码语言:txt
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-oauth2-jose</artifactId>
</dependency>
  1. 在Spring配置文件中,配置IdentityServer4的授权服务器信息。这包括授权服务器的URL、客户端ID、客户端密钥等。可以使用application.propertiesapplication.yml文件进行配置。
代码语言:txt
复制
spring:
  security:
    oauth2:
      client:
        provider:
          identityserver:
            issuer-uri: <IdentityServer4的URL>
        registration:
          identityserver:
            client-id: <客户端ID>
            client-secret: <客户端密钥>
  1. 创建一个JwkSetEndpointFilter类,用于从IdentityServer4的JWK Set端点获取JWK。
代码语言:txt
复制
import org.springframework.core.convert.converter.Converter;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.RequestEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.security.oauth2.core.OAuth2TokenValidator;
import org.springframework.security.oauth2.core.OAuth2TokenValidatorResult;
import org.springframework.security.oauth2.core.OAuth2TokenType;
import org.springframework.security.oauth2.jwt.Jwt;
import org.springframework.security.oauth2.jwt.JwtDecoder;
import org.springframework.security.oauth2.jwt.JwtDecoders;
import org.springframework.security.oauth2.jwt.JwtValidators;
import org.springframework.security.oauth2.jwt.NimbusJwtDecoder;
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter;
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
import org.springframework.security.oauth2.server.resource.web.BearerTokenResolver;
import org.springframework.security.web.authentication.AuthenticationConverter;
import org.springframework.security.web.authentication.AuthenticationFilter;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URI;
import java.util.Collections;
import java.util.List;
import java.util.Map;

public class JwkSetEndpointFilter extends OncePerRequestFilter {

    private static final String DEFAULT_JWK_SET_ENDPOINT = "/.well-known/jwks.json";
    private static final String DEFAULT_JWK_SET_URI = "/.well-known/openid-configuration";

    private final RestTemplate restTemplate;
    private final String jwkSetEndpoint;
    private final JwtDecoder jwtDecoder;

    public JwkSetEndpointFilter() {
        this.restTemplate = new RestTemplate();
        this.jwkSetEndpoint = DEFAULT_JWK_SET_ENDPOINT;
        this.jwtDecoder = createJwtDecoder(DEFAULT_JWK_SET_URI);
    }

    public JwkSetEndpointFilter(String jwkSetEndpoint, String jwkSetUri) {
        Assert.hasText(jwkSetEndpoint, "jwkSetEndpoint must not be empty");
        Assert.hasText(jwkSetUri, "jwkSetUri must not be empty");
        this.restTemplate = new RestTemplate();
        this.jwkSetEndpoint = jwkSetEndpoint;
        this.jwtDecoder = createJwtDecoder(jwkSetUri);
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        String requestUri = request.getRequestURI();
        if (requestUri.endsWith(jwkSetEndpoint)) {
            ResponseEntity<Map> responseEntity = restTemplate.exchange(RequestEntity.get(URI.create(jwkSetEndpoint)).build(), Map.class);
            Map<String, Object> jwkSet = responseEntity.getBody();
            response.setContentType(MediaType.APPLICATION_JSON_VALUE);
            response.getWriter().write(jwkSet.toString());
        } else {
            filterChain.doFilter(request, response);
        }
    }

    private JwtDecoder createJwtDecoder(String jwkSetUri) {
        ResponseEntity<Map> responseEntity = restTemplate.exchange(RequestEntity.get(URI.create(jwkSetUri)).build(), Map.class);
        Map<String, Object> jwkSetUriResponse = responseEntity.getBody();
        List<Map<String, Object>> keys = (List<Map<String, Object>>) jwkSetUriResponse.get("keys");
        NimbusJwtDecoder jwtDecoder = JwtDecoders.fromIssuerLocation(jwkSetUri);
        jwtDecoder.setJwtValidator(createJwtValidator(keys));
        return jwtDecoder;
    }

    private OAuth2TokenValidator<Jwt> createJwtValidator(List<Map<String, Object>> keys) {
        List<OAuth2TokenValidator<Jwt>> validators = Collections.singletonList(JwtValidators.createDefault());
        return new DelegatingOAuth2TokenValidator<>(validators);
    }
}
  1. 在Spring配置类中,将JwkSetEndpointFilter添加到过滤器链中。
代码语言:txt
复制
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SecurityConfig {

    @Bean
    public FilterRegistrationBean<JwkSetEndpointFilter> jwkSetEndpointFilter() {
        FilterRegistrationBean<JwkSetEndpointFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new JwkSetEndpointFilter());
        registrationBean.addUrlPatterns("/.well-known/jwks.json");
        return registrationBean;
    }
}
  1. 现在,你可以从IdentityServer4的JWK Set端点提取JWK了。在Java Spring中,你可以使用JwtDecoder来解码和验证JWT。以下是一个示例:
代码语言:txt
复制
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.oauth2.jwt.Jwt;
import org.springframework.security.oauth2.jwt.JwtDecoder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    private final JwtDecoder jwtDecoder;

    @Autowired
    public MyController(JwtDecoder jwtDecoder) {
        this.jwtDecoder = jwtDecoder;
    }

    @GetMapping("/decode")
    public Jwt decodeJwt(String token) {
        return jwtDecoder.decode(token);
    }
}

以上就是在Java Spring中从IdentityServer4中提取JWK的步骤。这样你就可以使用Java Spring来处理和验证来自IdentityServer4的JWT了。

请注意,以上示例仅供参考,具体实现可能会根据你的项目需求和IdentityServer4的配置而有所不同。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

IdentityServer4 手动验签及日志记录

IdentityServer4的基础知识和使用方式网上有很多特别优秀的文章,如果有对其不了解的推荐阅读一下下面的两篇文章 http://www.ruanyifeng.com/blog/2014/05/oauth...这篇文章主要介绍一下手动实现Api的token校验,及认证授权过程相关的日志记录 如果是在.net core的api,token校验的实现方式是相当简单的: services.AddAuthentication...但是如果不想要返回401呢,或者在是.net framework同样使用IdentityServer4,就需要我们手动实现token的校验 HttpHeader取出Token net FrameWork...kid和jwk的kid是否匹配 //调用接口获取jwk的相关信息,jwk包括公钥等用于验签token的信息 var jwk = await GetCacheJwkConfig...().ConfigureAwait(false); var defaultkey = jwk.keys.Where(t => t.kid == tokenModel.Header.kid).

91320

Elasticsearch的插件实现机制见:如何在Java实现一个插件化系统

ES 的 插件是什么?...虽然在Java中提供了System.loadLibrary函数,其也能通过JNI的方式封装Cdlopen, dlsym等函数支持在运行时访问动态库,但ES并没有选择这种方式。 4....然后通过对比插件和动态库,可以看出,动态库可以作为一些主流语言实现插件系统的底层库,而且Go语言甚至提供了基于动态库封装的官方插件库;而在Java,除了用JNI+动态库实现插件的方式外,还能通过ClassLoader...此外,笔者还对Java的流行插件框架PF4J进行的简单的了解,发现其实现方式和ES比较相似:都是由ClassLoader实现,感兴趣的读者可以自行了解。 6....调用第三方自定义的 .so库(包括JNI->JNI) Writing Your Own Ingest Processor for Elasticsearch Plugin Framework for Java

4.5K30

Java入门到放弃》框架入门篇:springIOC的注入姿势

解释完毕,接下来介绍spring的IOC,其注入方式有以下三种: 属性注入(set注入) 构造器注入(构造方法注入) 工厂注入(很少使用,你如果非要用····,那就自己搞定吧,哈哈) 接下来,有请代码君上场...(的写代码前记得导入spring相关Jar包) 一、属性注入     属性注入有两种情况,一种是Java基本数据类型,一种是自定义类型,具体代码请往下看:     1.1) 编写Song实体类     ...二、构造器注入 前面我们已经在Song类编写了构造方法Song(int songID, String songName, String songType),接下来,我们直接在spring配置文件通过构造器方式来注入看看效果...2.1) 在spring配置文件中注入bean对象     <constructor-arg index="0"...今天的内容就到这儿,感谢各位看官百闲无聊逛到这儿并且还看完了!!! 最后,请各位看官离开前点个赞,如果实在没别的事做,顺便评论两句...

454100

简单介绍一下Spring javaSpring框架7大核心模块的作用,如何在面试侃侃而谈? Spring体系常用项目一览

Spring Spring 概述 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的(替代更加重量级的企业级Java技术, 尤其是EJB),它完成了大量开发的通用步骤,留给开发者的仅仅是与特定应用相关的部分...另外Spring容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量——相当于为调用者注入它依赖的实例,因此Martine Fowler称之为依赖注入。...AOP专门用于处理系统中分布于各个模块(不同方法)的交叉关注点的问题,在JavaEE应用,常常通过AOP来处理一些具有横切性质的系统级服务,日志、事务管理、安全检查、缓存、对象池管理等,AOP已经成为一种非常常用的解决方案...在典型的面向对象开发方式,可能要将日志记录语句放在所有方法和 Java才能实现日志功能。...Spring Boot Spring诞生时是Java企业版(Java Enterprise Edition, JEE,也称J2EE)的轻量级代替品。

82820

Java入门到放弃》框架入门篇:springAOP的配置方式

从一个新人的角度可以这样来理解:一般软件的功能,我们可以分为两大类,一类是业务功能,一类是系统功能。 业务功能是指这个软件必须要用到的,没有的话客户就不给钱的。...IntroductionInterceptor:引介增强,表示在目标类添加一些新的方法和属性。 感觉解释这些概念真是费脑细胞 - -,还是直接来看代码吧。...; }     } } 1.6)修改spring配置文件,注入华为摄像头对象,并修改代理,加入后置增强 <!...可以发现,后置增强因为使用了正则来匹配Employee的所有以play开头的方法,所以只对play开头的方法进行增强。...好了,spring的AOP入门就介绍到这儿,各位小伙伴再自己试试吧···

689110

面试官甄别项目经验的角度,说说如何在简历写项目经验(java后端方向)

在本文里,不讨论这种门槛是否合理,而会以Java相关经验为例,说说面试官甄别真实商业项目的方式,并以此为基础讲述在简历描述项目的要点,并进一步给出在面试中介绍项目的相关技巧。...如果直接在简历当商业项目写,甚至还会起到反作用。而不少培训班所谓的就业培训老师,让他们自己去面试java之类的开发岗,还未必能成,可想而知他们煞有介事的“包装简历”和“模拟面试”的效果了。...比如项目名是xx金融管理系统,xx财务系统,xx学籍管理系统等,时间不会超过半年,技术方面就很敷衍地写一些常规技术,比如spring mvc,redis,jdbc等。...1 这时候没办法了,得加班加点,用最多一个月的时间,运行通一个全栈的项目,比如vuejs+Spring Boot+mybatis,这个过程中有问题,赶紧通过看视频看资料等各种手段弥补,项目未必要大而全,...3 异常处理、数据库批处理优化、数据库索引、设计模式甚至虚拟机调优角度,写下项目的实现细节,这块属于基本的jdk和数据库知识点,也应该不难实现。

2.3K20

1. 基于OIDC(OpenID Connect)的SSO

OIDC协议本身有很多的开源实现,这里选取的是基于.Net的开源实现基于IdentityServer4。...客户端验证id_token的有效性,其中验证所需的公钥来自OIDC的发现服务jwk_uri,这个验证是必须的,目的时为了保证客户端得到的id_token是oidc-sercer.dev颁发的,并且没有被篡改过...在验证完成后,客户端就可以取出来其中包含的用户信息来构建自身的登录状态,比如上Set-Cookie=lnh.oidc这个cookie。然后清除第1步设置的名为nonce的cookie。...OIDC是一个协议族,这些具体每一步怎么做都是有标准的规范的,所以侧重在了用HTTP来描述这个过程,这样这个流程也就可以用在java,php,nodejs等等开发平台上。...:https://github.com/IdentityServer/IdentityServer4

3.1K100

Identity Service - 解析微软微服务架构eShopOnContainers(二)

.Net Core开始,我们看代码的顺序Web.config转到了Program.cs,我们来看下IdentityService的Program: public class Program {...Startup的Configure没什么特别的。 简单的看了下Identity项目,好像就是教你怎么使用IdentityServer4,So,你可以在博客园中找到好多相关资料,这里就不重复介绍了。...当你能在浏览器看到这个页面的时候,说明程序运行正常,配置也正确,接下来看下如何在docker运行。 1、右键项目-发布,把项目编译发布到某个文件夹。...代替driver:,例如,我的项目发布在D:\Projects\publish cd /d/projects/publish 在你的终端看到输入处上一行有这个目录的,说明你已经进入到这个目录了,:...写在最后 在Identity Service,我们看到了一些新的东西,比如secret manager tool,healthcheck等,虽说它是基于identityServer4搭建的,但至少它教会了我们如何使用

1.2K50

Web Crypto API简介

但是由于接口和nodejs的crypto不同,Web Crypto API统一采用的Promise来处理异步逻辑,而不是nodejs的回调。这样可以很方便的使用await/async简化代码。...SHA-1这里也很特殊标准之前是规定支持这个算法,但是由于SHA-1本身存在缺陷,已经建议不使用,浏览器来看就是移除SHA-1的支持。...而上述例子jwk指的是JSON Web Key。具体可以参见rfc7517。 对于常见的PEM格式我们需要使用其中有效内容部分。...即BEGIN/END之间的部分所以我们可以将其中内容提取出来之后base64解码。...导入密钥的格式有raw,spki,pkcs8,jwk。raw用于对称密钥直接导入的情况,spki则是DER格式的公钥,pkcs8时DER格式的pkcs8私钥,jwk则支持所有的场景,但是需要转换。

5.8K01

SpringCloud-基于Oauth2的SSO单点登录原理解析与实现

本文将深入解析单点登录的原理,并详细介绍如何在Spring Cloud环境实现单点登录。通过具体的架构图和代码示例,我们将展示SSO的工作机制和优势,帮助开发者更好地理解和应用这一技术。...-client② 增加Gateway配置在application.yml添加Gateway配置:spring: cloud: gateway...http://localhost:8080/oauth/token user-info-uri: http://localhost:8080/userinfo jwk-set-uri...-resource-server② 给每个服务添加配置在application.yml添加OAuth2资源服务器配置:spring: security...在实际应用,开发者应根据具体需求和系统架构选择合适的实现方案,并不断优化以提高系统性能和安全性。以下是一些关键点:技术选型:选择适合业务需求的SSO实现方式,基于OAuth2、JWT或CAS等。

87524

微服务权限

auth 1、首先来搭建认证服务,它将作为Oauth2的认证服务使用,并且网关服务的鉴权功能也需要依赖它,在pom.xml添加相关依赖,主要是Spring Security、Oauth2、JWT、Redis...; import com.nimbusds.jose.jwk.RSAKey; import org.springframework.web.bind.annotation.GetMapping; import...,主要是路由规则的配置、Oauth2RSA公钥的配置及路由白名单的配置 server: port: 9201 spring: profiles: active: dev application...,然后存入请求的Header,这样后续服务就不需要解析JWT令牌了,可以直接请求的Header获取到用户信息 package cn.gathub.gateway.filter; import com.nimbusds.jose.JWSObject...; } } 4、创建一个获取登录的用户信息的接口,用于请求的Header中直接获取登录用户信息 package cn.gathub.resource.controller; import org.springframework.web.bind.annotation.GetMapping

59900

【One by One系列】IdentityServer4(二)使用Client Credentials保护API资源

IdentityServer4是实现了OAuth2.0+OpenId Connect两种协议的优秀第三方库,属于.net生态的优秀成员。可以很容易集成至ASP.NET Core,颁发token。...协议描述的端点(/connect/token)请求提供服务。...在IdentityServer4,增加了Scope参数,表明了客户端的访问权限 1.安装Id4模板 dotnet new -i IdentityServer4.Templates AdminUI:...UseAuthentication:添加认证中间件,以便对host的每次调用自动执行身份认证,此中间件准备就绪后,会自动授权标头中提取 JWT 令牌。...dotnet add package IdentityModel 4.3 编码-请求Idisconvery endpoint 只需要知道IdentityServer的基础地址,实际的各类端点地址就可以元数据读取

2.2K30
领券