如何解决使用 Flask API 从网站检索令牌值并存储令牌值
所以我对烧瓶相当陌生,我目前正在尝试为我正在从事的项目创建烧瓶 api。但是,我面临着一些问题。
我似乎无法解决的第一个问题是试图在flask api中像python脚本/函数一样登录网站?我的想法是将我的用户凭据存储在单独的路径上并使用密钥(不希望其他用户知道凭据),但我不确定这是否是解决此问题的最佳方法。
我似乎无法解决的第二个问题是,在我登录网站后,如果可以通过点击下拉菜单来检索令牌,我如何或将如何检索令牌值?
我遇到的最后一个问题是存储此令牌的最佳选择是什么?我原本以为 Redis 会做,但我只是想知道是否有更好的方法。另外,我计划让这个flask api/python 服务在后台运行。
非常感谢任何帮助。
为了提供更多背景信息,我正在使用的网站在我检索令牌后一段时间后将我注销。
解决方法
管理登录的最佳方式是通过 json web token(JWT)。通过使用 JWT,无需保存任何令牌,因为您可以通过推断令牌的内容来获取管理用户所需的所有信息。
要使用 Flask 执行此操作,您可以使用 Flask-JWT 库,该库实现了管理 JWT 所需的所有功能,或者使用 Flask-JWT-Extended。 Flask-JWT-Extended 与 Flask-JWT 非常相似,但有更多的配置选项和更多的功能。例如,它允许令牌刷新。
工作流程应如下所示:
- 用户通过适当的 rest 调用登录,如果凭据正确,则创建 JWT 并将其返回给客户端,客户端负责将其保存在本地并在后续调用中重复使用
- 对于所有需要身份验证的后续调用,客户端将负责在 HTTP 请求标头中指定 JWT
- 接收调用的服务器端负责推断令牌的内容(验证它是否有效),以获取必要的信息。
来自Flask-JWT-Extended Basic Usage的示例:
from flask import Flask
from flask import jsonify
from flask import request
from flask_jwt_extended import create_access_token
from flask_jwt_extended import get_jwt_identity
from flask_jwt_extended import jwt_required
from flask_jwt_extended import JWTManager
app = Flask(__name__)
# Setup the Flask-JWT-Extended extension
app.config["JWT_SECRET_KEY"] = "super-secret" # Change this!
jwt = JWTManager(app)
# Create a route to authenticate your users and return JWTs. The
# create_access_token() function is used to actually generate the JWT.
@app.route("/login",methods=["POST"])
def login():
username = request.json.get("username",None)
password = request.json.get("password",None)
if username != "test" or password != "test":
return jsonify({"msg": "Bad username or password"}),401
access_token = create_access_token(identity=username)
return jsonify(access_token=access_token)
# Protect a route with jwt_required,which will kick out requests
# without a valid JWT present.
@app.route("/protected",methods=["GET"])
@jwt_required()
def protected():
# Access the identity of the current user with get_jwt_identity
current_user = get_jwt_identity()
return jsonify(logged_in_as=current_user),200
if __name__ == "__main__":
app.run()
HTTP 调用进行身份验证:
$ http POST :5000/login username=test password=test
HTTP/1.0 200 OK
Content-Length: 288
Content-Type: application/json
Date: Sun,24 Jan 2021 18:10:39 GMT
Server: Werkzeug/1.0.1 Python/3.8.6
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcmVzaCI6ZmFsc2UsImlhdCI6MTYxMTUxMTgzOSwianRpIjoiMmI0NzliNTQtYTI0OS00ZDNjLWE4NjItZGVkZGIzODljNmVlIiwibmJmIjoxNjExNTExODM5LCJ0eXBlIjoiYWNjZXNzIiwic3ViIjoidGVzdCIsImV4cCI6MTYxNDEwMzgzOX0.UpTueBRwNLK8e-06-oo5Y_9eWbaN5T3IHwKsy6Jauaw"
}
使用受保护端点的 HTTP 调用:
http GET :5000/protected Authorization:"Bearer <access_token>"
HTTP/1.0 200 OK
Content-Length: 24
Content-Type: application/json
Date: Sun,24 Jan 2021 18:12:02 GMT
Server: Werkzeug/1.0.1 Python/3.8.6
{
"logged_in_as": "test"
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。