こんにちは
菜々(id:nna774)です。 たまたま趣味のコードを書き終えたら、KMCブログリレーが行なわれていたので、にぎやかしに書きます。
みなさんは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オーソライザを書けば良いのでは という気がしてきます。
というわけでできたのがこちらです。
くわしく
nginxの行うinternal requestに相当することをしてやれば良いだけです。 以下は設定例を見ながら読んでください。
auth_request /_auth/challenge
相当のことがAPI GatewayのAuthorizersの働きなので、auth_adapter/test
へリクエストを送り、認証が成功した場合はユーザの情報を返し、失敗した際はerror_page 401 = /_auth/initiate;
相当のレスポンスを返します。
つまり、認証ページにリダイレクトします。
GatewayResponsesをセットしますが、ACCESS_DENIED
な時は普通にやればいいのですが、API Gatewayくん、Authorizers
のIdentity
にHeaders Cookie
の設定を入れている時にcookieのついていないリクエストが飛んでくるとLambda オーサライザまでリクエストが渡らずに401が返るような挙動をしている気がするんですが?? これどうなってるんですか?? 詳しい人教えてください!!!
気をとりなおして/_auth/callback
ですが、これはinternal requestではないので、認証を受ける側のappに生やす必要があります。これはほとんど定形なので、用意しておきました。
というわけでめでたくLambdaでnginx_omniauth_adapterの認証を使えるようになりました! 詳しく知りたい人はレポジトリのREADMEやソースコードを読んでください。
で、正気?
動いたけど、正気か……?
GCPのApp Engineに出してIAPとかで認証したほうがいいと思います*2。
でも書けそうな気がしたので書いてみました。是非御活用ください。
いかがでしたか?
最後まで見てくれてありがとうございます! チャンネル登録と高評価、よろしくお願いします! 関連動画も是非!
*1:oauth2-proxyとかのほうが使われてるとこよく見る気もしますが……。
*2:一部だけ認証とかはできないけど……。