使用#重定向 Url QueryParams

问题描述 投票:0回答:1

我在使用 Redirect Url 并使用 FastApi 从 Python 中的 QueryParams 获取数据时遇到问题。我正在使用 Azure AD 授权授予流程登录,下面是生成

RedirectResponse

的代码
@app.get("/auth/oauth/{provider_id}")
async def oauth_login(provider_id: str, request: Request):
    if config.code.oauth_callback is None:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail="No oauth_callback defined",
        )

    provider = get_oauth_provider(provider_id)
    if not provider:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail=f"Provider {provider_id} not found",
        )

    random = random_secret(32)

    params = urllib.parse.urlencode(
        {
            "client_id": provider.client_id,
            "redirect_uri": f"{get_user_facing_url(request.url)}/callback",
            "state": random,
            **provider.authorize_params,
        }
    )
    response = RedirectResponse(
        url=f"{provider.authorize_url}?{params}")
    samesite = os.environ.get("CHAINLIT_COOKIE_SAMESITE", "lax")  # type: Any
    secure = samesite.lower() == "none"
    response.set_cookie(
        "oauth_state",
        random,
        httponly=True,
        samesite=samesite,
        secure=secure,
        max_age=3 * 60,
    )
    return response

这就是我接收重定向 URL 的地方。

@app.get("/auth/oauth/{provider_id}/callback")
async def oauth_callback(
    provider_id: str,
    request: Request,
    error: Optional[str] = None,
    code: Optional[str] = None,
    state: Optional[str] = None,
):
    if config.code.oauth_callback is None:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail="No oauth_callback defined",
        )
    provider = get_oauth_provider(provider_id)
    if not provider:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail=f"Provider {provider_id} not found",
        )


    
    if not code or not state:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail="Missing code or state",
        )
    response.delete_cookie("oauth_state")
    return response

当 QueryParams 带有 ? 时,此重定向工作正常。但现在的问题是,来自 Azure AD 的重定向回调带有 #,因此我无法从 Url

 获取 
Code
State

QueryParams

带有 # 的 RedirectUrl 示例

http://localhost/callback#code=xxxxxx&state=yyyyyy

关于如何解决此问题的任何想法。

python azure-active-directory fastapi
1个回答
0
投票

如果您想在服务器端获取哈希标记

#
(也称为片段)之后的值,您不能。这只是因为片段从不发送到服务器(相关帖子可以在这里这里找到)。

我建议继续在 URL 中使用 问号,这是在 HTTP 请求中发送查询参数的正确方法。如果这是一个复杂的路径参数,您可以按照这个答案中描述的方法进行操作,这将允许您捕获整个 URL 路径,包括

/
%
等字符,但仍然不是文本/值
#
之后。

© www.soinside.com 2019 - 2024. All rights reserved.