这是一个使用 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
,检查refresh
cookie 的存在,获取用户信息并重新生成jwt
,然后重定向用户到之前的页面。 - Authentication Middleware:创建了
base
中间件,用于处理认证逻辑,包括验证jwt
、刷新token
和管理 cookie。中间件可以拦截和修改请求及响应,实现更复杂的认证逻辑。还可以创建多个中间件层,如required_auth
和required_admin
,用于保护不同的路由。 - 应用中间件:可以将中间件应用于整个应用程序或特定的路由,通过
Router::new
和layer
方法来添加中间件。也可以创建不同的路由器并合并它们,以实现更清晰的路由结构。
总的来说,Axum 的中间件提供了一种更灵活、可复用的方式来处理用户认证和保护路由,比最初的提取器方式更强大。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。