{"id":2535,"date":"2021-08-03T20:48:05","date_gmt":"2021-08-03T11:48:05","guid":{"rendered":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=2535"},"modified":"2021-11-08T16:56:43","modified_gmt":"2021-11-08T07:56:43","slug":"experimental-oauth2-authorization-server-0-1-1","status":"publish","type":"post","link":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=2535","title":{"rendered":"[Deprecated] Experimental Oauth2 Authorization Server 0.1.1"},"content":{"rendered":"<h1>Experimental Oauth2 Authorization Server 0.1.1<\/h1>\n<p><strong>\uc791\ub3d9 \uc548\ud55c\ub2e4.<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/spring-projects-experimental\/spring-authorization-server\/tree\/main\/samples\/boot\/oauth2-integration\">\ucc38\uace0<\/a><\/p>\n<p><a href=\"https:\/\/tomcat.apache.org\/download-native.cgi\">https:\/\/tomcat.apache.org\/download-native.cgi<\/a><\/p>\n<h2>\ud504\ub85c\uc81d\ud2b8 \uc0dd\uc131<\/h2>\n<p>build.gradle<\/p>\n<pre><code class=\"language-gradle\">dependencies {\n    implementation &#039;org.springframework.boot:spring-boot-starter-web:2.5.3&#039;\n    implementation &#039;org.springframework.boot:spring-boot-starter-security:2.5.3&#039;\n    implementation &#039;org.springframework.boot:spring-boot-starter-jdbc:2.5.3&#039;\n    implementation &#039;org.springframework.security.experimental:spring-security-oauth2-authorization-server:0.1.2&#039;\n    implementation &#039;org.springframework.security:spring-security-oauth2-core:5.5.1&#039;\n    implementation &#039;org.springframework.security.oauth:spring-security-oauth2:2.5.1.RELEASE&#039;\n    implementation &#039;org.springframework.security:spring-security-cas:5.5.1&#039;\n    runtimeOnly &#039;com.h2database:h2:1.4.200&#039;\n\n    compileOnly &#039;org.projectlombok:lombok:1.18.20&#039;\n\n    developmentOnly &#039;org.springframework.boot:spring-boot-devtools:2.5.3&#039;\n\n    annotationProcessor &#039;org.projectlombok:lombok:1.18.20&#039;\n\n    testImplementation &#039;org.springframework.boot:spring-boot-starter-test:2.5.3&#039;\n    testImplementation &#039;net.sourceforge.htmlunit:htmlunit:2.52.0&#039;\n}<\/code><\/pre>\n<p>application.yml<\/p>\n<pre><code class=\"language-yaml\">server:\n  port: 9000\n\nlogging:\n  level:\n    # root: DEBUG\n    org.springframework.web: DEBUG\n    org.springframework.security: DEBUG\n    org.springframework.security.oauth2: DEBUG\n    # org.springframework.boot.autoconfigure: DEBUG<\/code><\/pre>\n<p>AuthorizationServerConfig.java<\/p>\n<pre><code class=\"language-java\">@Configuration(proxyBeanMethods = false)\npublic class AuthorizationServerConfig {\n\n    @Bean\n    @Order(Ordered.HIGHEST_PRECEDENCE)\n    public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {\n        OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);\n        return http.formLogin(Customizer.withDefaults()).build();\n    }\n\n    \/\/ @formatter:off\n    @Bean\n    public RegisteredClientRepository registeredClientRepository(JdbcTemplate jdbcTemplate) {\n\n        RegisteredClient registeredClient = RegisteredClient.withId(UUID.randomUUID().toString())\n                .clientId(&quot;foo&quot;)\n                .clientSecret(&quot;{noop}bar&quot;)\n                .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC)\n                .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)\n                .authorizationGrantType(AuthorizationGrantType.REFRESH_TOKEN)\n                .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS)\n                .redirectUri(&quot;http:\/\/127.0.0.1:8080\/login\/oauth2\/code\/messaging-client-oidc&quot;)\n                .redirectUri(&quot;http:\/\/127.0.0.1:8080\/authorized&quot;)\n                .scope(OidcScopes.OPENID)\n                .scope(&quot;message.read&quot;)\n                .scope(&quot;message.write&quot;)\n                \/\/ .clientSettings(clientSettingsConsumer)\n                .build();\n\n        \/\/ Save registered client in db as if in-memory\n        JdbcRegisteredClientRepository registeredClientRepository = new JdbcRegisteredClientRepository(jdbcTemplate);\n        registeredClientRepository.save(registeredClient);\n\n        return registeredClientRepository;\n    }\n    \/\/ @formatter:on\n\n    @Bean\n    public OAuth2AuthorizationService authorizationService(JdbcTemplate jdbcTemplate, RegisteredClientRepository registeredClientRepository) {\n        return new JdbcOAuth2AuthorizationService(jdbcTemplate, registeredClientRepository);\n    }\n\n    @Bean\n    public OAuth2AuthorizationConsentService authorizationConsentService(JdbcTemplate jdbcTemplate, RegisteredClientRepository registeredClientRepository) {\n        return new JdbcOAuth2AuthorizationConsentService(jdbcTemplate, registeredClientRepository);\n    }\n\n    @Bean\n    public JWKSource&lt;SecurityContext&gt; jwkSource() {\n        RSAKey rsaKey = Jwks.generateRsa();\n        JWKSet jwkSet = new JWKSet(rsaKey);\n        return (jwkSelector, securityContext) -&gt; jwkSelector.select(jwkSet);\n    }\n\n    @Bean\n    public JwtDecoder jwtDecoder(JWKSource&lt;SecurityContext&gt; jwkSource) {\n        return OAuth2AuthorizationServerConfiguration.jwtDecoder(jwkSource);\n    }\n\n    @Bean\n    public ProviderSettings providerSettings() {\n        ProviderSettings providerSettings = new ProviderSettings();\n        return providerSettings.issuer(&quot;http:\/\/auth.localhost:9000&quot;);\n    }\n\n    @Bean\n    public EmbeddedDatabase embeddedDatabase() {\n        \/\/ @formatter:off\n        return new EmbeddedDatabaseBuilder()\n                .generateUniqueName(true)\n                .setType(EmbeddedDatabaseType.H2)\n                .setScriptEncoding(&quot;UTF-8&quot;)\n                .addScript(&quot;org\/springframework\/security\/oauth2\/server\/authorization\/oauth2-authorization-schema.sql&quot;)\n                .addScript(&quot;org\/springframework\/security\/oauth2\/server\/authorization\/oauth2-authorization-consent-schema.sql&quot;)\n                .addScript(&quot;org\/springframework\/security\/oauth2\/server\/authorization\/client\/oauth2-registered-client-schema.sql&quot;)\n                .build();\n        \/\/ @formatter:on\n    }\n}<\/code><\/pre>\n<p>DefaultSecurityConfig.java<\/p>\n<pre><code class=\"language-java\">@EnableWebSecurity\npublic class DefaultSecurityConfig {\n\n    \/\/ @formatter:off\n    @Bean\n    SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {\n        http\n                .authorizeRequests(authorizeRequests -&gt;\n                        authorizeRequests.anyRequest().authenticated()\n                )\n                .formLogin(withDefaults());\n        return http.build();\n    }\n    \/\/ @formatter:on\n\n    \/\/ @formatter:off\n    @Bean\n    UserDetailsService users() {\n        UserDetails user = User.withDefaultPasswordEncoder()\n                .username(&quot;user&quot;)\n                .password(&quot;pass&quot;)\n                .roles(&quot;USER&quot;)\n                .build();\n        return new InMemoryUserDetailsManager(user);\n    }\n    \/\/ @formatter:on\n}<\/code><\/pre>\n<p>KeyGeneratorUtils.java<\/p>\n<pre><code class=\"language-java\">final class KeyGeneratorUtils {\n\n    private KeyGeneratorUtils() {\n    }\n\n    static SecretKey generateSecretKey() {\n        SecretKey hmacKey;\n        try {\n            hmacKey = KeyGenerator.getInstance(&quot;HmacSha256&quot;).generateKey();\n        } catch (Exception ex) {\n            throw new IllegalStateException(ex);\n        }\n        return hmacKey;\n    }\n\n    static KeyPair generateRsaKey() {\n        KeyPair keyPair;\n        try {\n            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(&quot;RSA&quot;);\n            keyPairGenerator.initialize(2048);\n            keyPair = keyPairGenerator.generateKeyPair();\n        } catch (Exception ex) {\n            throw new IllegalStateException(ex);\n        }\n        return keyPair;\n    }\n\n    static KeyPair generateEcKey() {\n        EllipticCurve ellipticCurve = new EllipticCurve(\n                new ECFieldFp(\n                        new BigInteger(&quot;115792089210356248762697446949407573530086143415290314195533631308867097853951&quot;)),\n                new BigInteger(&quot;115792089210356248762697446949407573530086143415290314195533631308867097853948&quot;),\n                new BigInteger(&quot;41058363725152142129326129780047268409114441015993725554835256314039467401291&quot;));\n        ECPoint ecPoint = new ECPoint(\n                new BigInteger(&quot;48439561293906451759052585252797914202762949526041747995844080717082404635286&quot;),\n                new BigInteger(&quot;36134250956749795798585127919587881956611106672985015071877198253568414405109&quot;));\n        ECParameterSpec ecParameterSpec = new ECParameterSpec(\n                ellipticCurve,\n                ecPoint,\n                new BigInteger(&quot;115792089210356248762697446949407573529996955224135760342422259061068512044369&quot;),\n                1);\n\n        KeyPair keyPair;\n        try {\n            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(&quot;EC&quot;);\n            keyPairGenerator.initialize(ecParameterSpec);\n            keyPair = keyPairGenerator.generateKeyPair();\n        } catch (Exception ex) {\n            throw new IllegalStateException(ex);\n        }\n        return keyPair;\n    }\n}<\/code><\/pre>\n<p>Jwks.java<\/p>\n<pre><code class=\"language-java\">public class Jwks {\n\n    private Jwks() {\n    }\n\n    public static RSAKey generateRsa() {\n        KeyPair keyPair = KeyGeneratorUtils.generateRsaKey();\n        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();\n        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();\n        \/\/ @formatter:off\n        return new RSAKey.Builder(publicKey)\n                .privateKey(privateKey)\n                .keyID(UUID.randomUUID().toString())\n                .build();\n        \/\/ @formatter:on\n    }\n\n    public static ECKey generateEc() {\n        KeyPair keyPair = KeyGeneratorUtils.generateEcKey();\n        ECPublicKey publicKey = (ECPublicKey) keyPair.getPublic();\n        ECPrivateKey privateKey = (ECPrivateKey) keyPair.getPrivate();\n        Curve curve = Curve.forECParameterSpec(publicKey.getParams());\n        \/\/ @formatter:off\n        return new ECKey.Builder(curve, publicKey)\n                .privateKey(privateKey)\n                .keyID(UUID.randomUUID().toString())\n                .build();\n        \/\/ @formatter:on\n    }\n\n    public static OctetSequenceKey generateSecret() {\n        SecretKey secretKey = KeyGeneratorUtils.generateSecretKey();\n        \/\/ @formatter:off\n        return new OctetSequenceKey.Builder(secretKey)\n                .keyID(UUID.randomUUID().toString())\n                .build();\n        \/\/ @formatter:on\n    }\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Experimental Oauth2 Authorization Server 0.1.1 \uc791\ub3d9 \uc548\ud55c\ub2e4. \ucc38\uace0 https:\/\/tomcat.apache.org\/download-native.cgi \ud504\ub85c\uc81d\ud2b8 \uc0dd\uc131 build.gradle dependencies { implementation &#039;org.springframework.boot:spring-boot-starter-web:2.5.3&#039; implementation &#039;org.springframework.boot:spring-boot-starter-security:2.5.3&#039; implementation &#039;org.springframework.boot:spring-boot-starter-jdbc:2.5.3&#039; implementation &#039;org.springframework.security.experimental:spring-security-oauth2-authorization-server:0.1.2&#039; implementation &#039;org.springframework.security:spring-security-oauth2-core:5.5.1&#039; implementation &#039;org.springframework.security.oauth:spring-security-oauth2:2.5.1.RELEASE&#039; implementation &#039;org.springframework.security:spring-security-cas:5.5.1&#039; runtimeOnly &#039;com.h2database:h2:1.4.200&#039; compileOnly &#039;org.projectlombok:lombok:1.18.20&#039; developmentOnly &#039;org.springframework.boot:spring-boot-devtools:2.5.3&#039; annotationProcessor &#039;org.projectlombok:lombok:1.18.20&#039; testImplementation &#039;org.springframework.boot:spring-boot-starter-test:2.5.3&#039; testImplementation &#039;net.sourceforge.htmlunit:htmlunit:2.52.0&#039; } application.yml server: port: 9000 logging: level: # root: DEBUG org.springframework.web: DEBUG org.springframework.security: DEBUG org.springframework.security.oauth2:\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=2535\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[29],"tags":[],"class_list":["post-2535","post","type-post","status-publish","format-standard","hentry","category-spring-boot-2-5"],"_links":{"self":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/2535","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2535"}],"version-history":[{"count":7,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/2535\/revisions"}],"predecessor-version":[{"id":3789,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/2535\/revisions\/3789"}],"wp:attachment":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2535"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2535"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2535"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}