flask - Flask JWT GraphQL - 设置访问/刷新 cookie
问题描述
set_access_cookies/set_refresh_cookies 不保存 cookie 并抛出错误:
文件“/usr/local/lib/python3.8/site-packages/werkzeug/_compat.py”,第 202 行,在 to_bytes 中引发 TypeError(“预期字节”)
GraphQL 错误:
{
"errors": [
{
"message": "Expected bytes",
"locations": [
{
"line": 2,
"column": 3
}
],
"path": [
"auth"
]
}
],
"data": {
"auth": null
}
}
配置:
app.config['JWT_TOKEN_LOCATION'] = ['cookies']
app.config['JWT_COOKIE_CSRF_PROTECT'] = False
app.config['JWT_ACCESS_TOKEN_EXPIRES'] = datetime.timedelta(seconds=1800)
app.config['JWT_COOKIE_SECURE'] = False
app.config['JWT_REFRESH_TOKEN_EXPIRES'] = datetime.timedelta(days=15)
app.config['JWT_COOKIE_CSRF_PROTECT'] = True
app.config['JWT_ACCESS_CSRF_HEADER_NAME'] = "X-CSRF-TOKEN-ACCESS"
app.config['JWT_REFRESH_CSRF_HEADER_NAME'] = "X-CSRF-TOKEN-REFRESH"
auth_mutation.py:
class AuthMutation(graphene.Mutation):
access_token = graphene.String()
refresh_token = graphene.String()
resp = graphene.String()
class Arguments:
email = graphene.String(required=True)
password = graphene.String(required=True)
def mutate(self, info, password, email):
user = User.query.filter_by(email=email).first()
payload = user.uuid
if user and user.check_password(password):
access_token = create_access_token(identity=payload),
refresh_token = create_refresh_token(identity=payload)
resp = jsonify({'Login': True})
set_access_cookies(resp, access_token)
set_refresh_cookies(resp, refresh_token)
return AuthMutation(
access_token=access_token,
refresh_token=refresh_token,
resp=resp
)
else:
raise Exception('Authenication Failure : User is not registered')
解决方案
我认为您需要在将其发送到access_token
and之前对其进行编码。尝试,refresh_token
set_access_cookies
set_refresh_cookies
set_access_cookies(resp, access_token.encode('utf-8'))
set_refresh_cookies(resp, refresh_token.encode('utf-8'))
假设您使用的是 python3(来自错误跟踪),access_token 和 refresh_tokens 将是 unicode 字符串,但是这些函数需要一个字节字符串
参考:https ://docs.python.org/3/howto/unicode.html#converting-to-bytes
推荐阅读
- php - 在 Windows CMD 中 PHP 将数组导出为 CSV?
- java - 如何从设备的图库中选择图像并将其显示在图像视图上
- reactjs - 如何使用 JWT 在 react-redux 应用程序中刷新后保持登录
- scala - 如何将场景和请求名称指定为标头值?
- c# - C# UDP 数据包嗅探器堆栈到数据表并绑定到数据网格
- amazon-web-services - 无法再在 AWS Lambda 中上传函数代码。选项灰显
- python - Py 到 exe 与 pyinstaller
- java - 可重现的随机数(在 Java 或 .NET 中)?
- c# - csharp_style_var_when_type_is_apparent 有时似乎不一致?
- java - 如何在 Android Studio 中使用内存?