你如何在 Flask 中实现令牌认证?
How do you implement token authentication in Flask?
我正在尝试允许用户使用他们来自单独网络服务的帐户登录我的 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"
编辑
哇!我忘了说你需要在你的应用程序配置中设置你的 SECRET_KEY。
只需一个带有 SECRET_KEY="SOME_RANDOM_STRING" 的 config.py 文件即可。然后加载它...
main.config.from_object(config)
我正在尝试允许用户使用他们来自单独网络服务的帐户登录我的 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"
编辑 哇!我忘了说你需要在你的应用程序配置中设置你的 SECRET_KEY。
只需一个带有 SECRET_KEY="SOME_RANDOM_STRING" 的 config.py 文件即可。然后加载它...
main.config.from_object(config)