为你的 Python Web 应用添加认证 (Authentication)
本指南将向你展示如何将 Logto 集成到你的 Python Web 应用中。
提示:
- 示例使用 Flask,但概念对于其他框架是相同的。
- Python 示例项目可在我们的 Python SDK 仓库 中找到。
- Logto SDK 利用协程,调用异步函数时请记得使用
await
。
前提条件
- 一个 Logto Cloud 账户或一个 自托管 Logto。
- 一个已创建的 Logto 传统 Web 应用。
安装
在项目根目录执行:
pip install logto # 或者 `poetry add logto` 或者你使用的其他工具
集成
初始化 LogtoClient
首先,创建一个 Logto 配置:
client.py
from logto import LogtoClient, LogtoConfig
client = LogtoClient(
LogtoConfig(
endpoint="https://you-logto-endpoint.app", # 用你的 Logto endpoint 替换
appId="replace-with-your-app-id",
appSecret="replace-with-your-app-secret",
),
)
提示:
你可 以在管理控制台的应用详情页面找到并复制“应用密钥”:
还可以将默认的内存存储替换为持久存储,例如:
client.py
from logto import LogtoClient, LogtoConfig, Storage
from flask import session
from typing import Union
class SessionStorage(Storage):
def get(self, key: str) -> Union[str, None]:
return session.get(key, None)
def set(self, key: str, value: Union[str, None]) -> None:
session[key] = value
def delete(self, key: str) -> None:
session.pop(key, None)
client = LogtoClient(
LogtoConfig(...),
storage=SessionStorage(),
)
查看 Storage 了解更多详情。
配置重定向 URI
在我们深入细节之前,这里是终端用户体验的快速概述。登录过程可以简化如下:
- 你的应用调用登录方法。
- 用户被重定向到 Logto 登录页面。对于原生应用,将打开系统浏览器。
- 用户登录并被重定向回你的应用(配置为重定向 URI)。
关于基于重定向的登录
- 此认证 (Authentication) 过程遵循 OpenID Connect (OIDC) 协议,Logto 强制执行严格的安全措施以保护用户登录。
- 如果你有多个应用程序,可以使用相同的身份提供商 (IdP)(日志 (Logto))。一旦用户登录到一个应用程序,当用户访问另一个应用程序时,Logto 将自动完成登录过程。
要了解有关基于重定向的登录的原理和好处的更多信息,请参阅 Logto 登录体验解释。
备注:
在以下代码片段中,我们假设你的应用程序运行在 http://localhost:3000/
。
配置重定向 URI
切换到 Logto Console 的应用详情页面。添加一个重定向 URI http://localhost:3000/callback
。
就像登录一样,用户应该被重定向到 Logto 以注销共享会话。完成后,最好将用户重定向回你的网站。例如,添加 http://localhost:3000/
作为注销后重定向 URI 部分。
然后点击“保存”以保存更改。
实现登录和注销路由
在你的 Web 应用中,添加一个路由来正确处理用户的登录请求。我们以 /sign-in
为例:
flask.py
@app.route("/sign-in")
async def sign_in():
# 获取登录 URL 并重定向用户到该 URL
return redirect(await client.signIn(
redirectUri="http://localhost:3000/callback",
))
将 http://localhost:3000/callback
替换为你在 Logto Console 中为此应用设置的回调 URL。
如果你想在第一个屏幕显示注册页面,可以将 interactionMode
设置为 signUp
:
flask.py
@app.route("/sign-in")
async def sign_in():
return redirect(await client.signIn(
redirectUri="http://localhost:3000/callback",
interactionMode="signUp", # 在第一个屏幕显示注册页面
))