ユーザーが別の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')
こんにちは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)