【Spring Authorization Server 系列】(一)入门篇,快速搭建一个授权服务器

这篇具有很好参考价值的文章主要介绍了【Spring Authorization Server 系列】(一)入门篇,快速搭建一个授权服务器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Spring Authorization Server

简介

官方主页:https://spring.io/projects/spring-authorization-server

Spring Authorization Server 是一个框架,提供了 OAuth 2.1 和 OpenID Connect 1.0 规范以及其他相关规范的实现。 它建立在 Spring Security 之上,为构建 OpenID Connect 1.0 Identity Providers 和 OAuth2 Authorization Server 产品提供安全、轻量级和可定制的基础。

Spring实现OAuth2的旧版的框架是 Spring Security OAuth2,该框架已停止维护。Spring Security OAuth2认证/授权服务器的前世今生

功能列表

https://docs.spring.io/spring-authorization-server/docs/0.3.1/reference/html/overview.html

  • 授权方式支持授权码(Authorization Code)、客户凭证(Client Credentials)
  • 令牌支持刷新(Refresh Token)
  • 令牌格式支持自包含(JWT)和引用(Opaque)

入门案例

官方案例:https://docs.spring.io/spring-authorization-server/docs/0.3.1/reference/html/getting-started.html

本案例基于官方案例,做了一丝丝改动,便于调试。

1. 创建 SpringBoot 项目

一个 pom,一个 Application 启动类,相信难不倒你,跳过。

2. 引入依赖

本案例使用 0.3.1 版本

    <properties>
        <spring-authorization-server.version>0.3.1</spring-authorization-server.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-oauth2-authorization-server</artifactId>
            <version>${spring-authorization-server.version}</version>
        </dependency>
    </dependencies>

3. 编写配置

  • 配置类
    为了便于调试授权码流程,给客户端多加了个重定向地址 .redirectUri("https://cn.bing.com")
@Configuration
public class SecurityConfiguration {

    @Bean
    @Order(1)
    public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http)
            throws Exception {
        OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);
        http
                // Redirect to the login page when not authenticated from the
                // authorization endpoint
                .exceptionHandling((exceptions) -> exceptions
                        .authenticationEntryPoint(
                                new LoginUrlAuthenticationEntryPoint("/login"))
                );

        return http.build();
    }

    @Bean
    @Order(2)
    public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http)
            throws Exception {
        http
                .authorizeHttpRequests((authorize) -> authorize
                        .anyRequest().authenticated()
                )
                // Form login handles the redirect to the login page from the
                // authorization server filter chain
                .formLogin(Customizer.withDefaults());

        return http.build();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails userDetails = User.withDefaultPasswordEncoder()
                .username("user")
                .password("password")
                .roles("USER")
                .build();

        return new InMemoryUserDetailsManager(userDetails);
    }

    @Bean
    public RegisteredClientRepository registeredClientRepository() {
        RegisteredClient registeredClient = RegisteredClient.withId(UUID.randomUUID().toString())
                .clientId("messaging-client")
                .clientSecret("{noop}secret")
                .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC)
                .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
                .authorizationGrantType(AuthorizationGrantType.REFRESH_TOKEN)
                .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS)
                .redirectUri("http://127.0.0.1:8080/login/oauth2/code/messaging-client-oidc")
                .redirectUri("http://127.0.0.1:8080/authorized")
                .redirectUri("https://cn.bing.com") // 便于调试授权码流程
                .scope(OidcScopes.OPENID)
                .scope("message.read")
                .scope("message.write")
                .clientSettings(ClientSettings.builder().requireAuthorizationConsent(true).build())
                .build();

        return new InMemoryRegisteredClientRepository(registeredClient);
    }

    @Bean
    public JWKSource<SecurityContext> jwkSource() {
        KeyPair keyPair = generateRsaKey();
        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
        RSAKey rsaKey = new RSAKey.Builder(publicKey)
                .privateKey(privateKey)
                .keyID(UUID.randomUUID().toString())
                .build();
        JWKSet jwkSet = new JWKSet(rsaKey);
        return new ImmutableJWKSet<>(jwkSet);
    }

    private static KeyPair generateRsaKey() {
        KeyPair keyPair;
        try {
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
            keyPairGenerator.initialize(2048);
            keyPair = keyPairGenerator.generateKeyPair();
        }
        catch (Exception ex) {
            throw new IllegalStateException(ex);
        }
        return keyPair;
    }

    @Bean
    public ProviderSettings providerSettings() {
        return ProviderSettings.builder().build();
    }

}
  • application.yml
    服务端口为 9000
    框架的异常信息不是很友好,此处增加了两个类的 trace 日志,便于定位问题。
server:
  port: 9000

logging:
  level:
    root: info
#    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: trace
#    org.springframework.security: debug
    org.springframework.security.web.FilterChainProxy: trace # 过滤器执行顺序
    org.springframework.security.web.access.ExceptionTranslationFilter: trace #异常处理

4. 启动

运行 启动类

5. 测试

授权码 获取令牌

1. 三方应用访问授权页
http://localhost:9000/oauth2/authorize?response_type=code&client_id=messaging-client&scope=message.read&redirect_uri=https://cn.bing.com
1.1 若用户未登录,则会重定向登录页
输入配置类中的指定的用户信息 user、password,登录,登录成功后会重定向到授权页
spring authorization server,Spring Authorization Server,Spring Security,spring security,oidc,oauth2

1.2. 授权页
spring authorization server,Spring Authorization Server,Spring Security,spring security,oidc,oauth2
2. 用户授权
勾选授权作用域scope(即message.read),点击 Submit Consent 允许授权
3. 获取code
spring authorization server,Spring Authorization Server,Spring Security,spring security,oidc,oauth2
授权成功后,会重定向到上述地址并携带 code
4. 通过 code 获取令牌
使用postman发送请求 POST /oauth2/token,需要注意的是客户端的信息以 Basic 方式认证
spring authorization server,Spring Authorization Server,Spring Security,spring security,oidc,oauth2
填入上步骤获取的 code
spring authorization server,Spring Authorization Server,Spring Security,spring security,oidc,oauth2
发送请求,得到响应,access_token 即为令牌。
spring authorization server,Spring Authorization Server,Spring Security,spring security,oidc,oauth2

刷新令牌

同样是 POST /oauth2/token 接口,仅参数不同,客户端的信息同样以 Basic 方式认证
使用上步骤获取的 refresh_token 测试。
spring authorization server,Spring Authorization Server,Spring Security,spring security,oidc,oauth2

客户端凭证 获取令牌

同样是 POST /oauth2/token 接口,仅参数不同,客户端的信息同样以 Basic 方式认证
spring authorization server,Spring Authorization Server,Spring Security,spring security,oidc,oauth2


end

后续会继续深挖框架的各种配置和功能,有兴趣可以订阅一下,会持续更新文章来源地址https://www.toymoban.com/news/detail-569811.html

到了这里,关于【Spring Authorization Server 系列】(一)入门篇,快速搭建一个授权服务器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Authorization Server入门 (十六) Spring Cloud Gateway对接认证服务

            之前虽然单独讲过Security Client和Resource Server的对接,但是都是基于Spring webmvc的,Gateway这种非阻塞式的网关是基于webflux的,对于集成Security相关内容略有不同,且涉及到代理其它微服务,所以会稍微比较麻烦些,今天就带大家来实现Gateway网关对接OAuth2认证服务。

    2024年02月10日
    浏览(45)
  • Spring Authorization Server入门 (二十) 实现二维码扫码登录

    打开网页,发起授权申请/未登录被重定向到登录页面 选择二维码登录,页面从后端请求二维码 页面渲染二维码图片,并轮询请求,获取二维码的状态 事先登录过APP的手机扫描二维码,然后APP请求服务器端的API接口,把用户认证信息传递到服务器中 后端收到APP的请求后更改

    2024年02月21日
    浏览(27)
  • Spring Authorization Server入门 (十五) 分离授权确认与设备码校验页面

    2023-12-01修改:在session-data-redis(Github)分支中添加了基于 spring-session-data-redis 的实现,无需借助 nonceId 来保持认证状态,该分支已去除所有 nonceId 相关内容,需要注意的是 axios 在初始化时需要添加配置 withCredentials: true ,让请求携带cookie。当然一些响应json的处理还是使用下方的

    2024年02月14日
    浏览(26)
  • Spring Authorization Server入门 (一) 初识SpringAuthorizationServer和OAuth2.1协议

    经过近些年网络和设备的不断发展,之前的oauth2.0发布的授权协议标准已经远远不能满足现在的场景和需求,根据其安全最佳实践,在oauth2.0的基础上移除了一些不安全的授权方式,并且对扩展协议进行整合。该协议定义了一系列关于授权的开放网络标准,允许用户授权第三方

    2024年02月11日
    浏览(23)
  • Spring Authorization Server入门 (十二) 实现授权码模式使用前后端分离的登录页面

    2023-12-01修改:在session-data-redis(Github)分支中添加了基于 spring-session-data-redis 的实现,无需借助 nonceId 来保持认证状态,该分支已去除所有 nonceId 相关内容,需要注意的是 axios 在初始化时需要添加配置 withCredentials: true ,让请求携带cookie。当然一些响应json的处理还是使用下方的

    2024年02月13日
    浏览(29)
  • OAuth2.0 实践 Spring Authorization Server 搭建授权服务器 + Resource + Client

    title: OAuth2.0 实践 Spring Authorization Server 搭建授权服务器 + Resource + Client date: 2023-03-27 01:41:26 tags: OAuth2.0 Spring Authorization Server categories: 开发实践 cover: https://cover.png feature: false 目前 Spring 生态中的 OAuth2 授权服务器是 Spring Authorization Server ,原先的 Spring Security OAuth 已经停止更新

    2024年02月08日
    浏览(41)
  • Spring Authorization Server入门 (三) 集成流程说明、细节补充和各种方式获取token测试

    在上一篇文章中的AuthorizationConfig.java配置类中,类上有三个注解,分别是@Configuration、@EnableWebSecurity和@EnableMethodSecurity注解,虽然在类中有注释,但是这里在细讲一下,同时放一下官网的说明 @EnableWebSecurity 加载了WebSecurityConfiguration配置类, 配置安全认证策略。 加载了Authenti

    2024年02月11日
    浏览(30)
  • Spring Authorization Server入门 (八) Spring Boot引入Security OAuth2 Client对接认证服务

    在之前的文章中实现了一个认证服务,并且添加了一些自定义的内容,现在暂时没想到认证服务的新内容,本篇文章就先写一下客户端对接的吧,水一篇。 当用户通过客户端去访问一个受限的资源时,客户端会检测是否有登录信息,没有登录信息会重定向至认证服务器去请求

    2024年02月21日
    浏览(37)
  • Spring Authorization Server入门 (十三) 实现联合身份认证,集成Github与Gitee的OAuth登录

    什么是联合身份认证?       通过Spring Security OAuth2 Client(Login)模块集成第三方登录至自己的认证服务中,使用联合身份认证只需要请求认证服务,不通过前端来跳转三方的授权申请链接,而是统一通过认证服务来跳转,只需要维护Spring Authorization Server中身份认证提供商

    2024年02月05日
    浏览(33)
  • Spring Authorization Server 授权服务器

    Spring Authorization Server 遵循Oauth2.1和OpenID Connect 1.0,它建立在 Spring Security 之上。 要求JDK11以上 使用Idea创建一个Maven的Spring Boot(笔者使用的是 spring boot 2.7 )项目 pom需要引入 Authorization Server的配置 完整的pom.xml文件如下: 使用 @Bean 和 @Configuration 创建配置,这是官方推荐的最小配

    2024年02月16日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包