OAuth2によるユーザーの認証
OAuth 2.0の認証プロトコルを使用してLiferayのヘッドレスREST APIにアクセスするアプリケーションを作成できます。 提供されているサンプルReactアプリは、OAuth2トークンベースの3種類の認証フロー(認証コードフロー、クライアント認証情報フロー、パスワードフロー)のデモを実行しています。 OAuth2 管理パネルの詳細については、 OAuth2 アプリケーションの作成を参照してください。
Liferay DXPのセットアップ
新しいLiferay DXPインスタンスを起動し、以下を実行します。
メールアドレス test@liferay.com とパスワード test を使用して、http://localhost:8080でLiferayにサインインしてください。 プロンプトが表示されたら、パスワードを learn に変更します。
-
グローバルメニュー(
)を開き、 コントロールパネル → セキュリティ → OAuth 2 管理 に移動します。
-
Add (
) をクリックして、新しい OAuth2 アプリケーションを作成します。
-
アプリケーションに名前を付ける(例:foo)。ウェブサイトのURLを
http://localhost:3000
に、コールバックURIをhttp://localhost:3000/grant-type-authorization-code
に設定する。 Save をクリックします。 -
クライアントIDとクライアントシークレットをクリップボードにコピーします。クライアントシークレットを取得するには、 Edit をクリックします。ポップアップウィンドウから値をコピーします。
これらの値は、後でサンプルReactアプリで必要になります。
-
ページ上部の[Scopes]タブをクリックします。下にスクロールし、 LIFERAY.HEADLESS.ADMIN.USER をクリックし、 read data on your behalf にチェックを入れます。
保存 をクリックします。これで、OAuth2アプリケーションにAdmin User APIカテゴリの読み取り権限が付与されました。
-
次に、 Global Menu( Global Menu ) を開き、 Control Panel タブをクリックし、 System Settings → Security Tools に進みます。
-
[Portal Cross-Origin Resource Sharing (CORS)] タブに移動し、[Default Portal CORS Configuration] をクリックします。
-
値
/o/headless-admin-user/*
の URL パターン を追加し、 保存 をクリックします。これで、headless-admin-user
カテゴリのAPIに対してCORSが有効になる。
サンプルReactアプリのデプロイ
-
OAuth2 React App をダウンロードして解凍します。
-
node
とyarn
がインストールされていることを確認します。 そうでない場合は、セットアップスクリプトを実行し、プロンプトに従います。 -
アプリのルート・ディレクトリに移動し、Reactサーバーを起動する。
認証コードのフロー
認証コードフローでは、アプリケーションに権限を与える前に、ユーザーが認証情報でログインし、認証を承認する必要があります。 他のフローでは、この追加ステップを回避することができます。
-
http://localhost:3000で動作しているReactアプリを開き、ページ上部の Authorization Code Flow をクリックします。
-
Liferay authorize URL には
http://localhost:8080/o/oauth2/authorize
と入力します。 クリップボードからクライアントIDを貼り付けます。 [Authorize] をクリックします。 -
まだログインしていない場合、認証ページに移動する前にLiferayのログインページにリダイレクトされます。 ユーザー名とパスワード(例: test@liferay.com:learn)を入力し、 [サインイン] をクリックします。 認証ページで、 [認証する] をクリックします。 すでにログインしている場合は、認証ページに直接送られます。
Reactアプリにリダイレクトされます。 次のAPIコールに使用される認証コードが表示されることに注意。
-
Liferay トークンの URL には
http://localhost:8080/o/oauth2/token
と入力してください。 クライアントIDとクライアントシークレットをクリップボードから貼り付けます。 [Get Token] をクリックします。 今後のREST API呼び出しに使用できる認証トークンが表示されることに注意。 -
Liferay get user URL には
http://localhost:8080/o/headless-admin-user/v1.0/user-accounts
と入力します。 Get Data をクリックする。 React アプリは、トークン・ベースの認証を使用してLiferayにREST API呼び出しを行い、Liferayユーザーのリストを返します。
クライアント認証情報フロー
クライアント認証情報フローは、通常、サーバー間のやり取りに使用され、ユーザーは関与しません。
-
http://localhost:3000で実行中のReactアプリを開き、ページ上部の [Client Credentials Flow] をクリックします。
-
Liferay トークンの URL には
http://localhost:8080/o/oauth2/token
と入力してください。 クライアントIDとクライアントシークレットをクリップボードから貼り付けます。 [Get Token] をクリックします。 今後のREST API呼び出しに使用できる認証トークンが表示されることに注意。 -
Liferay get user URL には
http://localhost:8080/o/headless-admin-user/v1.0/user-accounts
と入力します。 Get Data をクリックする。 React アプリは、トークン・ベースの認証を使用してLiferayにREST API呼び出しを行い、Liferayユーザーのリストを返します。
パスワードフロー
パスワードフローの認証では、Reactアプリはユーザー名とパスワードをリクエストで直接渡します。
パスワードフローでは、ユーザー名とパスワードはアプリケーションに直接公開されます。 そのため、ユーザーはアプリケーションを信頼する必要があります。 APIリクエストでユーザー名とパスワードを渡すこともリスクを伴います。 パスワードフローを使用することは推奨されません。
-
http://localhost:3000で実行中のReactアプリを開き、ページ上部の [Password Flow] をクリックします。
-
Liferay トークンの URL には
http://localhost:8080/o/oauth2/token
と入力してください。 -
クライアントIDとクライアントシークレットをクリップボードから貼り付けます。
-
ユーザー名とパスワードを入力してください(例: test@liferay.com:learn)。
-
[Get Token] をクリックします。 今後のREST API呼び出しに使用できる認証トークンが表示されることに注意。
-
Liferay get user URL には
http://localhost:8080/o/headless-admin-user/v1.0/user-accounts
と入力します。 Get Data をクリックする。 React アプリは、トークン・ベースの認証を使用してLiferayにREST API呼び出しを行い、Liferayユーザーのリストを返します。
コードを調べる
Reactアプリの components
フォルダには、ボタンをクリックすることで発生するイベントを処理するためのUI要素とロジックが定義されています。 例えば、 Authorize.js
ファイルは認証ページにリダイレクトし、 Token.js
はアクセストークンを取得し、 Users.js
はユーザーのリストを取得します。 各認証フローは、これらのコンポーネントの一部または全部を使用する。
認証トークンを取得するAPIリクエストとGETリクエストは、 utils
フォルダ内の Requests.js
ファイルで定義されています。
認証許可タイプ
grant-type-authorization-code
フローの AuthorizationCode.js
ファイルは、3つのコンポーネント(Authorize.js
、 Token.js
、 Users.js
)をすべて使用する。
コードでは、 Authorize.js
コンポーネントが最初のステップを処理する。 [Authorize] ボタンをクリックすると、認証要求が行われます。
リダイレクトと同時に、ワンタイム認証コードがURL内でアプリに引き渡されます(例: http://localhost:3000/grant-type-authorization-code?code={code}
)。
Token.js
コンポーネントが次のステップを処理する。 [Get Token] をクリックすると、 Requests.js
ファイル内の getAuthToken
関数が呼び出されます。
Token.js
コンポーネントでは、パラメータ client_id
、 client_secret
、 code
、 grant_type
、 redirect_uri
がこのAPIリクエストで送信される。 パラメータが有効であれば、Liferayはアクセストークンを含むJSONレスポンスを返します。
応答例:
Users.js
コンポーネントは、 access_token
のレスポンスを解析する。
最後に、 Get Data をクリックすると、 Requests.js
ファイル内の getUsers
関数が呼び出される。
クライアント認証情報許可タイプ
grant-type-client-credentials
フローの ClientCredentials.js
ファイルは、2つのコンポーネント(すなわち Token.js
と Users.js
)を使用する。
Token.js
コンポーネントでは、パラメータ client_id
、 client_secret
、 grant_type
がAPIリクエストで送信される。 パラメータが有効であれば、Liferayはアクセストークンを含むJSONレスポンスを返します。
Users.js
コンポーネントは、 access_token
のレスポンスを解析する。
最後に、 Get Data をクリックすると、 Requests.js
ファイル内の getUsers
関数が呼び出される。
パスワード許可タイプ
grant-type-password
フローの Password.js
ファイルは、2つのコンポーネント(すなわち、 Token.js
と Users.js
)を使用している。
Token.js
コンポーネントでは、パラメータ client_id
, client_secret
, grant_type
, password
, username
がAPIリクエストのパラメータとして送信される。 パラメータが有効であれば、Liferayサーバーはアクセストークンを含むJSONレスポンスを返します。
Users.js
コンポーネントは、 access_token
のレスポンスを解析する。
最後に、 Get Data をクリックすると、 Requests.js
ファイル内の getUsers
関数が呼び出される。