> Java > java지도 시간 > 본문

OAuth 스프링 부트

Linda Hamilton
풀어 주다: 2024-09-20 18:17:31
원래의
1061명이 탐색했습니다.

OAuth Spring Boot

소개

OAuth 2.0은 사용자의 자격 증명 없이도 타사 애플리케이션이 사용자를 대신하여 보호된 리소스에 액세스할 수 있도록 하는 인증 프레임워크입니다. 이는 OAuth 공급자가 발행하고 타사 애플리케이션에서 사용자 리소스에 액세스하는 데 사용되는 액세스 토큰을 사용하여 달성됩니다.

Spring Boot는 Java로 웹 애플리케이션을 구축하는 데 널리 사용되는 프레임워크입니다. 안전하고 확장 가능한 웹 애플리케이션을 구축하기 위한 강력한 도구 세트를 제공하며 OAuth 2.0 구현에 매우 적합합니다.

이 블로그 게시물에서는 Spring Boot를 사용하여 OAuth 2.0을 구현하는 데 필요한 단계를 살펴보겠습니다. Spring Security OAuth 2.0 프레임워크를 사용하여 OAuth 2.0 권한 부여 및 인증을 구현하겠습니다.

시작하기 전에 먼저 OAuth 2.0 흐름을 살펴보고 작동 방식을 더 잘 이해해 보겠습니다.

OAuth 2.0 개요

OAuth 2.0은 타사 애플리케이션이 사용자를 대신하여 리소스에 액세스할 수 있도록 하는 인증 프로토콜입니다. 성공적인 인증 후에 얻은 리소스에 대한 액세스를 제공하기 위해 액세스 토큰을 사용합니다. OAuth 2.0에는 리소스 소유자, 클라이언트, 권한 부여 서버, 리소스 서버의 네 가지 역할이 있습니다.

  1. 리소스 소유자: 클라이언트가 액세스하는 리소스를 소유한 사용자입니다.

2.클라이언트: 사용자를 대신하여 리소스에 대한 액세스를 요청하는 애플리케이션입니다.

3.Authorization Server: 사용자 인증에 성공한 후 클라이언트에게 접근 토큰을 발급해주는 서버입니다.

4.리소스 서버: 클라이언트가 액세스하는 리소스를 보유하는 서버입니다.

OAuth 2.0 흐름

OAuth 2.0 흐름에는 다음 단계가 포함됩니다.

사용자가 타사 애플리케이션에서 보호된 리소스에 대한 액세스를 요청합니다.

  1. 타사 애플리케이션은 액세스 토큰을 얻기 위해 사용자를 OAuth 공급자로 리디렉션합니다.

  2. 사용자는 OAuth 공급자에 로그인하고 보호된 리소스에 액세스할 수 있는 권한을 타사 애플리케이션에 부여합니다.

  3. OAuth 공급자는 타사 애플리케이션에 액세스 토큰을 발급합니다.

  4. 타사 애플리케이션은 액세스 토큰을 사용하여 사용자를 대신하여 보호된 리소스에 액세스합니다.

이제 OAuth 2.0 흐름을 이해했으므로 Spring Boot를 사용하여 구현해 보겠습니다.

Spring Boot를 사용하여 OAuth 2.0 구현

종속성 추가
먼저 Spring Boot 프로젝트에 필요한 종속성을 추가합니다. pom.xml 파일에 다음 종속성을 추가하면 됩니다.

`
org.springframework.boot
spring-boot-starter-oauth2-클라이언트


org.springframework.security
스프링 보안-oauth2-호세
`

OAuth 2.0 구성

다음으로 WebSecurityConfigurerAdapter를 확장하는 클래스를 생성하여 OAuth 2.0을 구성합니다. 예는 다음과 같습니다.

`@구성
@EnableWebSecurity
공개 클래스 SecurityConfig는 WebSecurityConfigurerAdapter {

를 확장합니다.
@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/oauth2/**", "/login/**", "/logout/**")
            .permitAll()
            .anyRequest()
            .authenticated()
            .and()
        .oauth2Login()
            .loginPage("/login")
            .defaultSuccessURL("/home")
            .and()
        .logout()
            .logoutSuccessUrl("/")
            .logoutUrl("/logout")
            .and()
        .csrf().disable();
}
로그인 후 복사

}`

이 구성을 사용하면 누구나 /oauth2/, /login/ 및 /logout/** 엔드포인트에 액세스할 수 있습니다. 다른 모든 끝점에는 인증이 필요합니다. 사용자가 OAuth 2.0을 통해 로그인하면 /home 엔드포인트로 리디렉션됩니다. 로그아웃하면 / 엔드포인트로 리디렉션됩니다.

토큰 생성

토큰을 생성하려면 spring-security-oauth2-jose 종속성에서 JwtBuilder 클래스를 사용할 수 있습니다. 예는 다음과 같습니다.

`org.springframework.security.oauth2.jwt.Jwt 가져오기;
import org.springframework.security.oauth2.jwt.JwtBuilder;
import org.springframework.security.oauth2.jwt.Jwts;
import org.springframework.security.oauth2.jwt.NimbusJwtEncoder;

java.security.KeyPair 가져오기;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.time.Instant;
import java.util.Date;

공개 클래스 TokenGenerator {

public static void main(String[] args) throws NoSuchAlgorithmException {
    // Generate a key pair
    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
    keyPairGenerator.initialize(2048);
    KeyPair keyPair = keyPairGenerator.generateKeyPair();

    // Build the JWT
    JwtBuilder jwtBuilder = Jwts.builder()
            .setIssuer("https://example.com")
            .setAudience("https://example.com/resources")
            .setId("123")
            .setSubject("user@example.com")
            .setExpiration(Date.from(Instant.now().plusSeconds(3600)))
            .setIssuedAt(new Date())
            .signWith(new NimbusJwtEncoder(keyPair.getPrivate()));

    Jwt jwt = jwtBuilder.build();
    System.out.println(jwt.getTokenValue());
}
로그인 후 복사

}`

이 코드는 키 쌍을 생성하고, 필요한 클레임으로 JWT를 구축하고, 개인 키로 서명합니다. 결과 토큰이 콘솔에 인쇄됩니다.

이는 토큰을 생성하는 방법의 예일 뿐입니다. 실제로는 개인 키를 안전하게 저장하고 만료 시간을 생성하는 다른 방법을 사용하는 것이 좋습니다.

OAuth 2.0 클라이언트 구성

애플리케이션에서 OAuth 2.0을 사용하려면 클라이언트를 구성해야 합니다. Spring Boot에서는 application.properties 파일에 속성을 추가하여 이를 수행할 수 있습니다. 예는 다음과 같습니다.

spring.security.oauth2.client.registration.example.client-id=client-id
spring.security.oauth2.client.registration.example.client-secret=client-secret
spring.security.oauth2.client.registration.example.scope=read,write
spring.security.oauth2.client.registration.example.redirect-uri=http://localhost:8080/login/oauth2/code/example
spring.security.oauth2.client.provider.example.authorization-uri=https://example.com/oauth2/authorize
spring.security.oauth2.client.provider.example.token-uri=https://example.com/oauth2/token
spring.security.oauth2.client.provider.example.user-info-uri=https://example.com/userinfo
spring.security.oauth2.client.provider.example.user-name-attribute=name

This configuration sets up an OAuth 2.0 client with the client ID and client secret provided by the example registration. It also sets the desired scope, redirect URI, and authorization, token, and user info URIs for the provider. Finally, it specifies that the user's name should be retrieved from the name attribute in the user info response.

Use the Token

Once you have a token, you can use it to access protected resources. For example, you can make an authenticated request to a resource server using the RestTemplate class. Here's an example:

`import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;

public class ResourceClient {

public static void main(String[] args) {
    // Create a RestTemplate
    RestTemplate restTemplate = new RestTemplate();

    // Set the authorization header
    HttpHeaders headers = new HttpHeaders();
    headers.setBearerAuth("token");

    // Make the request
    HttpEntity<String> entity = new HttpEntity<>(headers);
    ResponseEntity<String> response = restTemplate.exchange(
            "https://example.com/resource",
            HttpMethod.GET,
            entity,
            String.class
    );

    // Print the response body
    System.out.println(response.getBody());
}
로그인 후 복사

}`

This code sets the authorization header to the JWT token and makes a GET request to the /resource endpoint on the resource server. The response body is printed to the console.

Protect Endpoints

To protect endpoints in your Spring Boot application, you can use annotations provided by Spring Security. For example, you can use the @PreAuthorize annotation to ensure that a user has a specific role before they can access an endpoint. Here's an example:

`import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

@GetMapping("/admin")
@PreAuthorize("hasRole('ADMIN')")
public String adminEndpoint() {
    return "Hello, admin!";
}
로그인 후 복사

}`

This code defines a controller with an endpoint that requires the user to have the ADMIN role in order to access it. If the user does not have the required role, they will receive a 403 Forbidden error.

Test the OAuth 2.0 flow

  1. Start the application First, start the Spring Boot application that you’ve configured to use OAuth 2.0. You can do this by running the main() method in your application's main class.

  2. Navigate to the login endpoint Next, navigate to the /login endpoint in your browser. For example, if your application is running on localhost:8080, you would go to http://localhost:8080/login.

  3. Authenticate with the authorization server When you navigate to the login endpoint, your application will redirect you to the authorization server to authenticate. Depending on the authorization server, you may be prompted to enter your username and password, or you may be presented with a login button to authenticate with a third-party provider (such as Google or Facebook).

  4. Grant access After you authenticate, you will be prompted to grant access to the scopes requested by the client. For example, if the client requested the read and write scopes, you may be prompted to grant access to read and write the user's data.

  5. Receive the token Once you grant access, you will be redirected back to your application with an OAuth 2.0 token. This token can then be used to access protected resources.

  6. For example, if you protected an endpoint with the @PreAuthorize annotation as described in the previous example, you could navigate to that endpoint and test whether or not you have access. If you have the required role, you will see the response from the endpoint. If you do not have the required role, you will receive a 403 Forbidden error.

위 내용은 OAuth 스프링 부트의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿