1前書き

このチュートリアルでは、OAuth2.0を使った動的クライアント登録を準備します。 OAuth2.0は、HTTPサービス上のユーザーアカウントへの制限付きアクセスを取得することを可能にする承認フレームワークです。

OAuth2.0クライアントは、ユーザーのアカウントにアクセスしたいアプリケーションです。このクライアントは、外部Webアプリケーション、ユーザーエージェント、または単なるネイティブクライアントです。

動的なクライアント登録を実現するために、ハードコーディングされた設定ではなく、資格情報をデータベースに保存します。拡張しようとしているアプリケーションは、最初に

Spring REST API OAuth2チュートリアル

で説明されています。


2 Mavenの依存関係

まず、次の一連の依存関係を設定します。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security.oauth</groupId>
    <artifactId>spring-security-oauth2</artifactId>
</dependency>

DBを使用して新しく登録されたユーザーをパスワードで保存するので、

spring-jdbc

を使用していることに注意してください。


3 OAuth2.0サーバー構成

まず、あなたのOAuth 2.0認証サーバを設定する必要があります。主な設定は次のクラスの中にあります:

@Configuration
@PropertySource({ "classpath:persistence.properties" })
@EnableAuthorizationServer
public class OAuth2AuthorizationServerConfig
  extends AuthorizationServerConfigurerAdapter {

   //config
}

設定する必要がある主なものがいくつかあります。

ClientDetailsS​​erviceConfigurerから始めましょう:

@Override
public void configure(final ClientDetailsServiceConfigurer clients) throws Exception {
    clients.jdbc(dataSource())

   //...
}

これにより、クライアント情報を取得するために永続性を使用していることを確認できます。

もちろん、この標準データソースを設定しましょう。

@Bean
public DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();

    dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
    dataSource.setUrl(env.getProperty("jdbc.url"));
    dataSource.setUsername(env.getProperty("jdbc.user"));
    dataSource.setPassword(env.getProperty("jdbc.pass"));
    return dataSource;
}

そして今、私たちのアプリケーションはメモリクライアントで典型的なハードコードされたものの代わりに登録されたクライアントのソースとしてデータベースを使うでしょう。


4 DBスキーム

OAuthクライアントを格納するためのSQL構造を定義しましょう。

create table oauth__client__details (
    client__id VARCHAR(256) PRIMARY KEY,
    resource__ids VARCHAR(256),
    client__secret VARCHAR(256),
    scope VARCHAR(256),
    authorized__grant__types VARCHAR(256),
    web__server__redirect__uri VARCHAR(256),
    authorities VARCHAR(256),
    access__token__validity INTEGER,
    refresh__token__validity INTEGER,
    additional__information VARCHAR(4096),
    autoapprove VARCHAR(256)
);

私たちが注目すべき

oauth

client

details

からの最も重要なフィールドは以下のとおりです。


  • client

    id__ – 新しく登録されたクライアントのIDを格納します


  • client

    secret__ – クライアントのパスワードを保存します


  • access

    token

    validity

    – クライアントがまだ有効かどうかを示します


  • authorities

    – 特定の役割でどの役割が許可されているかを示す

クライアント
**

scope

– 許可されたアクション、例えばFacebookでステータスを書くなど


  • authorized

    grant

    types

    は、ユーザーがどのようにできるかについての情報を提供します。

特定のクライアントにログインします(この例では、パスワード付きのフォームログインです)。

各クライアントはユーザーと1対多の関係にあることに注意してください。これは当然

複数のユーザーが単一のクライアントを利用できることを意味します


5いくつかのクライアントを固執しましょう

SQLスキーマ定義を使用すると、最終的にシステム内にデータを作成できます – そして基本的にクライアントを定義します。

次の

data.sql

スクリプト(デフォルトでSpring Bootが実行します)を使用してDBを初期化します。

INSERT INTO oauth__client__details
    (client__id, client__secret, scope, authorized__grant__types,
    web__server__redirect__uri, authorities, access__token__validity,
    refresh__token__validity, additional__information, autoapprove)
VALUES
    ("fooClientIdPassword", "secret", "foo,read,write,
    "password,authorization__code,refresh__token", null, null, 36000, 36000, null, true);


oauth

client

details

の最も重要なフィールドの説明は前のセクションにあります。


6. テスト中

動的クライアント登録をテストするには、それぞれ8081ポートと8082ポートで

spring-security-oauth-server

プロジェクトと

spring-security-oauth-resource

プロジェクトの両方を実行する必要があります。

これで、ついにライブテストをいくつか書くことができます。

クライアントを

fooClientIdPassword

という名前で登録したとしましょう。

まず、定義済みのクライアントを使用して、認証サーバーからアクセストークンを取得します。

@Test
public void givenDBUser__whenRevokeToken__thenAuthorized() {
    String accessToken = obtainAccessToken("fooClientIdPassword", "john", "123");

    assertNotNull(accessToken);
}

アクセストークンを取得するロジックは次のとおりです。

private String obtainAccessToken(String clientId, String username, String password) {
    Map<String, String> params = new HashMap<String, String>();
    params.put("grant__type", "password");
    params.put("client__id", clientId);
    params.put("username", username);
    params.put("password", password);
    Response response = RestAssured.given().auth().preemptive()
      .basic(clientId, "secret").and().with().params(params).when()
      .post("http://localhost:8081/spring-security-oauth-server/oauth/token");
    return response.jsonPath().getString("access__token");
}


7. 結論

このチュートリアルでは、無制限の数のクライアントをOAuth2.0フレームワークに動的に登録する方法を学びました。

このチュートリアルの完全な実装はhttps://github.com/eugenp/spring-security-oauth/[GitHub上に]を見つけることができます – これはMavenベースのプロジェクトなので、そのままインポートして実行するのが簡単なはずです。

テストするには、クライアントをDBに追加する必要があり、

.inMemory()

設定は無効になります。古い.

inMemory()

設定を使用したい場合は、ハードコーディングされたクライアントの設定を含む2番目のファイルがあります。