oauth2-proxyをwindowsで利用する




SNS系のログイン情報を使うにはoauth2-proxyにWebサーバ、もしくはapacheならmod_auth_openidcで受けるのがクラウドのサービスとかを使わないのであれば一般的、と調べた結果思った。
（Apacheのモジュールも新しいのが出ているのかもしれないが調べてない）

今回は受けが広そうなoauth2-proxyを試してみる。
※認証と認可が云々、oauthよりopenIDの方がとか、セッション維持の管理はここでは置いておく

## oauth2-proxy
仕組みは[この辺り](https://tech-blog.yayoi-kk.co.jp/entry/2019/11/18/150000)を見ると色々書いてある。

バイナリは
[https://github.com/oauth2-proxy/oauth2-proxy/releases](https://github.com/oauth2-proxy/oauth2-proxy/releases)
にある。
[この前](https://qiita.com/DiveMasakazu/items/3f5d2b1d85f45579600a)のnginxをwindowsで立ち上げたのと、事例が少なそうなのでWindowsでやってみる事にした。
oauth2-proxy-v7.1.3.windows-amd64.tar.gz
x64ではなくAMD64表記なのか、と思いつつダウンロードして7zipで展開。
とりあえずC:\temp\oauth2-proxy7に配置
拡張子を.exeにしてやってプロンプトからそのまま実行すると

```
C:\temp\oauth2-proxy7>oauth2-proxy
[2021/10/21 11:04:55] [main.go:54] invalid configuration:
  missing setting: cookie-secret
  provider missing setting: client-id
  missing setting: client-secret or client-secret-file
  missing setting for email validation: email-domain or authenticated-emails-file required.
      use email-domain=* to authorize all email addresses
```

と出るので設定ファイル等が足りない事が分かり、実行そのものは出来ていそうな雰囲気。

[Auth0](https://auth0.com/jp)が幅広く扱えるらしいが、とりあえず自分用テストなので今回は利用しない。

Linuxだと動作はoauth2_proxy.cfgというファイルを配置云々の記事は出ているが、Windowsの場合が分からないので
[公式ドキュメント](https://oauth2-proxy.github.io/oauth2-proxy/docs/)をとりあえず見ると
[起動パラメータ](https://oauth2-proxy.github.io/oauth2-proxy/docs/configuration/overview)が載っている。
パラメータでも色々指定可能だが、これで設定ファイルの場所を指定する事で動かすのが良さそう。

事前準備で[Google API Console](https://console.developers.google.com/)でoAuth2の設定を作成する。

 * 同意画面設定　でとりあえず外部で作成して必須項目を埋める
 * スコープはとりあえず空白
 * テストユーザはテストするアドレスを追加
 * OAuth クライアント ID の作成からウェブアプリケーションで追加
 * JavaScriptにURL、リダイレクトにURL/oauth2/callback 今回URLはlocalhost:8082にした

設定ファイルを書き換えて、oauth2-proxy --config=C:\temp\oauth2-proxy7\oauth2_proxy.cfg

```
## <addr>:<port> to listen on for HTTP/HTTPS clients
http_address = "127.0.0.1:4180"

## the OAuth Redirect URL.
redirect_url = "http://localhost:8082/oauth2/callback"

## the http url(s) of the upstream endpoint. If multiple, routing is based on path
upstreams = [
    "http://localhost:8082/"
]

## Authenticated Email Addresses File (one email per line)
authenticated_emails_file = "C:\\temp\\oauth2-proxy7\\authenticated_emails_file"

## Cookie Settings
cookie_name = "_oauth2_proxy"
cookie_secret = "secretcookietest"
```

authenticated_emails_fileにはログインに使うgmailのアドレスを記述

## nginx
nginx -V コマンドでhttp_auth_request_moduleが入っているかを確認。（入ってた）
locationに以下を設定してnginxを再起動、画面にアクセスするとoAuth2Proxyのログイン画面が出る。

```conf:nginx.conf
location / {
    auth_request /oauth2/auth;
    error_page 401 = /oauth2/sign_in;
    root   C:\inetpub\wwwroot;
    index  index.html index.htm;
}

location /oauth2/{
    proxy_pass http://127.0.0.1:4180;
    proxy_set_header Host                    $host;
    proxy_set_header X-Real-IP               $remote_addr;
    proxy_set_header X-Scheme                $scheme;
    proxy_set_header X-Auth-Request-Redirect $request_uri;
}

location = /oauth2/auth {
    proxy_pass       http://127.0.0.1:4180;
    proxy_set_header Host             $host;
    proxy_set_header X-Real-IP        $remote_addr;
    proxy_set_header X-Scheme         $scheme;
    # nginx auth_request includes headers but not body
    proxy_set_header Content-Length   "";
    proxy_pass_request_body           off;
}

```

Chromeでログインすると
cookie "_oauth2_proxy" not present, removing session
のエラー
Also, this problem appears only in Chrome. My app works fine when accessed with firefox, and no errors are being generated
のような報告が[ここ](https://github.com/oauth2-proxy/oauth2-proxy/issues/941)で上がっているので一旦IEで試すと
error performing request: Post "https://www.googleapis.com/oauth2/v3/token": dial tcp 142.250.206.234:443: i/o timeout
HTTPS_PROXYをセットするとエラーが変わって403で返ってきたので前進。
この状態でChromeで試すとページが表示出来た。IEはサポート外とすれば良いので、とりあえずWindowsでのnginxとの連携は出来た。


システムで使う場合にはユーザに応じたロールの取得が必要だが、独自で持っている場合はX-Forwarded-Userを利用していけそうなので時間があれば確認しておきたいところ。