ホームページ > バックエンド開発 > PHPチュートリアル > Java バックエンド開発: OAuth2 に基づいた安全な API の構築

Java バックエンド開発: OAuth2 に基づいた安全な API の構築

王林
リリース: 2023-06-17 10:42:01
オリジナル
1564 人が閲覧しました

OAuth2 は、最新のアプリケーションで広く使用されている認証および認可プロトコルの 1 つです。これにより、ユーザーは機密情報の漏洩を防ぎながら、サードパーティのアプリケーションがリソースにアクセスすることを承認できます。この記事では、Java バックエンド開発を使用して OAuth2 ベースの安全な API を構築する方法を紹介します。

  1. OAuth2 とは何ですか?

OAuth2 は、アプリケーション間の認可の問題を解決するために設計された一般的な認可プロトコルです。これにより、ユーザーはサードパーティのアプリケーションが Google ドライブや Facebook アカウントなどのリソースにアクセスすることを承認しながら、ユーザーの資格情報が侵害されるのを防ぐことができます。 OAuth2 には、リソース オーナー、クライアント、認可サーバー、リソース サーバーの 4 つの役割が含まれています。リソース所有者は、保護されたリソースを持つユーザーまたはエンティティです。クライアントは、リソースへのアクセスを要求するアプリケーションです。認可サーバーは、リソース所有者の身元を確認し、アクセス トークンを発行するサーバーです。リソース サーバーは、リソースを保存および提供するサーバー。 OAuth2 は認可サーバーを通じてトークンを発行し、クライアントはそのトークンを使用してリソース サーバーにリソースを要求します。

  1. OAuth2 プロセス

OAuth2 プロセスは次のステップで構成されます。

  1. クライアントは、認可サーバーにリクエストを行います。識別子とダイレクト URI。
  2. 認可サーバーはクライアントの身元を検証し、リソース所有者にクライアントがそのリソースにアクセスすることを認可することを要求します。
  3. リソース所有者は、クライアントがそのリソースにアクセスすることを承認します。
  4. 認可サーバーはクライアントにアクセス トークンを発行します。
  5. クライアントはアクセス トークンを使用して、リソース サーバーからリソースへのアクセスを要求します。
  6. リソース サーバーは、アクセス トークンが有効かどうかを検証し、リソースを提供します。
  7. OAuth2 に基づいて安全な API を構築する

安全な API を構築するには、次の手順を実装する必要があります。

  1. OAuth2 サーバーを作成します。 OAuth2 を作成する必要があります。サーバーはアクセス トークンを発行し、クライアントを認証し、リクエストを承認します。
  2. Spring Security の構成: Spring Security は、認証と認可を処理する Spring エコシステムのセキュリティ フレームワークです。 Spring Security の OAuth2 認証および認可フローを構成する必要があります。
  3. クライアントの作成: リソース サーバーへのアクセスを要求し、OAuth2 サーバーからアクセス トークンを取得するクライアントを作成する必要があります。
  4. リソース サーバーの作成: 保護されたリソースを保存し、提供するためにリソース サーバーを作成する必要があります。
  5. アクセス トークンの検証: アクセス トークンがリソース サーバーで有効かどうかを検証し、トークンのスコープに従って対応するリソースを提供する必要があります。

次は、Java および Spring フレームワークに基づく OAuth2 の例です:

  1. OAuth2 サーバーを作成します:

@EnableAuthorizationServer
@Configuration
public class OAuth2AuthorizationConfig extends AuthorizationServerConfigurerAdapter {

private final PasswordEncoder passwordEncoder;
private final AuthenticationManager authenticationManager;
private final UserDetailsService userDetailsService;

@Autowired
public OAuth2AuthorizationConfig(
        PasswordEncoder passwordEncoder,
        AuthenticationManager authenticationManager,
        UserDetailsService userDetailsService
) {
    this.passwordEncoder = passwordEncoder;
    this.authenticationManager = authenticationManager;
    this.userDetailsService = userDetailsService;
}

@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
    clients.inMemory()
            .withClient("client")
            .secret(passwordEncoder.encode("secret"))
            .authorizedGrantTypes("authorization_code")
            .scopes("read", "write", "trust")
            .redirectUris("http://localhost:8080/login/oauth2/code/");
}

@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
    endpoints.authenticationManager(authenticationManager)
            .userDetailsService(userDetailsService);
}
ログイン後にコピー

}

  1. Spring Security の構成:

@Configuration
@EnableWebSecurity
@ EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

private final UserDetailsService userDetailsService;
private final PasswordEncoder passwordEncoder;

@Autowired
public WebSecurityConfig(
        UserDetailsService userDetailsService,
        PasswordEncoder passwordEncoder
) {
    this.userDetailsService = userDetailsService;
    this.passwordEncoder = passwordEncoder;
}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService)
            .passwordEncoder(passwordEncoder);
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .antMatchers("/oauth/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .oauth2Login();
}
ログイン後にコピー

}

  1. クライアントの作成:

@RestController
public class ClientController {

private final OAuth2AuthorizedClientService authorizedClientService;

@Autowired
public ClientController(OAuth2AuthorizedClientService authorizedClientService) {
    this.authorizedClientService = authorizedClientService;
}

@GetMapping("/resource")
public ResponseEntity<String> getResource(OAuth2AuthenticationToken authentication) {
    OAuth2AuthorizedClient authorizedClient = authorizedClientService.loadAuthorizedClient(
            authentication.getAuthorizedClientRegistrationId(),
            authentication.getName()
    );
    HttpHeaders headers = new HttpHeaders();
    headers.setBearerAuth(authorizedClient.getAccessToken().getTokenValue());
    HttpEntity<String> entity = new HttpEntity<>(headers);
    ResponseEntity<String> response = new RestTemplate().exchange(
            "http://localhost:8081/resource",
            HttpMethod.GET,
            entity,
            String.class
    );
    return response;
}
ログイン後にコピー

}

  1. リソースサーバーの作成:

@RestController
public class ResourceController {

@GetMapping("/resource")
public ResponseEntity<String> getResource() {
    return ResponseEntity.ok("resource");
}
ログイン後にコピー

}

  1. アクセス トークンを確認します:

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

@Override
public void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .antMatchers("/oauth/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .oauth2ResourceServer()
            .jwt();
}
ログイン後にコピー

}

  1. 概要

この記事では、OAuth2 プロトコルのプロセスを紹介し、Java および Spring フレームワークに基づく例を示します。 OAuth2 を使用することで、より安全な API を構築し、ユーザーの機密情報の漏洩を防ぐことができます。 API開発では、ユーザーデータとアプリケーションリソースを保護するために、常にセキュリティに注意を払う必要があります。

以上がJava バックエンド開発: OAuth2 に基づいた安全な API の構築の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート