KMC活動ブログ

京大マイコンクラブの活動の様子を紹介します!!

Lambdaでもnginx_omniauth_adapterを使いたい!

こんにちは

菜々(id:nna774)です。 たまたま趣味のコードを書き終えたら、KMCブログリレーが行なわれていたので、にぎやかしに書きます。

blog.kmc.gr.jp

みなさんはnginx_omniauth_adapterを使っていますか? KMCではinside.kmc.gr.jpの認証のバックエンドに使っているので、部員のみなさんは間接的に使っています。 雑にnginxで認証したい みたいな時に便利です。 個人的にも使っています。 みなさんもきっと使っていることでしょう*1

みなさんはAWS Lambdaは使っていますか? 私は便利cgi-binとして1枚のlambdaをよく書きます。

ある日

Lambda, API Gatewayのdocumentを読んでいると、contextをうまく扱えばGoでhttp Handlerを書けば動くものができるのではないか という気持ちになり、書いてみようかと思ったのですが、書く前にGoogle検索をしたところ、akrylysov/algnhsaが既に存在していました。 よさそうです。

これを使ってappを書いてみるのですが、ある所で認証機能が欲しくなってきます。 API Gatewayにはオーソライザという機能があります。 その中の1種類としてLambdaオーソライザというものがあり、一言で言うとLambdaの返り値で認証成功か失敗を返せる機能です。

認証はいつも使っているnginx_omniauth_adapterの機構に乗せたいという気持ちになりました。

つまり、nginx_omniauth_adapterに対応した挙動をするLambdaオーソライザを書けば良いのでは という気がしてきます。

というわけでできたのがこちらです。

github.com

くわしく

nginxの行うinternal requestに相当することをしてやれば良いだけです。 以下は設定例を見ながら読んでください。

auth_request /_auth/challenge 相当のことがAPI GatewayのAuthorizersの働きなので、auth_adapter/testへリクエストを送り、認証が成功した場合はユーザの情報を返し、失敗した際はerror_page 401 = /_auth/initiate;相当のレスポンスを返します。 つまり、認証ページにリダイレクトします。

GatewayResponsesをセットしますが、ACCESS_DENIEDな時は普通にやればいいのですが、API Gatewayくん、AuthorizersIdentityHeaders Cookieの設定を入れている時にcookieのついていないリクエストが飛んでくるとLambda オーサライザまでリクエストが渡らずに401が返るような挙動をしている気がするんですが?? これどうなってるんですか?? 詳しい人教えてください!!!

気をとりなおして/_auth/callback ですが、これはinternal requestではないので、認証を受ける側のappに生やす必要があります。これはほとんど定形なので、用意しておきました。

というわけでめでたくLambdaでnginx_omniauth_adapterの認証を使えるようになりました! 詳しく知りたい人はレポジトリのREADMEやソースコードを読んでください。

で、正気?

動いたけど、正気か……?

GCPのApp Engineに出してIAPとかで認証したほうがいいと思います*2

でも書けそうな気がしたので書いてみました。是非御活用ください。

いかがでしたか?

最後まで見てくれてありがとうございます! チャンネル登録高評価、よろしくお願いします! 関連動画も是非!

*1:oauth2-proxyとかのほうが使われてるとこよく見る気もしますが……。

*2:一部だけ認証とかはできないけど……。