Oktaによる春のセキュリティ
1. 概要
Okta は、Web、モバイル、またはAPIサービスの認証、承認、ソーシャルログインなどの機能を提供します。 さらに、Spring Framework を堅牢でサポートしているため、統合が非常に簡単になります。
StormpathがOktaと協力して、開発者向けのより優れたIdentity APIを提供するようになりました。これは、Webアプリケーションで認証を有効にする一般的な方法です。
このチュートリアルでは、Spring Oktaによるセキュリティと、Okta開発者アカウントの最小限の設定について説明します。
2. Oktaのセットアップ
2.1. 開発者アカウントのサインアップ
まず、無料のOkta開発者アカウントにサインアップします。このアカウントは、月間最大1,000人のアクティブユーザーにアクセスを提供します。 ただし、すでに1つある場合は、このセクションをスキップできます。
2.2. ダッシュボード
Okta開発者アカウントにログインすると、ダッシュボード画面が表示され、ユーザー数、認証、ログインの失敗について説明されます。
さらに、システムの詳細なログエントリも表示されます。
さらに、ダッシュボードの右上隅にある Org URL に注意してください。これは、後で作成するSpring BootアプリでのOktaのセットアップに必要です。
2.3. 新しいアプリケーションを作成する
次に、[アプリケーション]メニューを使用して新しいアプリケーションを作成し、Spring Boot用のOpenID Connect(OIDC)アプリを作成しましょう。
さらに、ネイティブ、シングルページアプリ、サービスなどの利用可能なオプションからWebプラットフォームを選択します。
2.4. アプリケーションの設定
次に、アプリケーションを指すベースURIやログインリダイレクトURIなどのいくつかのアプリケーション設定を構成しましょう。
また、 許可タイプの認証コードをマークし、WebアプリケーションのOAuth2認証を有効にするためにが必要であることを確認してください。
2.5. クライアントの資格情報
次に、アプリに関連付けられているクライアントIDとクライアントシークレットの値を取得します。
これらのクレデンシャルはOktaのセットアップに必要なので、手元に置いておいてください。
3. Spring Boot App Setup
Okta開発者アカウントで基本的な構成を行う準備ができたので、OktaセキュリティサポートをSpring Bootアプリに統合する準備が整いました。
3.1. Maven
まず、最新の okta- spring -boot-starterMaven依存関係をpom.xmlに追加しましょう。
<dependency>
<groupId>com.okta.spring</groupId>
<artifactId>okta-spring-boot-starter</artifactId>
<version>1.4.0</version>
</dependency>
3.2. Gradle
同様に、Gradleを使用する場合、[X47X]okta-spring-boot-starter依存関係をbuild.gradleに追加できます。
compile 'com.okta.spring:okta-spring-boot-starter:1.4.0'
3.3. application.properties
次に、application.propertiesでOktaoauth2プロパティを構成します。
okta.oauth2.issuer=https://dev-example123.okta.com/oauth2/default
okta.oauth2.client-id=1230oaa4yncmaxaQ90ccJwl4x6
okta.oauth2.client-secret=hjiyblEzgT0ItY91Ywcdzwa78oNhtrYqNklQ5vLzvruT123
okta.oauth2.redirect-uri=/authorization-code/callback
ここでは、 {orgURL} / oauth2 / defaultを指す発行者URLにデフォルトの認証サーバー(使用可能なものがない場合)を使用できます。
また、 API メニューを使用して、Okta開発者アカウントに新しい認証サーバーを作成できます。
次に、前のセクションで生成したOktaアプリのクライアントIDとクライアントシークレットを追加します。
最後に、アプリケーション設定で設定されているのと同じredirect-uriを構成しました。
4. HomeController
その後、HomeControllerクラスを作成しましょう。
@RestController
public class HomeController {
@GetMapping("/")
public String home(@AuthenticationPrincipal OidcUser user) {
return "Welcome, "+ user.getFullName() + "!";
}
}
ここでは、アプリケーション設定で構成された Base Uri (/)マッピングを使用したhomeメソッドを追加しました。
また、 home メソッドの引数は、SpringSecurityがユーザー情報にアクセスするために提供するOidcUserクラスのインスタンスです。
それでおしまい! Spring Boot Appは、Oktaセキュリティサポートを備えています。 Mavenコマンドを使用してアプリを実行してみましょう。
mvn spring-boot:run
localhost:8080、でアプリケーションにアクセスすると、Oktaが提供するデフォルトのサインインページが表示されます。
登録ユーザーの資格情報を使用してログインすると、ユーザーのフルネームを含むウェルカムメッセージが表示されます。
また、自己登録用のデフォルトのサインイン画面の下部に「サインアップ」リンクがあります。
5. サインアップ
5.1. 自己登録
初めて、「サインアップ」リンクを使用してOktaアカウントを作成し、電子メール、名、姓などの情報を提供できるようになりました。
5.2. ユーザーを作成する
または、Okta開発者アカウントのUsersメニューから新しいユーザーを作成できます。
5.3. セルフサービス登録設定
さらに、サインアップと登録の設定は、Okta開発者アカウントのユーザーメニューから構成できます。
6. Okta Spring SDK
Spring BootアプリでOktaのセキュリティ統合を確認したので、同じアプリでOkta管理APIを操作してみましょう。
まず、Okta開発者アカウントの API メニューを使用して、トークンを作成する必要があります。
トークンは生成後に1回だけ表示されるため、必ずトークンを書き留めてください。 次に、保護のためにハッシュとして保存されます。
6.1. 設定
次に、最新の okta- spring -sdkMaven依存関係をpom.xmlに追加しましょう。
<dependency>
<groupId>com.okta.spring</groupId>
<artifactId>okta-spring-sdk</artifactId>
<version>1.4.0</version>
</dependency>
6.2. application.properties
次に、いくつかの重要なOktaクライアントプロパティを追加します。
okta.client.orgUrl=https://dev-example123.okta.com
okta.client.token=00TVXDNx1e2FgvxP4jLlONbPMzrBDLwESSf9hZSvMI123
ここでは、前のセクションで説明したトークンを追加しました。
6.3. AdminController
最後に、Clientインスタンスを挿入したAdminControllerを作成しましょう。
@RestController
public class AdminController {
@Autowired
public Client client;
}
それでおしまい! Client インスタンスのメソッドを呼び出して、OktaAPIにリクエストを送信する準備が整いました。
6.4. ユーザーの一覧表示
UserListオブジェクトを返すlistUsersメソッドを使用して、組織内のすべてのユーザーのリストをフェッチするgetUsersメソッドを作成しましょう。
public class AdminController {
// ...
@GetMapping("/users")
public UserList getUsers() {
return client.listUsers();
}
}
その後、 localhost:8080 / users にアクセスして、すべてのユーザーを含むJSON応答を受信できます。
{
"dirty":false,
"propertyDescriptors":{
"items":{
"name":"items",
"type":"com.okta.sdk.resource.user.User"
}
},
"resourceHref":"/api/v1/users",
"currentPage":{
"items":[
{
"id":"00uanxiv7naevaEL14x6",
"profile":{
"firstName":"Anshul",
"lastName":"Bansal",
"email":"[email protected]",
// ...
},
// ...
},
{
"id":"00uag6vugXMeBmXky4x6",
"profile":{
"firstName":"Ansh",
"lastName":"Bans",
"email":"[email protected]",
// ...
},
// ...
}
]
},
"empty":false,
// ...
}
6.5. ユーザーを検索
同様に、firstName、lastName、またはemailをクエリパラメータとして使用してユーザーをフィルタリングできます。
@GetMapping("/user")
public UserList searchUserByEmail(@RequestParam String query) {
return client.listUsers(query, null, null, null, null);
}
localhost:8080 / user?query = ansh @ bans.com を使用して、emailでユーザーを検索してみましょう。
{
"dirty":false,
"propertyDescriptors":{
"items":{
"name":"items",
"type":"com.okta.sdk.resource.user.User"
}
},
"resourceHref":"/api/v1/users?q=ansh%40bans.com",
"currentPage":{
"items":[
{
"id":"00uag6vugXMeBmXky4x6",
"profile":{
"firstName":"Ansh",
"lastName":"Bans",
"email":"[email protected]",
// ...
},
// ...
}
]
},
// ...
}
6.6. ユーザーを作成
また、UserBuilderインターフェイスのinstanceメソッドを使用して、新しいユーザーを作成できます。
@GetMapping("/createUser")
public User createUser() {
char[] tempPassword = {'P','a','$','$','w','0','r','d'};
User user = UserBuilder.instance()
.setEmail("[email protected]")
.setFirstName("Norman")
.setLastName("Lewis")
.setPassword(tempPassword)
.setActive(true)
.buildAndCreate(client);
return user;
}
それでは、 localhost:8080 / createUser にアクセスして、新しいユーザーの詳細を確認しましょう。
{
"id": "00uauveccPIYxQKUf4x6",
"profile": {
"firstName": "Norman",
"lastName": "Lewis",
"email": "[email protected]"
},
"credentials": {
"password": {},
"emails": [
{
"value": "[email protected]",
"status": "VERIFIED",
"type": "PRIMARY"
}
],
// ...
},
"_links": {
"resetPassword": {
"href": "https://dev-example123.okta.com/api/v1/users/00uauveccPIYxQKUf4x6/lifecycle/reset_password",
"method": "POST"
},
// ...
}
}
同様に、すべてのアプリケーションの一覧表示、アプリケーションの作成、すべてのグループの一覧表示、グループの作成などのさまざまな操作を実行できます。
7. 結論
このクイックチュートリアルでは、Oktaを使用したSpringSecurityについて説明しました。
まず、基本的な構成でOkta開発者アカウントを設定します。 次に、Spring Boot Appを作成し、SpringSecurityとOktaを統合するためにapplication.propertiesを構成しました。
次に、Okta APIを管理するために、OktaSpringSDKを統合しました。 最後に、すべてのユーザーの一覧表示、ユーザーの検索、ユーザーの作成などの機能について検討しました。
いつものように、すべてのコード実装はGitHubで利用できます。