设置授权 header - Flask 应用程序使用 Python 请求和 JWT
Setting Authorization header - Flask app using Python Requests and JWT
我刚刚开始学习编码,这让我发疯了。我不知道我是否遗漏了一些非常简单的东西,或者对身份验证的工作原理有完全的误解(很可能两者都有),但是,我希望有人能提供帮助。
我已经为我的 flask 应用程序创建了一个登录路径,它呈现以下内容并成功允许用户登录。
Login Page
如果用户成功登录,我想使用 JWT 生成的令牌设置授权 header。我正在使用请求库来执行此操作并获得 200 响应,但每次我检查网络选项卡时,我都无法在 'Authorization' 响应 Header.
中看到令牌
我的想法是,一旦设置了 Header,我就可以通过确保存在令牌来保护我的 API,并使用该信息来确保 API 仅为该用户的 return 数据即解密令牌以计算出用户。
Network tab - No Authorization Header
这是我当前的代码。我哪里错了?我的方法听起来正确吗?
@loginsBlueprint.route('/login', methods=['GET', 'POST'])
def login():
error = None
if request.method == 'POST':
user = User.query.filter_by(username=request.form['username']).first()
if user is not None and bcrypt.check_password_hash(user.password, request.form['password']):
token = jwt.encode(
{'user': request.form['username'], 'exp': datetime.datetime.utcnow() + datetime.timedelta(seconds=15)},
app.config['SECRET_KEY'])
url = 'http://127.0.0.1:5000/login'
headers = {'Authorization': 'Bearer ' + token}
requests.get(url, headers=headers)
return render_template('landing_page.html')
else:
return make_response('Could not verify', 403,
{'WWW-Authenticate': 'Basic realm ="Wrong Password !!"'})
return render_template('login.html', error=error)
login.html
<html>
<head>
<title>Flask Intro - login page</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="static/bootstrap.min.css" rel="stylesheet" media="screen">
</head>
<body>
<div class="container">
<h1>Please login</h1>
<br>
<form action="" method="post">
<input type="text" placeholder="Username" name="username" value="{{
request.form.username }}">
<input type="password" placeholder="Password" name="password" value="{{
request.form.password }}">
<input class="btn btn-default" type="submit" value="Login">
</form>
{% if error %}
<p class="error"><strong>Error:</strong> {{ error }}
{% endif %}
</div>
</body>
</html>
注意:我尝试更改为 requests.post
但得到 400:
127.0.0.1 - - [30/Mar/2021 21:53:29] "←[31m←[1mPOST /login HTTP/1.1←[0m" 400
我认为这可能是因为我正在使用 CORS,所以将其添加到:
CORS(app, expose_headers='Authorization')
这里有些令人困惑的事情:
在 login()
方法中,您进行了 requests.get()
调用。所以看起来你正在从你的应用程序调用一个新的端点。它应该如何工作?确切地说,您似乎检查了用户的凭据,发出 JWT,然后调用侦听端口 5000
的应用程序的 /login
端点,将 JWT 设置为不记名令牌。
Authorization
是一个请求 header。您不使用它来响应客户端。如果您想 return 客户端的 JWT 使用 OAuth 流程之一,Code flow (preferably) or the Implicit flow.
一旦您将令牌发送给您的客户,那么您应该按照您所说的那样使用它 - 在 Authorization
header 中设置为 Bearer
令牌。当您使用 Flask 时,您可以使用 this filter 来保护您的 API。
我刚刚开始学习编码,这让我发疯了。我不知道我是否遗漏了一些非常简单的东西,或者对身份验证的工作原理有完全的误解(很可能两者都有),但是,我希望有人能提供帮助。
我已经为我的 flask 应用程序创建了一个登录路径,它呈现以下内容并成功允许用户登录。
Login Page
如果用户成功登录,我想使用 JWT 生成的令牌设置授权 header。我正在使用请求库来执行此操作并获得 200 响应,但每次我检查网络选项卡时,我都无法在 'Authorization' 响应 Header.
中看到令牌我的想法是,一旦设置了 Header,我就可以通过确保存在令牌来保护我的 API,并使用该信息来确保 API 仅为该用户的 return 数据即解密令牌以计算出用户。
Network tab - No Authorization Header
这是我当前的代码。我哪里错了?我的方法听起来正确吗?
@loginsBlueprint.route('/login', methods=['GET', 'POST'])
def login():
error = None
if request.method == 'POST':
user = User.query.filter_by(username=request.form['username']).first()
if user is not None and bcrypt.check_password_hash(user.password, request.form['password']):
token = jwt.encode(
{'user': request.form['username'], 'exp': datetime.datetime.utcnow() + datetime.timedelta(seconds=15)},
app.config['SECRET_KEY'])
url = 'http://127.0.0.1:5000/login'
headers = {'Authorization': 'Bearer ' + token}
requests.get(url, headers=headers)
return render_template('landing_page.html')
else:
return make_response('Could not verify', 403,
{'WWW-Authenticate': 'Basic realm ="Wrong Password !!"'})
return render_template('login.html', error=error)
login.html
<html>
<head>
<title>Flask Intro - login page</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="static/bootstrap.min.css" rel="stylesheet" media="screen">
</head>
<body>
<div class="container">
<h1>Please login</h1>
<br>
<form action="" method="post">
<input type="text" placeholder="Username" name="username" value="{{
request.form.username }}">
<input type="password" placeholder="Password" name="password" value="{{
request.form.password }}">
<input class="btn btn-default" type="submit" value="Login">
</form>
{% if error %}
<p class="error"><strong>Error:</strong> {{ error }}
{% endif %}
</div>
</body>
</html>
注意:我尝试更改为 requests.post
但得到 400:
127.0.0.1 - - [30/Mar/2021 21:53:29] "←[31m←[1mPOST /login HTTP/1.1←[0m" 400
我认为这可能是因为我正在使用 CORS,所以将其添加到:
CORS(app, expose_headers='Authorization')
这里有些令人困惑的事情:
在
login()
方法中,您进行了requests.get()
调用。所以看起来你正在从你的应用程序调用一个新的端点。它应该如何工作?确切地说,您似乎检查了用户的凭据,发出 JWT,然后调用侦听端口5000
的应用程序的/login
端点,将 JWT 设置为不记名令牌。Authorization
是一个请求 header。您不使用它来响应客户端。如果您想 return 客户端的 JWT 使用 OAuth 流程之一,Code flow (preferably) or the Implicit flow.一旦您将令牌发送给您的客户,那么您应该按照您所说的那样使用它 - 在
Authorization
header 中设置为Bearer
令牌。当您使用 Flask 时,您可以使用 this filter 来保护您的 API。