这是一个使用 Axum 和 Askama 构建带有用户认证功能的网站的示例。
- 基本结构:网站顶部有一个经典的导航栏,其中的按钮根据用户认证状态显示“Profile”或“Login”。通过
layout.jinja文件定义布局,其中的nav部分根据ctx.authed的值显示相应的链接。 - Context 与 HomeTemplate:
Context结构体用于表示用户认证状态,HomeTemplate结构体基于layout.jinja模板,通过HtmlTemplate和HomeTemplate的组合来生成 HTML 响应。 - 处理用户认证:使用 cookies 进行后端认证,介绍了
HttpOnly、Secure、SameSite等属性的作用,以及如何使用Set-Cookies头设置和管理 cookies。通过default_cookie函数生成默认的 cookie,并在login端点中创建和设置jwt和refresh token。 - Axum 提取器与 CookieJwt:实现了
CookieJwt提取器,用于从请求的 cookie 中提取jwt数据,并在home函数中使用该提取器来更新导航栏的显示。 - Refresh Token 端点:
refresh_token端点用于处理refresh token,检查refreshcookie 的存在,获取用户信息并重新生成jwt,然后重定向用户到之前的页面。 - Authentication Middleware:创建了
base中间件,用于处理认证逻辑,包括验证jwt、刷新token和管理 cookie。中间件可以拦截和修改请求及响应,实现更复杂的认证逻辑。还可以创建多个中间件层,如required_auth和required_admin,用于保护不同的路由。 - 应用中间件:可以将中间件应用于整个应用程序或特定的路由,通过
Router::new和layer方法来添加中间件。也可以创建不同的路由器并合并它们,以实现更清晰的路由结构。
总的来说,Axum 的中间件提供了一种更灵活、可复用的方式来处理用户认证和保护路由,比最初的提取器方式更强大。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。