OAuth2.0を使用したWeb APIコールを試す - OAuth2.0を使用したWeb APIコールを試す - aegif Labo Blog Liferay
null OAuth2.0を使用したWeb APIコールを試す
今回はLiferayのOAuth2.0エンドポイントを用いて、ブラウザとcurlからAPIの呼び出しまでを行ってみたいと思います。
使用するバージョン
今回はLiferay DXP 7.3.1を使用しました。ただしDXP 7.1以降では同様に動作すると思います。
OAuth2.0の概要
OAuth2.0とはリソース操作の認可についての標準です。 OAuthの仕組みを用いることで、ユーザが自身の使用するアプリケーションにユーザが保有するリソースアクセスを許可することができます。
最低限理解しておく登場人物は「リソースオーナー」「クライアント」「認可サーバ」、「リソースサーバ」です。
- リソースオーナーとはリソースの所有者で、OAuth2.0の認可プロセスでは権限をクライアントに認可(移譲)するユーザです。
- クライアントとは保護されたリソースにアクセスするアプリケーションです。今回はブラウザとcurlで代用します。
- 認可サーバは、リソースオーナーを認証し、アクセストークンを発行するサーバです。LiferayのOAuthのシナリオではLiferayが認可サーバとなります。
- リソースサーバとは保護されたリソースにアクセスするWeb APIを提供するサーバです。これも今回のシナリオではLiferayが担います。
OAuth2.0の詳しい説明はこちらの本などを参考にしてください。(簡単に読めてとてもわかりやすい書籍でしたのでおすすめです。)
LiferayのOAuthの2.0のフロー
Liferayの場合には以下のような認可フローとなります。(一般的なフローとの違いは認可サーバとリソースサーバが同一サーバである、というだけですね)
- (クライアント経由で)ユーザが認可サーバであるLiferayに対して認証・権限移譲の同意を行い認可コードを発行する。
- クライアントが認可サーバであるLiferayに対して発行された認証コードを用いてアクセストークンを取得する。
- クライアントが取得したアクセストークンを用いてリソースサーバであるLiferayに対しAPIコール
ブラウザとcurlから実際に試してみる
上に書いたフローを実際に試してみたいと思います。
Liferay側の準備
まずLiferayのコントロールパネルの「OAuth 2 管理」から新規のアプリケーションを追加します。
アプリケーション名、WebサイトのURLは適当な値を入れてください。
コーロバックURIにはhttp://localhost:18080/callback等を入力します。
クライアントのプロフィールはデフォルトのWebアプリケーションのままでOKです。 作成したアプリケーションの編集画面に遷移すると以下のような画面が表示されるので、ここでクライアントIDとクライアントシークレットをコピーしておきます。
次に範囲(直訳ですね。英語だとRoleです)タブをクリックします。
ロールとして以下にチェックを入れます。これは使用したいAPIによって適切なものを選択します。
ここではコンテンツ配信の以下の2つにチェックを入れました。(実際にはeverythingやeverything.readを含んでいるのでreadは不要かもしれません。)
ブラウザ経由でアクセスし認可コードの取得
http://localhost:8080/o/oauth2/authorize?response_type=code&client_id=id-430b0a07-0f1e-b825-8c7b-861c4cb419&redirect_uri=http://localhost:18080/callback
にアクセスします。アクセスするとLiferayのログインスクリーンが表示されるのでユーザID/パスワードを入力して次に進むと権限を移譲するか確認する画面が表示されるので許可します。
アクセストークンの取得
ここからはcurlで操作します。
取得した認可コードをPOSTパラメータに指定して以下のようなリクエストをLiferayに投げます。
$ curl -d 'client_id=id-430b0a07-0f1e-b825-8c7b-861c4cb419' \
-d 'client_secret=secret-d64b78a5-5ac0-c071-48eb-b0f7fb8864' \
-d 'grant_type=authorization_code' \
-d 'code=8126737a71a2befa0a5c7b4e965ff25' \
-d 'redirect_uri=http://localhost:18080/callback' \
http://localhost:8080/o/oauth2/token
※クライアントID, クライアントSecretはそれぞれ環境の値に設定してください。
上記を実行すると以下のようなレスポンスが返却されます。access_tokenが返却されていることが確認できます。
{"access_token":"2614fe4cf3c0ae2960cd7586311d93583c0332c1224b38ea437f03ee82bbb68","token_type":"Bearer","expires_in":600,"scope":"Liferay.Headless.Delivery.everything Liferay.Headless.Delivery.everything.read","refresh_token":"e8ed71d25b2a6414133924988b294c63172da22b1d224472c15eb0d8b66364"}
APIの呼び出し
APIを呼び出すには、取得したアクセストークンをAuthorizationヘッダにBearerとして指定します。
$ curl -H "Authorization: Bearer 2614fe4cf3c0ae2960cd7586311d93583c0332c1224b38ea437f03ee82bbb68" \
-F "file=@sample.txt" "http://localhost:8080/o/headless-delivery/v1.0/sites/guest/documents"
{ "actions" : { ..skip.. },
"adaptedImages" : [ ],
"contentUrl" : "/documents/20121/0/sample.txt/983b0370-229a-6762-b3c7-a70c91766326?version=1.0&t=1610439946656",
"creator" :
{ "additionalName" : "",
"contentType" : "UserAccount",
"familyName" : "Test",
"givenName" : "Test",
"id" : 20125, "name" : "Test Test"
},
"customFields" : [ ],
"dateCreated" : "2021-01-12T08:25:46Z",
"dateModified" : "2021-01-12T08:25:46Z",
"description" : "",
"documentFolderId" : 0,
"documentType" :
{ "availableLanguages" : [ ],
"contentFields" : [ ],
"description" : "",
"name" : "基本ドキュメント" },
"encodingFormat" : "text/plain",
"fileExtension" : "txt",
"id" : 38124,
"keywords" : [ ],
"numberOfComments" : 0,
"relatedContents" : [ ],
"siteId" : 20121,
"sizeInBytes" : 4,
"taxonomyCategoryBriefs" : [ ],
"title" : "sample.txt" }
Liferayにアクセスして実際にドキュメントが登録されていることを確認してください。
その他のトピック
PKCE対応
今回は紹介しなかったですがLiferayではPKCEを用いた認可コードグラントにも対応しています。よりセキュアな認可フローとなるので実際にはPKCEを含むフローを使用したほうがよいと思います。
Postmanとの連携
PostmanからLiferay APIをOAuth2.0で呼びたい場合には、LiferayのOAuth 2 管理からアプリケーションのコールバックURIにPostmanで定義されているRedirect URI(https://oauth.pstmn.io/v1/callbackなど)をコールバックURIに追加しておく必要があります。
まとめ
簡単ですがLiferayのOAuth2.0認可機能を紹介しました。 Liferayの情報を集約するWebページやアプリを作る上では役立つ機能だと思いますのでぜひ試してみてください。