仅在生产中缺少授权标头

r1wp621o  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(280)

我有以下工作流程:
我有一个 api/token [post]采用表单数据(电子邮件和密码),返回并访问令牌和刷新令牌。
然后我有另一个端点 api/users/info [get](带标题) 'Authorization': 'Bearer ... )返回用户信息的。在本地测试时,两个端点都工作。
在对部署的服务器进行测试时,只有获取令牌的服务器可以工作。
下面是代码 api/users/info :

@API_BP.route('/users/info', methods=['GET'])
@fresh_jwt_required
def users_info():

    user_identity = get_jwt_identity()
    curr_user = (SDB.session.query(User)
                 .filter_by(email=user_identity).one_or_none())
    return jsonify({
        'greeting': 'Hello, World!',
        'foo': 'bar',

    })

此外,以下是我的配置:

JWT_TOKEN_LOCATION = ['cookies', 'headers']
JWT_COOKIE_CSRF_PROTECT = True
JWT_COOKIE_SECURE = True 
JWT_ACCESS_COOKIE_NAME = "my_access_cookie"
JWT_REFRESH_COOKIE_NAME = "my_refresh_cookie"
JWT_ACCESS_CSRF_COOKIE_NAME = "my_csrf_access_token"
JWT_REFRESH_CSRF_COOKIE_NAME = "my_csrf_refresh_token"
JWT_ACCESS_CSRF_HEADER_NAME = "X-MY-TOKEN"

我得到的错误是:

{
    "msg": "Missing JWT in cookies or headers (Missing cookie \"my_access_cookie\"; Missing Authorization Header)"
}

我在用 Postman 来打这些端点。我已收到您的代币 api/token 在授权下设置。以下是python中的外观:

import requests

url = "http://my_url.com/api/users/info"

payload = {}
headers = {
  'Authorization': 'Bearer eyJ0eXAiOiJKV1QiLCJhrtyuzI1NiJ9.eyJpYXQiOjE2MjU5MTg0MTEsIm5iZiI6MTYyNTkxODQxMSwianRpfghZi00YTcyLWIxZTYtZGMxYTRjNDhkOThhIiwiZXhwIjoxNjI1OTE5NjExLCJpZGVudGl0eSI6ImFsZnJlZG9Adml2ZWJlbmVmaXRzLmNvbSIsImZyZXNoIjp0cnVlLCsdfghXBlIjoiYWNjZXNzIiwiY3NyZiI6ImQyNTQ0NjY0LTFlOGUtNDY5NS1hY2I4LTE2MzIxMDZlNDY0MiJ9.WT-EWlMtZZKoNyiXYxa3xdfghjg7r7ys'
}

response = requests.request("GET", url, headers=headers, data = payload)

print(response.text.encode('utf8'))

如何确保第二个请求 GET 在prod工作?

2hh7jdfx

2hh7jdfx1#

如果您在生产中使用modwsgi,您可能需要确保您拥有 WSGIPAssAuthorization On 配置选项已启用。根据您在prod中运行flask应用程序所使用的软件(apache/nginx/uwsgi/unicorn/etc),可能会有类似的选项。

iyzzxitl

iyzzxitl2#

问题是 verify_jwt_in_request() 我会寻找标题 Authorization 而不是 X-Forwarded-Authorization .
在本地,标题将是 Authorization 但在生产中,由于我们使用的是docker/nginx,因此标题会更改为 X-Forwarded-Authorization . 我解决这个问题的方法是设置配置 JWT_HEADER_NAME = "X-Forwarded-Authorization"

相关问题