Spring Oauth2-Authorization-Server JwtGenerator

Spring Oauth2-Authorization-Server JwtGenerator 使用

基于 spring-security-oauth2-authorization-server 0.2.3

JwtGenerator

顾名思义,使用 JwtEncoder 来生成 jwt 类型的 token

public final class JwtGenerator implements OAuth2TokenGenerator<Jwt> {
	private final JwtEncoder jwtEncoder;
	private OAuth2TokenCustomizer<JwtEncodingContext> jwtCustomizer;

	/**
	 * Constructs a {@code JwtGenerator} using the provided parameters.
	 *
	 * @param jwtEncoder the jwt encoder
	 */
	public JwtGenerator(JwtEncoder jwtEncoder) {
		Assert.notNull(jwtEncoder, "jwtEncoder cannot be null");
		this.jwtEncoder = jwtEncoder;
	}
}

JwtGenerator 是什么时候被创建的?

OAuth2ConfigurerUtils

static <B extends HttpSecurityBuilder<B>> OAuth2TokenGenerator<? extends OAuth2Token> getTokenGenerator(B builder) {
    OAuth2TokenGenerator<? extends OAuth2Token> tokenGenerator = builder.getSharedObject(OAuth2TokenGenerator.class);
    if (tokenGenerator == null) {
        tokenGenerator = getOptionalBean(builder, OAuth2TokenGenerator.class);
        if (tokenGenerator == null) {
            JwtGenerator jwtGenerator = getJwtGenerator(builder);
            OAuth2AccessTokenGenerator accessTokenGenerator = new OAuth2AccessTokenGenerator();
            OAuth2TokenCustomizer<OAuth2TokenClaimsContext> accessTokenCustomizer = getAccessTokenCustomizer(builder);
            if (accessTokenCustomizer != null) {
                accessTokenGenerator.setAccessTokenCustomizer(accessTokenCustomizer);
            }
            OAuth2RefreshTokenGenerator refreshTokenGenerator = new OAuth2RefreshTokenGenerator();
            if (jwtGenerator != null) {
                tokenGenerator = new DelegatingOAuth2TokenGenerator(
                    jwtGenerator, accessTokenGenerator, refreshTokenGenerator);
            } else {
                tokenGenerator = new DelegatingOAuth2TokenGenerator(
                    accessTokenGenerator, refreshTokenGenerator);
            }
        }
        builder.setSharedObject(OAuth2TokenGenerator.class, tokenGenerator);
    }
    return tokenGenerator;
}

private static <B extends HttpSecurityBuilder<B>> JwtGenerator getJwtGenerator(B builder) {
    JwtGenerator jwtGenerator = builder.getSharedObject(JwtGenerator.class);
    if (jwtGenerator == null) {
        JwtEncoder jwtEncoder = getJwtEncoder(builder);
        if (jwtEncoder != null) {
            jwtGenerator = new JwtGenerator(jwtEncoder);
            OAuth2TokenCustomizer<JwtEncodingContext> jwtCustomizer = getJwtCustomizer(builder);
            if (jwtCustomizer != null) {
                jwtGenerator.setJwtCustomizer(jwtCustomizer);
            }
            builder.setSharedObject(JwtGenerator.class, jwtGenerator);
        }
    }
    return jwtGenerator;
}

private static <B extends HttpSecurityBuilder<B>> JwtEncoder getJwtEncoder(B builder) {
    JwtEncoder jwtEncoder = builder.getSharedObject(JwtEncoder.class);
    if (jwtEncoder == null) {
        jwtEncoder = getOptionalBean(builder, JwtEncoder.class);
        if (jwtEncoder == null) {
            JWKSource<SecurityContext> jwkSource = getJwkSource(builder);
            if (jwkSource != null) {
                jwtEncoder = new NimbusJwsEncoder(jwkSource);
            }
        }
        if (jwtEncoder != null) {
            builder.setSharedObject(JwtEncoder.class, jwtEncoder);
        }
    }
    return jwtEncoder;
}

@SuppressWarnings("unchecked")
static <B extends HttpSecurityBuilder<B>> JWKSource<SecurityContext> getJwkSource(B builder) {
    JWKSource<SecurityContext> jwkSource = builder.getSharedObject(JWKSource.class);
    if (jwkSource == null) {
        ResolvableType type = ResolvableType.forClassWithGenerics(JWKSource.class, SecurityContext.class);
        jwkSource = getOptionalBean(builder, type);
        if (jwkSource != null) {
            builder.setSharedObject(JWKSource.class, jwkSource);
        }
    }
    return jwkSource;
}

在 getTokenGenerator 方法中:

  • getTokenGenerator
    • getJwtGenerator
      • getJwtEncoder
        • getJwkSource

由层级看出, 只要 IOC 容器 中有 JWKSource Bean, 那么就会自动装配 JwtGenerator

而 在JwtClientAssertionDecoderFactory 中:

private static NimbusJwtDecoder buildDecoder(RegisteredClient registeredClient) {
    JwsAlgorithm jwsAlgorithm = registeredClient.getClientSettings().getTokenEndpointAuthenticationSigningAlgorithm();
    if (jwsAlgorithm instanceof SignatureAlgorithm) {
        String jwkSetUrl = registeredClient.getClientSettings().getJwkSetUrl();
        return NimbusJwtDecoder.withJwkSetUri(jwkSetUrl).jwsAlgorithm((SignatureAlgorithm) jwsAlgorithm).build();
    }
    if (jwsAlgorithm instanceof MacAlgorithm) {
        String clientSecret = registeredClient.getClientSecret();
      
        SecretKeySpec secretKeySpec = new SecretKeySpec(clientSecret.getBytes(StandardCharsets.UTF_8),
                                                        JCA_ALGORITHM_MAPPINGS.get(jwsAlgorithm));
        return NimbusJwtDecoder.withSecretKey(secretKeySpec).macAlgorithm((MacAlgorithm) jwsAlgorithm).build();
    }
    throw new OAuth2AuthenticationException(oauth2Error);
}

对于 Jwt 加密算法中, 只有 SignatureAlgorithm 算法才会要求配置 jwkSetUrl,即

  • SignatureAlgorithm 会自动装配 JwtGenerator, 就会生成 JWT 类型的 token
  • MacAlgorithm 摘要算法则不会,自然生成的 token 也不会是 Jwt
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: spring-security-oauth2-authorization-server是一个基于Spring Security的OAuth2授权服务器,用于管理和授权访问受保护的资源。它提供了一组API和工具,使得开发人员可以轻松地实现OAuth2授权服务器,并支持多种授权方式和流程。该授权服务器可以与其他Spring框架集成,例如Spring Boot和Spring Cloud,以便更好地管理和保护应用程序的资源。 ### 回答2: Spring Security OAuth2 Authorization Server是一个强大的用户授权服务,它可以让用户安全地授权他们的敏感信息,以便客户端应用程序可以访问他们的资源。 它基于Spring的安全框架构建,与OAuth2协议规范兼容。OAuth2是一个授权协议,它允许用户授权客户端应用程序在用户的名义上访问他们的资源。Spring Security OAuth2 Authorization Server提供了多种授权模式,包括基于密码授权、刷新令牌和授权码授权等。 该服务还提供了一组API组件,使开发人员可以轻松地创建客户端应用程序并管理授权和令牌。通过使用Spring Security OAuth2 Authorization Server,开发人员可以保持持久的跨应用程序用户会话状态,并方便地跟踪和管理资源的访问。 Spring Security OAuth2 Authorization Server提供了一个安全的授权层,可以使用Token转义解决跨域请求的问题,支持多个授权模式,并支持动态客户端注册。此外,该服务还提供了一个管理界面,可用于管理授权信息、令牌和客户端应用程序的访问权限等。 最后,Spring Security OAuth2 Authorization Server还提供了一组可扩展的插件,可以通过它们扩展和定制授权流程和授权服务。这些插件可以轻松地扩展并与其他技术进行集成。 ### 回答3: Spring Security OAuth2 Authorization ServerSpring Security生态系统中的一个组件,是一种用于构建并管理OAuth2授权服务的框架。OAuth2是一种用于保护API、防止破坏攻击的开放标准,它提供了一种用于分离用户、应用程序和资源服务器之间的身份验证和授权的机制。它允许用户授权第三方应用程序访问他们在其他应用程序和服务上存储的服务。OAuth2授权服务是一个负责认证用户信息并授权访问令牌的服务器。 Spring Security OAuth2 Authorization Server提供一个开箱即用的OAuth2认证服务器,它提供了一些默认的配置和管理OAuth2令牌的选项。它还提供了一些简单和可扩展的API以支持OAuth2流程的不同阶段,从而帮助开发人员方便地创建和配置基于OAuth2的应用程序。 Spring Security OAuth2 Authorization Server的主要功能包括: 1. 提供一个可扩展的API,以便在不同的OAuth2流程阶段进行修改。 2. 附带默认的令牌存储实现。 3. 允许自定义授权和令牌端点。 4. 提供了可插拔的身份验证和授权机制,开发人员可以方便地配置和管理。 5. 允许开发人员创建和使用自定义的令牌存储实现。 6. 允许开发人员基于OAuth2协议为应用程序提供安全性。 总之,Spring Security OAuth2 Authorization Server为开发人员提供了一个可扩展的和可定制的OAuth2认证服务器,使得开发人员可以方便地构建基于OAuth2的应用程序。它简化了OAuth2认证的过程,帮助开发人员快速构建和部署安全且可靠的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值