首页 > 解决方案 > 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')

标签: flaskgraphqljwt

解决方案


我认为您需要在将其发送到access_tokenand之前对其进行编码。尝试,refresh_tokenset_access_cookiesset_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


推荐阅读