雑記帳

整理しない情報集

更新情報

OAuth2-Proxyをリダイレクトで使ってみた

公開日:

カテゴリ: ソフトウェア

認証プロキシソフトウェアのOAuth2-Proxyを、リバースプロキシでアプリ内のパスに展開するのではなく、OAuth2-Proxy自体へのリダイレクトで使ってみました。

ご注意

この記事ではドキュメントに載っていない方法を使用しています。そもそもメリットも薄いので、実行される場合は自己責任でお願いいたします。

(そもそも筆者自身、この方法のセキュリティ周りについてイマイチ自信がないです・・・)

概要

OAuth2-ProxyはURLパラメータにrd=[URL]を指定することで、認証後のリダイレクト先URLを指定できるようです。つまりOAuth2-Proxyをサーバとして公開し、認証したいアプリからOAuth2-Proxyへパラメータ付きでリダイレクトすることで認証できます。

特徴

  • 認証サーバのURLを固定できる
    • OAuth2認証のコールバックURLを統一できる
  • 指定したドメインレベルで認証が通るので注意

やってみる

前回の記事をベースに設定をいじっていきます。今回はOAuth2-Proxyサーバをoauth2.example.comに構築します。まずはOAuth2-Proxyの設定ファイルから。

cookie_domains = ".example.com"
whitelist_domains = [".example.com"]

cookie_domainsにCookieのドメインを指定します。指定しない場合はoauth2.example.com以外で認証Cookieが使えません。スコープが広がるので配下のサブドメインに脆弱なアプリが無いようにしましょう。

whitelist_domainsにはリダイレクト先のドメインを指定します。ここに載っていないドメインをrdパラメータで指定しても無視されます。

次にnginxの設定です。

server {
	listen 443 ssl;
	server_name oauth2.example.com
	# HTTPS鍵などは省略

	location / {
		proxy_pass http://oauth2:4180;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
	}
}

server {
	listen 443 ssl;
	server_name app.example.com
	# HTTPS鍵などは省略

	location = /oauth2/auth {
		auth_request off;
		proxy_pass http://oauth2:4180;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-Uri $request_uri;
		proxy_set_header Content-Length "";
		proxy_pass_request_body off;
	}

	location / {
		auth_request /oauth2/auth;
		error_page 401 =302 https://oauth2.example.com/oauth2/sign_in?rd=$scheme://$host$request_uri;

		# ...
	}
}

ポイントは以下の3点です。

  • OAuth2-Proxyをサーバとして公開
  • アプリ側に認証確認のエンドポイント(/oauth2/auth)をマウント
  • auth_requestの結果が401の場合はOAuth2-Proxyへrdパラメータに現在のURLを追加して302リダイレクト

おわり

だいぶゴリ押し感の強い手段ですが、認証サーバのURLを一本化できるのでアプリが増えるたびにIdPの管理コンソールに行かなくて済むのは、個人開発レベルでは便利です。

カテゴリ: ソフトウェア