手っ取り早くウェブアプリケーションにOAuth2認証を導入する
bitly/oauth2_proxyを用いて,ウェブアプリケーションに手っ取り早くOAuth2認証を導入するという話です.
oauth2_proxyは良い感じでOAuth2による認証を肩代わりしてくれる君で,何らかのリバースプロキシの認証機構と組み合わせて利用すると簡単にOAuth2ログインを実現することができます.
今回は例としてKibanaにGoogleのOAuth2ログインを導入してみたいと思います.
構成
- Kibana
- bitly/oauth2_proxy
- nginx
+------+ +-------+ +--------------+ +--------+ | | | | ----auth----> | | | | | user | --request--> | nginx | | oauth2_proxy | <--auth--> | Google | | | | | <--response-- | | | | +------+ +-------+ +--------------+ +--------+ | access | v +--------+ | | | kibana | | | +--------+
流れ
事前準備
https://console.developers.google.comにアクセスしてcredentialsを作り,Client IDとClient secretを取得します.この時,Authorized redirect URIs
にリダイレクト先のURLを登録しておきます (e.g. https://kibana.example.com/oauth2/callback
).
実際に動くサンプル
docker-composeで実際に動くものを示します.
nginx.conf
auth_request
ディレクティブでOAuth2認証を有効にしています.あとの部分は読むとだいたいわかると思います.このnginx.confの内容については以下の記事が詳しいです (というかパクりました,ありがとうございます).
docker-compose.yml
<>
で囲われた部分については適宜書き換える必要があります.client-id
及びclient-secret
にはあらかじめ作成しておいたcredentialの内容を入れます.
ここで利用されているhttps-portalはLet's Encryptを利用してSSL/TLS証明書の取得を自動化しつつSSL終端してくれるコンポーネントです.これ利用している理由はGoogleのOAuth2認証がリダイレクトしてくる時にhttpsを利用するからです.もしnginxの側でSSL/TLS化してる場合や,ELB等の上流でSSL終端している場合などは不要です.
なお,STAGE: 'local'
と記述しておくとLet's Encryptは利用せずにオレオレ証明書を利用するモードになるのでローカルでの検証等で便利です.つまり本番で使ってはならない.本番運用時にはSTAGE: 'production'
などと記述する必要があるでしょう (ドキュメントを参照のこと: https://github.com/SteveLTN/https-portal).
docker-copose up
してアクセスするとこんな感じで動きます (kibana.example.com
をそのまま利用する場合はhosts等を適宜書き換えておく必要があります).
Googleのログインページが開き,適宜やっていくと
という感じでKibanaが開きます.便利便利.よかったですね.