[英]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.