即使在指定了访问令牌之后,标头中也没有访问令牌:Flask&;JWT
我已经使用flask、sqlite3、sqlalchemy和JWT创建了一个用于用户身份验证的基本应用程序。我的decorator如下[请原谅格式设置,我向您保证代码中的缩进是正确的]:即使在指定了访问令牌之后,标头中也没有访问令牌: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:
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。当我在第四个屏幕截图中打印接收到的响应对象时,您在第三个屏幕截图中使用了一个大的散列值,而没有任何内容