API Gatewayを通してBasic認証を使う方法
課題
今回は、単純なFlaskのAPIアプリを作って、全世界に公開したくないので、単純なユーザ・パスワード認証(BasicAuth)をかけたいなと思いました。
ZappaというAWS LambdaにDeployできるフレームワークを使って、Flaskのアプリは、AWS上にすぐにDeployとAPIの確認ができました〜。
APIには、プログラムからBasicAuthに必要なヘッダーを付けておけば無事にAPIとの通信ができました。
pythonのrequestsを使って、API叩く例:
from requests.auth import HTTPBasicAuth
requests.get('https://api.example.com/', auth=HTTPBasicAuth('user', 'pass'))
HTTPヘッダー例:
GET /private/index.html HTTP/1.1
Host: example.com
Authorization: Basic ABCEF1234567890abcdef
ただし、開発者が簡易にAPI参照できるように、OpenAPI(swagger)表示できるページも用意しました。
そこでブラウザから、ページをアクセスしてみると。。。ダメだ。
モダンブラウザは、BasicAuthのログインをダイアログをだしてくれるのですが、出てこない様子。
どうにか、API Gatewayから返される401 Unauthorized
のレスポンスヘッダーには、必要なWWW-Authenticate: Basic
がないようです。
確認すると、Flask側から正しくWWW-Authenticate: Basic
を返しているようですが、APIGatewayがそのヘッダーを消しているっぽい。
さって、API Gatewayからは、ブラウザのログインダイアログが表示されるように、401 Unauthorized
のレスのヘッダーにWWW-Authenticate: Basic
を付けるようにしましょう。
HTTP/1.1 401 Authorization Required
Date: Wed, 11 May 2005 07:50:26 GMT
Server: Apache/1.3.33 (Unix)
WWW-Authenticate: Basic realm="SECRET AREA"
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1
対策方法
もうしかして、UnauthorizedApiGatewayResponse
だけでいくかなと思うのですが、今回は、FlaskのRequestへ流す前、CUSTOM Authorizerを導入して、BasicAuthヘッダーを確認するようにしています。
BasicAuth用の設定と関数のリポジトリにまとめたので、既存のAPIGateway(rest-api)により楽にBasicAuthを追加することができたかと思います。ここまでくるには、色々大変だったのですが、この手順で10分以内にほしいBasicAuth設定が終わるだろう。
-
リポジトリ取得:
git clone https://github.com/monkut/lambda-basicauth-authorizer.git
-
環境準備(完全にAWSCLIでの用意は可能かと思うのですが、一部はBOTO3で書いちゃいました):
# pipenvでpython環境を用意 pipenv install
-
環境変数を設定、CUSTOM Authorizerの関数を置いて、既存ApiGatewayのrest-apiを更新:
RESTAPI_IDは、既存のものからこのコマンドで取得:
aws apigateway get-rest-apis
PROJECTID
は、ユニーク性を保つためのものだけです(なんでも良い)export AWS_PROFILE={my profile} export BASIC_AUTH_USERNAME={YOUR USERNAME} export BASIC_AUTH_PASSWORD={YOUR PASSWORD} export PROJECTID={YOUR PROJECT IDENTIFIER} export RESTAPI_ID={既存のRESTAPI ID} # CUSTOM Authorizer用のBucketを用意 make createfuncbucket # CUSTOM Authorizerの関数をDeployして、既存のREST-APIにインストール make deploy make install
これで、APIだけじゃなくて、ユーザ(人間)がブラウザ経由でUSER/PASSのログインできるようになりました〜
FlaskにBasicAuth処理を残すちゃいば、ちょっと重複するのですが、BasicAuthなので、残っていても大した処理時間がかからないだろう。
最近、BasicAuthを使って、zappa と組み合わせて、開発用のDUMMY APIを提供したりしています。
Author And Source
この問題について(API Gatewayを通してBasic認証を使う方法), 我々は、より多くの情報をここで見つけました https://qiita.com/monkut/items/3889ed3d4f12dc265c98著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .