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利用できます。