Oktaの認証を使ってみた

# はじめに
　システムのクラウド化が進んできており、**IDaaS (Identity as a Service)**と呼ばれる、クラウド経由でID管理、シングルサインオン (SSO)、アクセス制御などを提供するサービスの市場が拡⼤しています。IDaaSの主要なサービスとしては、Azure ADやOkta Identity Cloud、Google Cloud Identityなどが挙げられます。
　今回は、**[Okta Identity Cloud](https://www.okta.com/jp/)の無償トライアル**を利⽤して、Okta認証を試してみます。本記事では、Oktaで**OpenID Connect(OIDC)**を⽤いて、AWS上に構築した[Express](https://expressjs.com/)（※）のアプリケーションへのアクセスを認証します。アプリケーションは、[npm](https://www.npmjs.com/)に公開されている[@okta/oidc-middleware パッケージ](https://www.npmjs.com/package/@okta/oidc-middleware)のサンプルを使⽤します。
※Expressは[Node.js](https://nodejs.org/en/)で利⽤できるWebアプリケーションのフレームワークです。Webアプリケーションを開発する上で必要な機能が備わっており、ルーティングやセッション管理などの機能も提供しているため、迅速かつ容易にwebアプリケーションを開発できます。

## 前提
・Amazon EC2インスタンス（Linux環境）を作成済みであること。
・Amazon EC2インスタンスには、Node.jsがインストール済みでnpmコマンド、nodeコマンドを実⾏できること。
・Amazon EC2インスタンスは外部のインターネットと通信できること。

## 構成
次の構成を構築します。
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397391/53208749-bf29-f864-d07f-318d0da8ac42.png)
① ユーザはブラウザからAmazon EC2インスタンス上のExpressアプリケーションにリクエストを送信します。
② ExpressアプリケーションはOktaにリダイレクトします。
③ Oktaはユーザに認証情報を要求します。
④ ユーザは認証情報を⼊⼒します。
⑤ 認証に成功するとOktaは認証情報を付与してExpressアプリケーションにリダイレクトします。
⑥ Expressアプリケーションはユーザにレスポンスを返します。

以降に構築⼿順を説明します。

## Oktaの無償トライアル環境の登録
Oktaでは、Oktaの主要機能を**30⽇間無償**で利⽤できるトライアル環境を提供しています。無料トライアル環境の登録⽅法を説明します。

1．無償トライアルを使⽤するため、Oktaの公式サイトにアクセスします。
　　https://www.okta.com/jp/free-trial/

2．お名前、仕事⽤Eメールアドレス、国/地域を設定して、プライバシーポリシーに同意します。さらに、ドメインにOkta内で⼀意の名前を設定して、画⾯下の［今すぐ始める］ボタンをクリックします。
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397391/afbf9100-a7e0-f37a-510c-a86b8f2fe2a0.png)

3．先ほど2．で設定したEメールアドレスにメールが届きます。メールに記載されている **Okta** **homepage:** のURLにアクセスします。

4．Oktaの認証画⾯が表⽰されます。3．のメールに記載されている **Okta** **username:** 、**Temporarypassword:** の値を⼊⼒して、**サインイン** ボタンをクリックします。
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397391/90cd881a-5088-54c0-d8bd-3ce6a135d69e.png)

5．Oktaの初期設定画⾯が表⽰されます。画⾯の指⽰に従ってパスワードなどを設定します。
![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397391/7222b527-af75-9924-bce5-f41a851a30cd.png)
![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397391/edf401ff-9d24-2981-d5ac-a35cadb1007d.png)

7．多要素認証を設定します。Okta Verifyの **設定** ボタンをクリックします。
![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397391/47e7920d-4b0b-6f0e-68c6-da00886bdf8d.png)

8．Okta Verifyを設定する機器を選択します。機器の選択後は画⾯の指⽰に従ってOkta Verifyを設定します。
![9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397391/fc4497a4-cdc1-bdc4-4bf7-e24c74b895d9.png)

9．Okta Verifyの設定が完了したら、パスコードを⼊⼒して **確認** ボタンをクリックします。
![10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397391/7e1dcb56-0ee9-246e-aff5-c5dd5c28070f.png)

10．サインインに成功すると次のような画⾯が表⽰されます。
![11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397391/a2c06fa4-e64c-899a-21b1-8cd7441cc506.png)

## Oktaの設定
Oktaに認証先のアプリケーションに関して設定します。

1．Oktaの画⾯の左ペインから **Applications** を選択して、**Create App Integration** ボタンをクリックします。
![12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397391/f3eedd51-d695-c62a-76b9-c256aaa000d9.png)

2．Sign-in methodに **OIDC - OpenID Connect** を、Application typeに **Web Application** を選択して **Next** ボタンをクリックします。
![13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397391/17e64f71-86e0-fee2-42ab-7f148186b977.png)

3．New Web App Integration 画⾯で次の3つを設定し、画⾯下の **sava** ボタンをクリックします。
・**App integration name**︓任意の名前（例︓Sample App）
・**Sign-in redirect URls**︓＜Amazon EC2インスタンスのパブリックIP＞:8080/authorization-code/callback
・**Sign-out redirect URls (Optional)**︓＜Amazon EC2インスタンスのパブリックIP＞:8080
![14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397391/1666d7ac-786a-b26e-90b9-67496ae88410.png)

4．⽣成された **Client ID** 、**Client secret** 、**Okta domain** の値をメモしておきます。
![15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397391/0b69ae69-ae5a-ad81-875e-a8826d738239.png)

## アプリケーションの構築
Amazon EC2インスタンス上にアプリケーションを構築します。
作成済みのAmazon EC2インスタンスにログインし、今回必要な３つのnpmパッケージをインストールします。

```
# npm install express
# npm install express-session
# npm install @okta/oidc-middleware'
```

エディタなどを使⽤して、@okta/oidc-middlewareパッケージのサンプルコードのOkta認証に関するコードを修正します。（※例としてアプリケーション名はapp.jsとしています。）

```app.js
const expressoidc = new ExpressOIDC({
 issuer: '<メモしたOkta domainの値>',
 client_id: '<メモしたClient IDの値>',
 client_secret: '<メモしたClient secretの値>',
 appBaseUrl: '<Amazon EC2インスタンスのパブリックIP>:8080',
 //「/authorization-code/callback」は、セッションにuserContextのuserinfoの情報を付与
 loginRedirectUri: "<Amazon EC2インスタンスのパブリックIP>:8080/authorizationcode/callback",
 scope: 'openid profile'
});
```

## 動作確認
作成したExpressアプリケーションを利⽤して、Okta認証の動作を確認します。
Amazon EC2インスタンスにログインし、次のコマンドを実⾏してアプリケーションを起動します。

```
# node app.js
```

ブラウザから **http://＜Amazon EC2インスタンスのパブリックIP＞:8080** にアクセスすると **Login** ボタンが表⽰されるので、クリックします。

Oktaの認証画⾯が表⽰されます。設定済みのユーザ名とパスワードを⼊⼒して、**サインイン** ボタンをクリックします。
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397391/4a6f2622-2a4e-0123-ae37-559fbebb4f68.png)

Okta Verifyの認証画⾯が表⽰されます。パスコードを⼊⼒して、**確認** ボタンをクリックします。
![16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397391/0ebd26c7-2e1d-9a82-ad46-3421eb69241b.png)

認証に成功すると **Hello <ユーザ名> !** と **Logout** ボタンが表⽰されます。

## まとめ
Oktaの無償トライアルを試してみました。認証に関するアプリケーション側の実装はシステムによって難易度が変動しますが、Okta側はブラウザ上の操作で⽐較的容易に設定できます。
無償のトライアル環境はSAMLやOIDCなどOktaの主要機能を試すことができるため、様々なアプリケーションの認証テストなどに活⽤できるのではないでしょうか。
次はSAMLを⽤いたOkta認証や他のプロバイダを利⽤した認証も試してみようと思います。

・Amazon Web Services、“Powered by AWS”ロゴ、［およびかかる資料で使用されるその他のＡＷＳ商標］は、米国その他の諸国における、Amazon.com, Inc.またはその関連会社の商標です。
・Oktaは、Okta社の製品です。Oktaは、Okta,Inc.の米国およびその他の国における商標または登録商標です。
・その他記載されている会社名、製品名はそれぞれ各社の商標および登録商標です。