React×Spring Bootな構成をAWS Fargateで動かす(4) ~ 認可機能の追加

バックエンドAPIに認可を実装する

第4回となる今回は、前回作成したSpring BootのバックエンドAPIにSpring Securityを使用して、認可機能を実装していこうと思います。
これにより、Cognitoで認証に成功したユーザーだけがこのAPIを実行できるようになります。
ちなみに前回の記事はコチラ。

React×Spring Bootな構成をAWS Fargateで動かす(3)

Spring Securityの有効化

前回作成したバックエンドAPIは誰からでも実行できる状態でしたので、ここにSpring Securityを入れてセキュリティを高めていきます。
といってもやることはシンプル。
pom.xmlに以下のような依存関係を追加するだけです。

保存したら、一度Postmanから実行してみましょう。


はい!バッチリ拒否されました!

リソースサーバーの設定

Spring Securityで認可を実装するために、リソースサーバーを設定し、使用します。
リソースサーバーとは、OAuth2やOpenID Connectといったプロトコルを使用して、クライアントアプリケーションにリソース(例: APIやデータ)を提供するサーバーを指します。
おおまかに認可の流れをシーケンス図としてMermaid形式で出力してみました。

リソースサーバーは認可サーバーであるCognitoから発行されたアクセストークンを検証し、そのトークンが有効であるか、適切な範囲や権限を持っているかを確認します。
その上で、保護されたリソースまたはAPIエンドポイントへのアクセスを許可します。
Spring Securityのリソースサーバーの設定をするには、application.ymlに以下のようにsecurityのエントリを追加します。

jwk-set-uriは、Cognitoユーザープールのトークン署名キーURLに相当するもので、ユーザープールの概要からも確認できます。
リージョンとユーザープールID以外は固定ですね。

これでリソースサーバーを参照することができたので、リクエストされたURIに応じてリソースサーバーを使用するコードを書いていきます。
configパッケージを右クリックして、New Java FileClass…を選択してSecurityConfigクラスを作成してください。

CSRFは無効化した上で、ヘルスチェック用URL以外のリクエストは認可が必要となるように設定しているコードになっています。
これに合わせてここでヘルスチェック用のエンドポイントも作成しておきましょう。
controllerパッケージを右クリックして、New Java FileClass…を選択してHealthCheckControllerクラスを作成してください。

ローカルでの実行時に環境変数COGNITO_USERPOOL_IDを設定するためにlaunch.jsonを編集します。
先ほどのシーケンス図の通り、リソースサーバーはCognitoのトークン署名キーURLにアクセスするので、ローカル環境がプロキシ経由でインターネットにアクセスしている場合は、ここで合わせてVM引数にプロキシの設定もしておきましょう。

一旦ここでSpring Bootのプロセスを再起動しておきましょう。

フロントエンドからの呼び出し

まずはそのままフロントエンドから呼び出したらどうなるでしょうか?

HTTP 401 Unauthorisedではじかれました。
まだアクセストークンを含んでいないリクエストなので、正しい動きと言えそうです。
それでは、前回作成したフロントエンドの呼び出しにCognitoから取得したアクセストークンをセットすることで認可機能付きのAPIを呼び出せるようにします。
具体的には、Amplify AuthのfetchSession()を呼び出して返ってきたトークンからアクセストークンを取り出し、AuthorizationヘッダにBearerトークンをセットします。
App.tsxのgeneratePasswordを以下のように書き換えてください。

これで無事に認可機能付きのREAT APIをReactのフロントエンドから呼び出すことができるようになりました😆

Spring SecurityにCORS設定を集約

このままでもいいのですが、CORSの設定を前回作成したWebConfigからSecurityConfigにまとめるやり方のほうが一般的(?)のようです。
SecurityConfigクラスを以下のように書き換えて、WebConfigクラスとはバイバイすることもできます。

こちらのコードでも呼び出すことができました😆
が!ここで第1回で書いていた構成上の問題に気付いてしまいました・・・

 

次回はそれについて書きたいと思います!
それでは、また次回に👋


シリーズ記事

お問い合わせ先

執筆者プロフィール

Hayakawa Masafumi
Hayakawa Masafumitdi デジタルイノベーション技術部
昔も今も新しいものが大好き!
インフラからアプリまで縦横無尽にトータルサポートや新技術の探求を行っています。
週末はときどきキャンプ場に出没します。

関連記事