OAuth2.0と動的クライアント登録
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
}
設定する必要がある主なものがいくつかあります。
ClientDetailsServiceConfigurerから始めましょう:
@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番目のファイルがあります。