GolangとHonoでOIDC認証機能を実装する
はじめに
golangでpotetoというwebフレームワークを作っています。今回は、OIDC認証の実装で役に立つミドルウェアを導入しました。
また、OAuth Clientの作成については細かく扱いません。以下のページを見れば特に詰まることなく設定できると思います。
OIDC認証
今回開発したOIDC認証アプリのレポジトリ
このアプリのOIDC認証の流れは以下のようになっています。
1. 認可リクエスト
まずアプリユーザーがGoogleへのログインを認可し、IDPであるGoogleが認証を行います。この際に、cookieにランダム文字列(state
)を登録し、後に確認することでCSRF攻撃を防ぎます。
コールバック先ではまずstate
を検証し、その後にqueryパラメータから認可コードを取得します。そして、認可コードをバックエンドに投げ、認証トークンリクエストを行います。
2. 認証トークンの取得
バックエンド側で、認可コードをIDPに投げ、認証トークンを取得し、フロントに返します。これにより、クライアントシークレットをバックエンドの管理にすることができ、より安全です。実際には今回のhonoの使い方でもクライアント側にもれないかもですが、、、(詳しくないので、安全に倒しました。)
3. 認証
フロント側は、取得したid_token
を使ってバックエンドにリクエストを送ります。このid_token
はjwtになっていて、idp
やissuer
,user_mail
などの情報が含まれています。これを検証することによって、OIDCでは認可だけでなく、認証が可能になります。
3.1 JWTの署名検証
バックエンド側のLogin
エンドポイントでは、OIDCに関するmiddlewareを定義しています。
このミドルウェアの中では、以下の2つが行われます。
- JWTのデコード
- 登録したURLから公開鍵を取得し、JWTの署名を確認する
この2つを簡単に行うことができ、OIDCの実装を楽にします。
3.2 Claimsの検証
最後にデコードされたclaimsを検証します。今回はクライアントID、Issuer、有効期限、mailが有効かどうかをチェックしました。
今回は検証までですが、検証ができたらユーザー情報を保存などして、アプリの機能に紐付けることができます。
参考
Discussion