繁体   English   中英

如何在 FastAPI 中的 RedirectResponse 之后从 URL 检索查询参数?

[英]How to retrieve query parameter from URL after RedirectResponse in FastAPI?

我正在实施 oauth 授权代码流。

我想要的是在重定向后检索 url 中显示的code 我进行了研究,但没有发现真正有用的东西。 我认为,如果我可以在RedirectResponse之后在浏览器中获取当前的 url ,那么我可以使用 python 模块(如urllib.parse )提取它的code参数。 或者,FastApi 是否有办法帮助我在RedirectResponse之后获得 url ? 我在他们的文档中看到了后台任务,但我不知道这是否真的可以帮助我在重定向后检索到 url。 看到这个后,我尝试使用selenium库,但它打开了一个新的 window,当我尝试应用评论中建议的driver.get('put_your_site_name')时,它花费的时间太长了。

这是将我重定向到浏览器中的 url 的代码摘录,代码作为参数:

from uuid import uuid4

from oauthlib.oauth2 import WebApplicationClient

from fastapi import APIRouter, Request, Response

from fastapi.responses import RedirectResponse



router = APIRouter()

@router.get("/install/")
async def install(request: Request) -> Response:
    """Trigger the client identification process."""
    client_id = "xxx"
    client = WebApplicationClient(client_id)
    state = str(uuid4())

    authorization_url = f"https://api-url.com/auth/authorize?client_id={client_id}"
    url = client.prepare_request_uri(
        authorization_url,
        redirect_uri="http://127.0.0.1:8000/callback/",
        scope=["read:user"],
        state=state,
    )

    return RedirectResponse(url=url)

通过以上,我被重定向到回调 url,授权代码作为参数: http://127.0.0.1:8000/callback/?code=random-string-xyz 我还发现与我正在寻找的非常接近,除了我试图仅在重定向后获取当前路径。

我还检查了FastApi 查询参数部分并尝试了以下内容:

import typing
from uuid import uuid4

from oauthlib.oauth2 import WebApplicationClient

from fastapi import APIRouter, Request, Response

from fastapi.responses import RedirectResponse



router = APIRouter()

@router.get("/install/")
async def install(request: Request, code : typing.Optional[str] = None) -> Response:
    """Trigger the client identification process."""
    client_id = "xxx"
    client = WebApplicationClient(client_id)
    state = str(uuid4())

    authorization_url = f"https://api-url.com/auth/authorize?client_id={client_id}"
    url = client.prepare_request_uri(
        authorization_url,
        redirect_uri="http://127.0.0.1:8000/callback/",
        scope=["read:user"],
        state=state,
    )


    print("\n code : ", code, "\n")
    return RedirectResponse(url=url)

Output: code: None ,因为代码是在重定向后返回的,我猜?

我如何以编程方式获取 url 以检索code 或者也许你有任何其他方式来获得它..?

您应该取而代之的是在/callback而不是/install端点中检索code参数的值,因为根据您的问题中提供的链接,这是您要重定向到的端点:

http://127.0.0.1:8000/callback/?code=random-string-xyz
                     ^^^^^^^^^

在 FastAPI 中,您可以通过在端点中声明参数来获取查询参数。 根据文档

当您声明不属于路径参数的其他 function 参数时,它们会自动解释为“查询”参数。

例子:

@router.get("/callback")
async def install(code : str = None):
    # ...

或者,您可以 直接使用 Starlette 的Request object (也请参阅 Starlette 的文档),如本答案以及此处此处所述。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM