ホームページ Java &#&チュートリアル Java API開発でのOAuth2認証の使用

Java API開発でのOAuth2認証の使用

Jun 18, 2023 am 11:49 AM
java 認証 oauth

Java API の開発において、認証は避けられない問題です。 OAuth2 は、アクセスを許可することで API リソースを保護する一般的な認証方法です。この記事では、Java API開発における認証にOAuth2を使用する方法を紹介します。

OAuth2 の紹介

OAuth2 は、認証情報を共有することなく、サードパーティのアプリケーションがサーバー リソースにアクセスすることをユーザーが承認できるようにする承認のオープン スタンダードです。 OAuth2 標準には次の役割が含まれています:

  • リソース オーナー: リソース所有者、つまりユーザー;
  • リソース サーバー: リソース サーバー、リソースを提供するサーバー;
  • クライアント: クライアント、つまりサードパーティ アプリケーション;
  • 認可サーバー: アクセス トークンの発行に使用される認可サーバー。

OAuth2 の認可プロセスには次のステップが含まれます:

  • クライアントは認可リクエストを認可サーバーに送信し、
  • 認可サーバーはサーバーから認可をリクエストします。リソース所有者;
  • リソース所有者が認可されると、認可サーバーはアクセス トークンをクライアントに送信します。
  • クライアントはアクセス トークンを使用して、リソース サーバーにリクエストを送信します。
  • リソース サーバーはアクセス トークンを検証し、リソースを提供します。

OAuth2 は、認可コード モード、パスワード モード、クライアント モード、暗黙的認可モードなどを含む複数の認可タイプをサポートします。 Java APIの開発では、通常、認可コードモードとパスワードモードが使用されます。

OAuth2 認可コード モード

認可コード モードは、OAuth2 で最も一般的に使用される認可タイプであり、次の手順が含まれます:

  • クライアントは認可リクエストを送信します。クライアント ID とリダイレクト URI を含む認可サーバー。
  • 認可サーバーはリソース所有者にログイン ページを送信し、リソース所有者にログインと認可を要求します。
  • リソース所有者が認可した後、認可サーバーは認可コードをリダイレクト URI に送信します。
  • クライアントは認可コードを使用して、クライアント ID とクライアント シークレットを含むリクエストを認可サーバーに送信します。
  • 認可サーバーはクライアントを検証します。 ID とクライアント シークレットが正しい場合は、クライアントにアクセス トークンを発行します。
  • クライアントはアクセス トークンを使用して、リソース サーバーにリクエストを送信します。

Java API 開発では、Spring Security OAuth2 フレームワークを使用して認可コード モード認証を実装できます。

まず、pom.xml ファイルに次の依存関係を追加する必要があります:

<dependency>
    <groupId>org.springframework.security.oauth</groupId>
    <artifactId>spring-security-oauth2</artifactId>
    <version>2.3.4.RELEASE</version>
</dependency>
ログイン後にコピー
ログイン後にコピー

次に、Spring MVC 構成ファイルに次の構成を追加します:

<security:http pattern="/oauth/token" create-session="stateless"
    authentication-manager-ref="authenticationManager"
    xmlns="http://www.springframework.org/schema/security">
    <security:intercept-url pattern="/oauth/token" access="isAuthenticated()" method="POST" />
    <security:anonymous enabled="false" />
    <security:http-basic entry-point-ref="clientAuthenticationEntryPoint" />
    <security:custom-filter ref="clientCredentialsTokenEndpointFilter" before="BASIC_AUTH_FILTER" />
    <security:access-denied-handler ref="oauthAccessDeniedHandler" />
</security:http>

<security:http pattern="/api/**" create-session="never"
    entry-point-ref="oauthAuthenticationEntryPoint"
    access-decision-manager-ref="accessDecisionManager"
    xmlns="http://www.springframework.org/schema/security">
    <security:anonymous enabled="false" />
    <security:intercept-url pattern="/api/**" access="ROLE_USER" />
    <security:custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" />
    <security:access-denied-handler ref="oauthAccessDeniedHandler" />
</security:http>

<bean id="clientAuthenticationEntryPoint"
    class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint">
    <property name="realmName" value="spring-boot-oauth2" />
    <property name="typeName" value="Basic" />
</bean>

<bean id="oauthAuthenticationEntryPoint"
    class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint">
    <property name="realmName" value="spring-boot-oauth2" />
    <property name="typeName" value="Bearer" />
</bean>

<bean id="oauthAccessDeniedHandler"
    class="org.springframework.security.oauth2.provider.error.OAuth2AccessDeniedHandler" />

<bean id="clientCredentialsTokenEndpointFilter"
    class="org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter">
    <property name="authenticationManager" ref="authenticationManager" />
</bean>

<bean id="resourceServerFilter"
    class="org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationProcessingFilter">
    <property name="authenticationManager" ref="authenticationManager" />
</bean>

<bean id="accessDecisionManager"
    class="org.springframework.security.access.vote.UnanimousBased"
    xmlns="http://www.springframework.org/schema/beans">
    <constructor-arg>
        <list>
            <bean class="org.springframework.security.oauth2.provider.vote.ScopeVoter" />
            <bean class="org.springframework.security.access.vote.RoleVoter" />
            <bean class="org.springframework.security.access.vote.AuthenticatedVoter" />
        </list>
    </constructor-arg>
</bean>

<security:authentication-manager id="authenticationManager">
    <security:authentication-provider user-service-ref="userDetailsService" />
</security:authentication-manager>

<bean id="userDetailsService"
    class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
    <property name="dataSource" ref="dataSource" />
</bean>
ログイン後にコピー
ログイン後にコピー

Among /oauth/token はアクセス トークンの取得に使用されるパス、/api/** は認証が必要なパスです。

OAuth2RestTemplate を使用してリクエストを送信する場合、最初にアクセス トークンを取得する必要があります。コードは次のとおりです:

OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(client, context);
AuthorizationCodeResourceDetails details = (AuthorizationCodeResourceDetails)client.getResource();
AuthorizationCodeAccessTokenProvider provider = new AuthorizationCodeAccessTokenProvider();
Authentication auth = new UsernamePasswordAuthenticationToken(username, password);
AccessTokenRequest tokenRequest = provider.createAccessTokenRequest(details, auth);
OAuth2AccessToken accessToken = provider.obtainAccessToken(details, tokenRequest);
restTemplate.getOAuth2ClientContext().setAccessToken(accessToken);
ログイン後にコピー

このうち、クライアントは OAuth2ProtectedResourceDetails 型のオブジェクトであり、次のような情報が含まれています。クライアント ID とクライアント シークレットとして。

OAuth2 パスワード モード

パスワード モードは、クライアントを信頼するのに適した OAuth2 の承認タイプであり、次の手順が含まれます:

  • クライアントは承認にリクエストを送信します。サーバー (クライアント ID、クライアント シークレット、リソース所有者のユーザー名とパスワードを含む);
  • 認可サーバーはクライアント ID、クライアント シークレット、ユーザー名とパスワードを検証し、正しければクライアントにアクセス トークンを発行します。
  • クライアントの使用 アクセス トークンはリソース サーバーにリクエストを送信します。

Java API 開発では、Spring Security OAuth2 フレームワークを使用してパスワード モード認証を実装できます。

まず、pom.xml ファイルに次の依存関係を追加する必要があります:

<dependency>
    <groupId>org.springframework.security.oauth</groupId>
    <artifactId>spring-security-oauth2</artifactId>
    <version>2.3.4.RELEASE</version>
</dependency>
ログイン後にコピー
ログイン後にコピー

次に、Spring MVC 構成ファイルに次の構成を追加します:

<security:http pattern="/oauth/token" create-session="stateless"
    authentication-manager-ref="authenticationManager"
    xmlns="http://www.springframework.org/schema/security">
    <security:intercept-url pattern="/oauth/token" access="isAuthenticated()" method="POST" />
    <security:anonymous enabled="false" />
    <security:http-basic entry-point-ref="clientAuthenticationEntryPoint" />
    <security:custom-filter ref="clientCredentialsTokenEndpointFilter" before="BASIC_AUTH_FILTER" />
    <security:access-denied-handler ref="oauthAccessDeniedHandler" />
</security:http>

<security:http pattern="/api/**" create-session="never"
    entry-point-ref="oauthAuthenticationEntryPoint"
    access-decision-manager-ref="accessDecisionManager"
    xmlns="http://www.springframework.org/schema/security">
    <security:anonymous enabled="false" />
    <security:intercept-url pattern="/api/**" access="ROLE_USER" />
    <security:custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" />
    <security:access-denied-handler ref="oauthAccessDeniedHandler" />
</security:http>

<bean id="clientAuthenticationEntryPoint"
    class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint">
    <property name="realmName" value="spring-boot-oauth2" />
    <property name="typeName" value="Basic" />
</bean>

<bean id="oauthAuthenticationEntryPoint"
    class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint">
    <property name="realmName" value="spring-boot-oauth2" />
    <property name="typeName" value="Bearer" />
</bean>

<bean id="oauthAccessDeniedHandler"
    class="org.springframework.security.oauth2.provider.error.OAuth2AccessDeniedHandler" />

<bean id="clientCredentialsTokenEndpointFilter"
    class="org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter">
    <property name="authenticationManager" ref="authenticationManager" />
</bean>

<bean id="resourceServerFilter"
    class="org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationProcessingFilter">
    <property name="authenticationManager" ref="authenticationManager" />
</bean>

<bean id="accessDecisionManager"
    class="org.springframework.security.access.vote.UnanimousBased"
    xmlns="http://www.springframework.org/schema/beans">
    <constructor-arg>
        <list>
            <bean class="org.springframework.security.oauth2.provider.vote.ScopeVoter" />
            <bean class="org.springframework.security.access.vote.RoleVoter" />
            <bean class="org.springframework.security.access.vote.AuthenticatedVoter" />
        </list>
    </constructor-arg>
</bean>

<security:authentication-manager id="authenticationManager">
    <security:authentication-provider user-service-ref="userDetailsService" />
</security:authentication-manager>

<bean id="userDetailsService"
    class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
    <property name="dataSource" ref="dataSource" />
</bean>
ログイン後にコピー
ログイン後にコピー

Among /oauth/token はアクセス トークンの取得に使用されるパス、/api/** は認証が必要なパスです。

OAuth2RestTemplate を使用してリクエストを送信する場合、最初にアクセス トークンを取得する必要があります。コードは次のとおりです:

OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(details, new DefaultOAuth2ClientContext());
restTemplate.getOAuth2ClientContext().setAccessToken(accesstoken);
ログイン後にコピー

このうち詳細は、クライアント ID を含む ResourceOwnerPasswordResourceDetails 型のオブジェクトです。 、クライアント シークレット、ユーザー名とパスワードなど。

概要

Java API 開発での認証に OAuth2 を使用すると、API リソースのセキュリティが保護され、ユーザーがサードパーティ アプリケーションのサーバー リソースへのアクセスを簡単に承認できるようになります。この記事では、OAuth2 の認可コード モードとパスワード モードを紹介し、Spring Security OAuth2 フレームワークを使用して認証を実装するためのサンプル コードを提供します。 Java API 開発者にとって役立つことを願っています。

以上がJava API開発でのOAuth2認証の使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

Java の乱数ジェネレーター Java の乱数ジェネレーター Aug 30, 2024 pm 04:27 PM

Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプ Java での日付までのタイムスタンプ Aug 30, 2024 pm 04:28 PM

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルの量を見つけるためのJavaプログラム カプセルの量を見つけるためのJavaプログラム Feb 07, 2025 am 11:37 AM

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

See all articles