为啥请求中不包含授权标头? - 认证0

Posted

技术标签:

【中文标题】为啥请求中不包含授权标头? - 认证0【英文标题】:Why authorization header not included in request ? - Auth0为什么请求中不包含授权标头? - 认证0 【发布时间】:2021-08-28 19:55:16 【问题描述】:

我已经为这个问题苦苦挣扎了两个星期,基本上我已经使用在本地主机上运行的 Flask 应用配置了 auth0 设置。

所以,我的烧瓶应用程序中有以下两个端点:

一个不需要身份验证过程的公共端点
@APP.route("/api/public")
@cross_origin(headers=["Content-Type", "Authorization"])
def public():
    # No access token required to access this route
    
    response = "Hello from a public endpoint! You don't need to be authenticated to see this."
    return jsonify(message=response)
需要身份验证的私有端点
@APP.route("/api/private")
@cross_origin(headers=["Content-Type", "Authorization"])
@cross_origin(headers=["Access-Control-Allow-Origin", "http://localhost:3000"])
@requires_auth
def private():
    # A valid access token is required to access this route
    
    response = "Hello from a private endpoint! You need to be authenticated to see this."
    return jsonify(message=response)

所以这里是以下场景:

我尝试使用 auth0 url 登录,该 url 将我重定向到我的应用程序的通用登录页面。成功登录后,它会将我重定向到私有端点,我收到 401 Un-authorized 错误。

每当我使用来自浏览器的有效令牌发出此请求时,它都会引发 401 错误。 出于同样的原因,我使用邮递员调用此端点它有效!

原因是来自浏览器的这个请求不包括授权标头,不像邮递员。

我真的不明白为什么浏览器不包含授权标头。

谁能解释一下?

注意:起初它使用浏览器运行没有任何问题,但突然以某种方式出现。

由于私有端点需要身份验证,所以每当我尝试访问私有端点时,都会调用此函数:

def get_token_auth_header():
    """Obtains the access token from the Authorization Header
    """
    auth = request.headers.get("Authorization", None) # HERE IS THE PROBLEM OCCURRS
    print("REQUEST HEADERS: \n", request.headers)
    if not auth:
        raise AuthError("code": "authorization_header_missing",
                        "description":
                            "Authorization header is expected", 401)

    parts = auth.split()

    if parts[0].lower() != "bearer":
        raise AuthError("code": "invalid_header",
                        "description":
                            "Authorization header must start with"
                            " Bearer", 401)
    elif len(parts) == 1:
        raise AuthError("code": "invalid_header",
                        "description": "Token not found", 401)
    elif len(parts) > 2:
        raise AuthError("code": "invalid_header",
                        "description":
                            "Authorization header must be"
                            " Bearer token", 401)

    token = parts[1]
    return token

我已经为此苦苦挣扎了将近两个星期,我尝试了所有方法。

非常感谢您的帮助。

【问题讨论】:

是否在标题中打印授权。见this也许它也发生在烧瓶上。 @charchit 不幸的是它没有解决我的问题 【参考方案1】:

我在这里复制我在community forum 中提供的相同答案,以防您仍然需要它;)

您似乎缺少 authlib 配置;)

你可以see here how to configure that and use it on your app

【讨论】:

以上是关于为啥请求中不包含授权标头? - 认证0的主要内容,如果未能解决你的问题,请参考以下文章

带有授权标头的 GET 请求之前的 OPTIONS 请求在苗条框架 4 中不起作用

在向外部服务器发送 ajax 调用时,Access-Control-Allow-Headers 在预检响应中不允许请求标头字段授权 [重复]

为啥缺少授权标头?

为啥我没有得到授权标头?

授权标头在获取中不起作用 - React Native

vue axios 跨域请求在ie浏览器 报错 Access-Control-Allow-Headers 列表中不存在请求标头 authorization.