【问题标题】:Why does flask not accept the JWT Cookie?为什么烧瓶不接受 JWT Cookie?
【发布时间】:2020-06-19 22:52:37
【问题描述】:

我正在尝试使用 Flask_JWT_Extended 来保护我的 API。 如果我通过 swagger 从 'localhost/api' 向 'localhost/api/auth/check 发送请求,它可以工作。 但是如果我尝试通过 JavaScript 从 'localhost/CheckAuth.js' 发送它,JWT Extended 会说找不到 access_token coockie。

为什么会发生这种情况,我该如何解决?

我的烧瓶设置

# JWT settings
JWT_TOKEN_LOCATION = 'cookies'
JWT_COOKIE_SECURE = False
JWT_ACCESS_COOKIE_PATH = '127.0.0.1'
JWT_REFRESH_COOKIE_PATH = '/api/auth/refresh'
JWT_COOKIE_CSRF_PROTECT = False
JWT_SECRET_KEY = 'changeme'

我的 Auth.py,定义了登录和检查

from flask import request, jsonify, make_response
from flask_restx import Resource
from api.mApi import api as marlinizer_api
from api.api_definition import login
from flask_jwt_extended import create_access_token, create_refresh_token, get_jwt_identity
from flask_jwt_extended import jwt_required, jwt_refresh_token_required
from flask_jwt_extended import set_access_cookies, set_refresh_cookies
from database.operations import Users
from misc import security
from flask import escape

namespace = marlinizer_api.namespace('auth')


@namespace.route('/login')
class Login(Resource):
    @namespace.expect(login)
    def post(self):
        try:
            username = escape(request.json['username'])
            password = escape(request.json['password'])

            user = Users.get_user_by_username(username)
            if user is None or user['password'] != 
security.hash_user_password(str(password), str(user['salt'])):
            data = dict(login=False)
            return make_response(jsonify(**data), 200)

        access_token = create_access_token(identity=username)
        refresh_token = create_refresh_token(identity=username)
        data = dict(login=True)
        resp = make_response(jsonify(**data), 200)
        set_access_cookies(resp, access_token)
        set_refresh_cookies(resp, refresh_token)
        return resp

    except KeyError:
        return '{"login": "false"}', 400


@namespace.route('/refresh')
class Refresh(Resource):
    @jwt_refresh_token_required
    def post(self):
        user = get_jwt_identity()
        access_token = create_access_token(identity=user)
        data = dict(refresh=True)
        resp = jsonify(**data)
        set_access_cookies(resp, access_token)
        return make_response(resp, 200)


@namespace.route('/check')
class CheckAuth(Resource):
    @jwt_required
    def get(self):
        identity = get_jwt_identity()
        user = Users.get_user_by_username(identity)
        data = dict(auth=True)
        if user is None:
           data['auth'] = False
        return make_response(jsonify(**data), 200)

JavaScript

    let client = new XMLHttpRequest();
client.open('GET', 'http://localhost:5000/api/auth/check');
client.onload = function (x) {
    console.log(client.responseText);
}

client.setRequestHeader('Content-Type', 'application/json');
client.send('{}');

【问题讨论】:

  • 听起来像是 Javascript 的问题。
  • 我添加了我的 JavaScript
  • 在那个脚本的什么地方发送 JWT?
  • 无处可去。 JWT 包含在 cookie 中,在 auth python 文件中的 login 函数中设置。

标签: python flask cookies rest


【解决方案1】:

JWT_ACCESS_COOKIE_PATH = '127.0.0.1' 没有做你认为它正在做的事情。这是用于在给定域上设置此 cookie 的 url 路径,并且可能类似于 / 这里。 JWT_COOKIE_DOMAINhttps://flask.palletsprojects.com/en/1.1.x/api/#flask.Response.set_cookie 中的域选项)和/或 CORS 可能是您正在寻找的,如果您的前端是从与后端不同的子域提供的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 2012-07-31
    相关资源
    最近更新 更多