使用 flask-jwt-extended + ariadne (graphql) + react 设置身份验证/授权

Posted

技术标签:

【中文标题】使用 flask-jwt-extended + ariadne (graphql) + react 设置身份验证/授权【英文标题】:Set up authentication/authorization with flask-jwt-extended + ariadne (graphql) + react 【发布时间】:2021-07-31 11:02:45 【问题描述】:

我正在尝试使用 flask_JWT_extended + ariadne(graphql) 为我的 react(nextjs) 应用程序创建一个身份验证系统。我已成功设置登录突变以检索访问和刷新令牌,但我不知道如何将它们正确集成到我的应用程序中。我知道访问令牌用于发出后续请求,刷新令牌用于保持令牌新鲜度,但我不知道如何使用此堆栈实现它。

mutations.py

这是我的登录突变,它返回 access_token 和 refresh_token。它工作正常。

@mutation.field("login")
@convert_kwargs_to_snake_case
def resolve_login(_, info, username, password):
    user = User.query.filter_by(username=username).first()
    if user and user.check_password(password):
        access_token = create_access_token(identity=username)
        refresh_token = create_refresh_token(identity=username)
        payload = 
            "user": user,
            "access_token": access_token,
            "refresh_token": refresh_token,
        
   
    return payload

core.py

这是我的 JWT 配置,根据我在网上收集的信息,我应该检查每个 api 请求上的令牌以保持其新鲜度,但我不知道如何做到这一点,尤其是使用 python + ariadne。这是一个使用 nodejs 实现它的人的链接:https://github.com/benawad/graphql-express-template/blob/22_advanced_jwt_auth/auth.js

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "postgresql://localhost/pinkle"
app.config["JWT_SECRET_KEY"] = "this_is_a_secret"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
JWTManager(app)

index.js

这是我的前端调用登录用户,它返回令牌,但我不知道在哪里使用令牌,或者我是否应该将其保存在客户端状态并使用令牌进行调用。

function login( username, password ) 
    axios
        .post('http://localhost:5000/graphql', 
            query: `mutation 
                login(username: "$username", password: "$password") 
                    user 
                        id
                        username
                        password
                    
                
            `,
        )
        .then(result => 
            console.log(result.data)
        )

【问题讨论】:

【参考方案1】:

Flask-JWT-Extended 文档包含使用 javascript 中的 JWT 的示例,这可能对您有所帮助:https://flask-jwt-extended.readthedocs.io/en/stable/token_locations/

【讨论】:

好的,所以我仔细研究了链接。我已经看到了,但我现在的问题是 ariadne 的令牌生命周期。使用 flask_extended_jwt 时,我可以获得 access_token 和 refresh_token。如何使用返回的令牌来验证对后端的请求?

以上是关于使用 flask-jwt-extended + ariadne (graphql) + react 设置身份验证/授权的主要内容,如果未能解决你的问题,请参考以下文章

使用flask-jwt-extended回调与flask-restful和create_app

get_jwt_identity() 在 Flask-JWT-Extended 中返回 None

flask-jwt-extended 库中的黑名单是不是有宽限期?

为 flask-jwt-extended 获取其他用户 jti

flask-jwt-extended TypeError:“函数”类型的对象不是 JSON 可序列化的

插件flask_jwt_extended