🔐

GolangとHonoでOIDC認証機能を実装する

に公開

はじめに

golangでpotetoというwebフレームワークを作っています。今回は、OIDC認証の実装で役に立つミドルウェアを導入しました。

https://github.com/poteto-go/poteto

また、OAuth Clientの作成については細かく扱いません。以下のページを見れば特に詰まることなく設定できると思います。
https://cloud.google.com/endpoints/docs/frameworks/java/creating-client-ids?hl=ja#web-client

OIDC認証

今回開発したOIDC認証アプリのレポジトリ
https://github.com/poteto-go/poteto-oidc-exmaple

このアプリのOIDC認証の流れは以下のようになっています。

1. 認可リクエスト

まずアプリユーザーがGoogleへのログインを認可し、IDPであるGoogleが認証を行います。この際に、cookieにランダム文字列(state)を登録し、後に確認することでCSRF攻撃を防ぎます。

コールバック先ではまずstateを検証し、その後にqueryパラメータから認可コードを取得します。そして、認可コードをバックエンドに投げ、認証トークンリクエストを行います。

2. 認証トークンの取得

バックエンド側で、認可コードをIDPに投げ、認証トークンを取得し、フロントに返します。これにより、クライアントシークレットをバックエンドの管理にすることができ、より安全です。実際には今回のhonoの使い方でもクライアント側にもれないかもですが、、、(詳しくないので、安全に倒しました。)

3. 認証

フロント側は、取得したid_tokenを使ってバックエンドにリクエストを送ります。このid_tokenはjwtになっていて、idpissuer,user_mailなどの情報が含まれています。これを検証することによって、OIDCでは認可だけでなく、認証が可能になります。

3.1 JWTの署名検証

バックエンド側のLoginエンドポイントでは、OIDCに関するmiddlewareを定義しています。
このミドルウェアの中では、以下の2つが行われます。

  • JWTのデコード
  • 登録したURLから公開鍵を取得し、JWTの署名を確認する

この2つを簡単に行うことができ、OIDCの実装を楽にします。

3.2 Claimsの検証

最後にデコードされたclaimsを検証します。今回はクライアントID、Issuer、有効期限、mailが有効かどうかをチェックしました。

今回は検証までですが、検証ができたらユーザー情報を保存などして、アプリの機能に紐付けることができます。

参考

https://zenn.dev/uma002/articles/51b80fb2b7b108

Discussion