web-dev-qa-db-ja.com

Flaskでトークン認証をどのように実装しますか?

ユーザーが別のWebサービスから自分のアカウントを使用して自分のFlaskアプリにログインすることを許可しようとしています。このWebサービスのapiにアクセスしてセキュリティトークンを受け取ることができます。使用方法このトークンを使用してユーザーを認証し、制限されたビューにアクセスできるようにしますか?

ユーザーを自分のデータベースに保存する必要はありません。セッションで認証するだけです。 Flask-Securityと@auth_token_requiredデコレータを使用してこれを実行できると思いますが、ドキュメントは非常に詳細ではなく、これを実装する方法がわかりません。

編集:

次にコード例を示します。

@main.route("/login", methods=["GET", "POST"])
def login():

    payload = {"User": "john", "Password": "password123"}
    url = "http://webserviceexample/api/login"
    headers = {'content-type': 'application/json'})

    #login to web service
    r = requests.post(url, headers=headers, json=payload)
    response = r.json()

    if (r.status_code is 200):
        token = response['user']['authentication_token']

        # allow user into protected view

    return render_template("login.html", form=form)


@main.route('/protected')
@auth_token_required
def protected():
    return render_template('protected.html')
12
Amerikaner

こんにちはAmedrikaner!

あなたのユースケースは私たちが自分で実装できるほど単純なようです。以下のコードでは、ユーザーセッションにトークンを保存し、新しいラッパーをチェックインします。独自のラッパーを作成することから始めましょう。私は通常、これらをwrappers.pyファイルに入れるだけですが、好きな場所に配置できます。

def require_api_token(func):
    @wraps(func)
    def check_token(*args, **kwargs):
        # Check to see if it's in their session
        if 'api_session_token' not in session:
            # If it isn't return our access denied message (you can also return a redirect or render_template)
            return Response("Access denied")

        # Otherwise just send them where they wanted to go
        return func(*args, **kwargs)

    return check_token

涼しい!

これでラッパーが実装されたので、トークンをセッションに保存できます。超シンプル。関数を変更してみましょう...

@main.route("/login", methods=["GET", "POST"])
def login():

    payload = {"User": "john", "Password": "password123"}
    url = "http://webserviceexample/api/login"
    headers = {'content-type': 'application/json'})

    #login to web service
    r = requests.post(url, headers=headers, json=payload)
    response = r.json()

    if (r.status_code is 200):
        token = response['user']['authentication_token']

        # Move the import to the top of your file!
        from flask import session

        # Put it in the session
        session['api_session_token'] = token

        # allow user into protected view

    return render_template("login.html", form=form)

これで、@ require_api_tokenラッパーを使用して、保護されたビューを次のように確認できます...

@main.route('/super_secret')
@require_api_token
def super_secret():
    return "Sssshhh, this is a secret"

[〜#〜] edit [〜#〜]すごい!アプリの構成でSECRET_KEYを設定する必要があることを忘れていました。

SECRET_KEY = "SOME_RANDOM_STRING"を含むconfig.pyファイルで十分です。次に、それをロードします...

main.config.from_object(config)
18
F Boucaut