即使在指定了访问令牌之后,标头中也没有访问令牌:Flask&;JWT

即使在指定了访问令牌之后,标头中也没有访问令牌:Flask&;JWT,flask,jwt,token,jwt-auth,Flask,Jwt,Token,Jwt Auth,我已经使用flask、sqlite3、sqlalchemy和JWT创建了一个用于用户身份验证的基本应用程序。我的decorator如下[请原谅格式设置,我向您保证代码中的缩进是正确的]: def token_required(f): @wraps(f) def decorated(*args, **kwargs): token = None print(request.headers) if 'x_access_token' in request.headers:

我已经使用flask、sqlite3、sqlalchemy和JWT创建了一个用于用户身份验证的基本应用程序。我的decorator如下[请原谅格式设置,我向您保证代码中的缩进是正确的]:

def token_required(f):
  @wraps(f)
  def decorated(*args, **kwargs):
    token = None
    print(request.headers)
    if 'x_access_token' in request.headers:
        token = request.headers['X-Access-Token']

    if not token:
        return jsonify({'message' : 'Token is missing.'}), 401

    try:
        data = jwt.decode(token, SECRET_KEY)
        current_user = User.query.filter_by(public_id=data['public_id']).first()
    except:
        return jsonify({'message': 'Token is invalid.'}), 401

    return f(current_user, *args, **kwargs)
return decorated
我的主要登录路径是询问用户名和密码,如果有效,我会在标题中传递jwt令牌到需要令牌的路径:

@Main.route('/login', methods=['GET', 'POST'])
def login():
auth = request.authorization

if not auth or not auth.username or not auth.password:
    return make_response('Could not verify!', 401, {'WWW-Authenticate' : 'Basic realm="Login Required!"'})

user = User.query.filter_by(username=auth.username).first()

if not user:
    return make_response('Could not verify!', 401, {'WWW-Authenticate': 'Basic realm="Incorrect username"'})

if check_password_hash(user.password, auth.password):
    token = jwt.encode({'public_id' : user.public_id,
                        'exp' : datetime.datetime.utcnow() + datetime.timedelta(seconds=5000)},
                        SECRET_KEY)
    response = redirect(url_for('Main.views'))
    response.headers['X-Access-Token'] = token.decode('UTF-8')
    print('hi', response.headers)
    return response
    # return response_builder('Main.views', token)
else:
    return make_response('Could not verify!', 401, {'WWW-Authenticate': 'Basic realm="Incorrect password"'})
但是,当我的名为views的路由打开时,它在头中找不到令牌,从而导致执行装饰器的else部分,即缺少令牌

我打印了我从/login发送的回复中的标题:

Content-Type: text/html; charset=utf-8
Content-Length: 219
Location: /views
X-Access-Token: [a long hashed value]
当我在decorator中为我的视图打印标题时,登录重定向到没有x-access-token

Host: localhost:5000
Connection: keep-alive
Cache-Control: max-age=0
Authorization: Basic YWJoaTphYmhp
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like 
Gecko) Chrome/83.0.4103.61 Safari/537.36
Accept: 
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;
q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cookie: Pycharm-6d7a12e6=5d65ff91-afab-45ec-8de8-a23e44c046dd; __test=1; username-localhost- 
8888="2|1:0|10:1590510962|23:username-localhost- 
8888|44:MTA2YjkyMWJiMmU2NDU1MGFmM2Q5MjZhZGE5YjEwODA=|
f3ea838f5405f6c102ddbaf45dfef9bd000d2d183eaba9310d698d1005a6c21b"; 
session=eyJkYl9uYW1lIjoibXlfaGlzdCJ9.Xt-9aA.vDjCIXn731CioU72zCiJFim1shg
这是我的视图,需要令牌:

 # views page for navigation
    @Main.route('/views')
    @token_required
    def views(current_user):
        print(current_user)
        return render_template('Main/Views.html')

我尝试过的另一种代替重定向的方法是make_response,这种方法也很有效,它似乎只是跳过了页面上的decorator和render/views。不是/views的html,而是字面意义上的/views,你在混合下划线和连字符

试着改变

if 'x_access_token' in request.headers:
    token = request.headers['X-Access-Token']

要查找
'x-access-token'

,您需要混合下划线和连字符

试着改变

if 'x_access_token' in request.headers:
    token = request.headers['X-Access-Token']

要查找
'x-access-token'

头,除了简单的头,不能在两者之间设置


无cors-防止方法不是HEAD、GET或POST,而头不是简单头。如果任何ServiceWorker截获这些请求,他们可能不会添加或覆盖任何头,但简单头除外。此外,JavaScript可能无法访问结果响应的任何属性。这可以确保ServiceWorkers不会影响Web的语义,并防止跨域泄漏数据所引起的安全和隐私问题。

除了简单的标题外,不能在两者之间设置标题


无cors-防止方法不是HEAD、GET或POST,而头不是简单头。如果任何ServiceWorker截获这些请求,他们可能不会添加或覆盖任何头,但简单头除外。此外,JavaScript可能无法访问结果响应的任何属性。这可以确保ServiceWorkers不会影响Web的语义,并防止跨域泄漏数据引起的安全和隐私问题。

我不明白这一点,在这种情况下,下划线被解释为连字符?不,不是,这可能是您的问题。改为检查
x-access-token
。虽然我确实明白你的意思,但我确实伪造了下划线和连字符,但请你解释一下为什么我在打印标题时根本看不到标记?i、 e.问题中的屏幕截图3和4。当我在第四个屏幕截图中打印收到的响应对象时,您在第三个屏幕截图中使用了一个大的哈希值,而什么都没有。我不明白,在这种情况下,下划线被解释为连字符?不,不是,这可能是您的问题。改为检查
x-access-token
。虽然我确实明白你的意思,但我确实伪造了下划线和连字符,但请你解释一下为什么我在打印标题时根本看不到标记?i、 e.问题中的屏幕截图3和4。当我在第四个屏幕截图中打印接收到的响应对象时,您在第三个屏幕截图中使用了一个大的散列值,而没有任何内容