使用 Flask API 从网站检索令牌值并存储令牌值

如何解决使用 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 非常相似,但有更多的配置选项和更多的功能。例如,它允许令牌刷新。

工作流程应如下所示:

  1. 用户通过适当的 rest 调用登录,如果凭据正确,则创建 JWT 并将其返回给客户端,客户端负责将其保存在本地并在后续调用中重复使用
  2. 对于所有需要身份验证的后续调用,客户端将负责在 HTTP 请求标头中指定 JWT
  3. 接收调用的服务器端负责推断令牌的内容(验证它是否有效),以获取必要的信息。

来自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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?