FalconのWebサービスを認証保護してみる
RESTful Webサービスの保護
Webサービスを認証により保護するための拡張モジュールが falcon-auth です。
falcon-authは次の認証をサポートしています。
HTTP Basic認証: BasicAuthBackend
HTTPプロトコルのBASIC認証を提供します。
トークンベース認証:BasicAuthBackend
単純なトークンベース認証を提供します。
JWT認証:JWTAuthBackend
JWT (JSON Web Token standard) 認証を提供します。
Hawk認証:HawkAuthBackend
Hawkによって定義されたHolder-Of-Key認証を提供します。`
ダミー認証:NoneAuthBackend
このバックエンドは認証チェックを実行しません。 認証されていないユーザーにフォールバックを提供するために、MultiAuthBackend と共に使用します。
マルチバックエンド認証: MultiAuthBackend
2つ以上の認証バックエンドを入力として受け取り、正常に処理するバックエンドのどちらかが成功した場合は認証し、それ以外の場合は falcon.HTTPUnauthorized の例外を発生させます。
インストール
falcon-authをインストールします。
code: bash
$ pip install falcon-auth
認証を追加
app.py に以下のコードを追加します。
code: python
from falcon_auth import FalconAuthMiddleware, BasicAuthBackend
# ...
def user_loader(username, password):
if (username in Allow_Users.keys() and
Allow_Usersusername'password' == password):
return username
else:
return None
auth_middleware = FalconAuthMiddleware(BasicAuthBackend(user_loader))
api = falcon.API(middleware=auth_middleware)
FalconAuthMiddleware() で認証を設定します。
引数のuser_loader() はユーザーとともに呼び出されるコールバック関数です。
Authorizationヘッダーから抽出された資格情報(ユーザー名とパスワード)と一致するユーザーが存在する場合は認証されたユーザーを返します。ユーザーが見つからないか資格情報が一致しない場合はNoneを返します。
このときキーワード引数excempt_routesに認証を除外するURLパス、exempt_methodsに認証を除外するHTTPプロトロルメソッドを指定します。
code: bash
$ curl -s -X GET http://127.0.0.1:8080/todo/api/v1.0/tasks | python -m json.tool
{
"title": "401 Unauthorized",
"description": "Missing Authorization Header"
}
code: bash
$ curl -s -u "freddie:queen" -X GET http://127.0.0.1:8080/todo/api/v1.0/tasks | python -m json.tool
{
"tasks": [
{
"title": "Buy Beer",
"description": "IPA 6 bottles",
"done": false,
"uri": "http://127.0.0.1:8080/todo/api/v1.0/tasks/1"
},
{
"title": "Buy groceries",
"description": "Beef, Tofu, Sting Onion",
"done": false,
"uri": "http://127.0.0.1:8080/todo/api/v1.0/tasks/2"
}
]
}
code: bash
$ curl -s -u "xxx:yyy" -X GET http://127.0.0.1:8080/todo/api/v1.0/tasks | python -m json.tool
{
"title": "401 Unauthorized",
"description": "Invalid Username/Password"
}