使用 Axum 进行身份验证

这是一个使用 Axum 和 Askama 构建带有用户认证功能的网站的示例。

  • 基本结构:网站顶部有一个经典的导航栏,其中的按钮根据用户认证状态显示“Profile”或“Login”。通过layout.jinja文件定义布局,其中的nav部分根据ctx.authed的值显示相应的链接。
  • Context 与 HomeTemplateContext结构体用于表示用户认证状态,HomeTemplate结构体基于layout.jinja模板,通过HtmlTemplateHomeTemplate的组合来生成 HTML 响应。
  • 处理用户认证:使用 cookies 进行后端认证,介绍了HttpOnlySecureSameSite等属性的作用,以及如何使用Set-Cookies头设置和管理 cookies。通过default_cookie函数生成默认的 cookie,并在login端点中创建和设置jwtrefresh token
  • Axum 提取器与 CookieJwt:实现了CookieJwt提取器,用于从请求的 cookie 中提取jwt数据,并在home函数中使用该提取器来更新导航栏的显示。
  • Refresh Token 端点refresh_token端点用于处理refresh token,检查refreshcookie 的存在,获取用户信息并重新生成jwt,然后重定向用户到之前的页面。
  • Authentication Middleware:创建了base中间件,用于处理认证逻辑,包括验证jwt、刷新token和管理 cookie。中间件可以拦截和修改请求及响应,实现更复杂的认证逻辑。还可以创建多个中间件层,如required_authrequired_admin,用于保护不同的路由。
  • 应用中间件:可以将中间件应用于整个应用程序或特定的路由,通过Router::newlayer方法来添加中间件。也可以创建不同的路由器并合并它们,以实现更清晰的路由结构。

总的来说,Axum 的中间件提供了一种更灵活、可复用的方式来处理用户认证和保护路由,比最初的提取器方式更强大。

阅读 22
0 条评论