ご無沙汰しております。arika79です。
以前、スクラム開発の実践記録を投稿しましたが、新たに参画した案件で、認証・認可の仕組みが求められるAPIの開発を行いました。今回は、その実装についてご紹介しようと思います。
APIにユーザー認証機能を導入する際、独自で認証・認可の仕組みを構築するのは大きな手間がかかり、特にセキュリティ面での課題が懸念されます。こうした問題を解決する手段として、AWSのCognitoを活用する方法があります。Cognitoを利用すれば、ユーザー認証のインフラを手軽に整備できるだけでなく、AWSのセキュリティ基準に基づく信頼性の高い環境を構築できます。
さらに、Cognitoにはユーザーグループの機能があり、これを活用することで、利用するAWSサービスごとにユーザー権限を細かく管理することも可能です。この機能により、サービスの運用における権限管理が効率化されるだけでなく、セキュリティポリシーをより柔軟に設計することができます。
具体的な認証のプロセスについては、CognitoがIDとパスワードを元に認証トークンを発行します。このトークンをAPIリクエストに含めることで、リクエストを受け取ったAPIは簡単に認証状態を検証できます。このようなトークンベースの認証は、処理の効率化やセキュリティ強化に寄与する点で非常に優れています。
トークンには基本的に3種類あります。
- IDトークン(id_token) : 主にユーザーの認証情報を取得するために利用され、今回の認証にもこちらを用います
- アクセストークン(access_token) : ユーザーの情報やパスワードの変更などに用いられます。
- リフレッシュトークン(refresh_token) : 上記の2つのトークンの更新に用いられます。
このIDトークンの有効性を確認することで、独自に複雑な認証機構を構築する必要がなくなり、効率的にAPI開発を進めることができます。
有効性の確認は一般的にAPIのミドルウェアに実装されることが多いかと思いますが、この処理をAWSのAPI Gatewayを活用することで、より簡単かつ効率的に実現できます。API Gatewayは、トークンの検証を自動的に行う設定が可能であり、認証にかかるコードの記述を最小限に抑えられます。このように、API Gatewayを用いることで開発の負担を軽減しつつ、安全で柔軟な認証機構を実装することができます。
CognitoとAPI Gatewayを活用した具体的な構成と設定方法を紹介していきます。
構成は以下のようになります。
Cognitoで認証済みのユーザーがヘッダーを用いて認証情報を付与し、API Gatewayに対してリクエストを送ります。その後、認証情報が正しいかをCognitoで判定した後に、許可されたもののみAPI Gatewayを経由してLambdaなどのエンドポイントと連携されているサービスを呼び出し、ユーザーへレスポンスを返却します。
Cognitoで認証されたユーザーは、ヘッダーに認証情報を付与してAPI Gatewayに対してリクエストを送信します。このリクエストは、Cognitoが認証情報が正しいかを判定した後、認証が成功した場合のみ処理が進みます。認証が許可されると、API Gatewayを通じてLambdaなどのエンドポイントと連携しているサービスが呼び出され、適切なレスポンスがユーザーに返却されます。
構成図に示している ①〜③について、具体的な設定は以下の通りです。
オーソライザーはCognitoでユーザープールを選択します。トークンのソースはヘッダーで認証情報を載せるキーを指定します。
その後の④〜⑥の処理は、トークンの有効性が確認された場合にのみ実行されます。有効性が確認されない場合、リクエストはLambdaなどのサービスに到達することなく、API Gatewayが自動的にHTTPステータスコード401(Unauthorized)を返します。また、エラーメッセージや詳細なレスポンス内容は、API Gatewayの設定でカスタマイズが可能です。これにより、セキュリティを確保しつつ柔軟なエラーハンドリングを実現できます。
以上となります。
設定としては非常にシンプルで、認証があっという間に実装できてしまうなーという印象でした。ですが、正直なところ、API側でトークンを使ってユーザーIDを取得するなど、結局トークンを活用した処理が必要になってくるんですよね。そうなると、いっそのこと最初から認証機構自体を全部自分で作ってしまったほうがいいのかも?なんて思ったりもしました。もちろん、この設定が手軽に導入できるという点では魅力的なんですが、やっぱりケースバイケースなのかなーという気がします。
いかがだったでしょうか。API開発をしていると、つい後回しになりがちなのが認証の部分ですよね。でも、Cognitoを使うなら、API Gatewayを前段に置いて認証を任せてしまう方法もおすすめです。このやり方を採用すれば、認証周りの手間をぐっと減らせるので、他の開発に集中しやすくなると思います。ぜひ試してみてください!
AWS環境の構築でお困りの方はご相談ください!