身份验证

用户密码身份验证

Loco 简化了用户身份验证过程,使您能够快速搭建新网站。此功能不仅节省时间,还提供了专注于构建应用程序核心逻辑的灵活性。

身份验证配置

auth 功能是库的默认配置。如果需要,您可以关闭它并手动处理身份验证。

SaaS 应用快速入门

使用 loco cli 创建您的应用,并选择 SaaS app (with DB and user auth) 选项。

要探索开箱即用的身份验证控制器,请运行以下命令:

$ cargo loco routes
 .
 .
 .
[POST] /api/auth/forgot
[POST] /api/auth/login
[POST] /api/auth/register
[POST] /api/auth/reset
[GET] /api/auth/verify
[GET] /api/auth/current
 .
 .
 .

注册新用户

/api/auth/register 端点在数据库中创建一个新用户,并带有用于账户验证的 email_verification_token。一封包含验证链接的欢迎邮件将发送给用户。

Curl 请求示例:
curl --location '127.0.0.1:5150/api/auth/register' \
     --header 'Content-Type: application/json' \
     --data-raw '{
         "name": "Loco user",
         "email": "user@loco.rs",
         "password": "12341234"
     }'

出于安全原因,如果用户已注册,则不会创建新用户,并返回 200 状态码,且不会泄露用户邮箱详细信息。

登录

注册新用户后,使用以下请求登录:

Curl 请求示例:
curl --location '127.0.0.1:5150/api/auth/login' \
     --header 'Content-Type: application/json' \
     --data-raw '{
         "email": "user@loco.rs",
         "password": "12341234"
     }'

响应包含用于身份验证的 JWT token、用户 ID、姓名和验证状态。

{
    "token": "...",
    "pid": "2b20f998-b11e-4aeb-96d7-beca7671abda",
    "name": "Loco user",
    "is_verified": false
}
  • Token: JWT token,用于向身份验证端点发出请求。请参阅 配置文档 以自定义默认 token 过期时间,并确保不同环境中使用不同的 secret。
  • pid - 创建新用户时生成的唯一标识符。
  • Name - 与账户关联的用户名。
  • Is Verified - 标志,指示用户是否已验证其账户。

账户验证

用户注册后,将发送一封包含验证链接的电子邮件。访问此链接会更新数据库中的 email_verified_at 字段,并将登录响应中的 is_verified 标志更改为 true。

Curl 请求示例:

curl --location --request GET '127.0.0.1:5150/api/auth/verify/TOKEN' \
     --header 'Content-Type: application/json'

重置密码流程

忘记密码

forgot 端点只需要请求体中包含用户的邮箱。将发送一封包含重置密码链接的电子邮件,并在数据库中设置 reset_token

Curl 请求示例:
curl --location '127.0.0.1:5150/api/auth/forgot' \
     --header 'Content-Type: application/json' \
     --data-raw '{
         "email": "user@loco.rs"
     }'

重置密码

要重置密码,请发送在 forgot 端点生成的 token 以及新密码。

Curl 请求示例:
curl --location '127.0.0.1:5150/api/auth/reset' \
     --header 'Content-Type: application/json' \
     --data '{
         "token": "TOKEN",
         "password": "new-password"
     }'

获取当前用户

此端点受 auth 中间件保护。

curl --location --request GET '127.0.0.1:5150/api/auth/current' \
     --header 'Content-Type: application/json' \
     --header 'Authorization: Bearer TOKEN'

创建经过身份验证的端点

要建立一个经过身份验证的端点,请从 loco_rs 库导入 controller::middleware,并将 auth 中间件合并到函数端点参数中。

请考虑以下 Rust 示例:

use axum::{extract::State, Json};
use loco_rs::{
    app::AppContext,
    controller::middleware,
    Result,
};

async fn current(
    auth: middleware::auth::Auth,
    State(ctx): State<AppContext>,
) -> Result<Response> {
    let user = users::Model::find_by_pid(&ctx.db, &auth.claims.pid).await?;
    /// 一些响应
}

API 身份验证

创建新应用

这次,让我们使用 loco cli 创建您的 rest 应用,并选择 Rest app 选项。 要创建新应用,请运行以下命令并按照说明操作:

$ loco new

要探索开箱即用的身份验证控制器,请运行以下命令:

$ cargo loco routes
 .
 .
 .
[POST] /api/auth/forgot
[POST] /api/auth/login
[POST] /api/auth/register
[POST] /api/auth/reset
[GET] /api/auth/verify
[GET] /api/auth/current
 .
 .
 .

注册新用户

/api/auth/register 端点在数据库中创建一个新用户,并带有用于请求身份验证的 api_keyapi_key 将在未来的请求中用于身份验证。

Curl 请求示例:

curl --location '127.0.0.1:5150/api/auth/register' \
     --header 'Content-Type: application/json' \
     --data-raw '{
         "name": "Loco user",
         "email": "user@loco.rs",
         "password": "12341234"
     }'

注册新用户后,请确保在数据库中看到新用户的 api_key

使用 API 身份验证创建经过身份验证的端点

要设置 API 身份验证的端点,请从 loco_rs 库导入 controller::middleware,并将 auth 中间件通过 middleware::auth::ApiToken 包含在函数端点参数中。

请考虑以下 Rust 示例:

use loco_rs::prelude::*;
use loco_rs::controller::middleware;
use crate::{models::_entities::users, views::user::CurrentResponse};

async fn current_by_api_key(
    auth: middleware::auth::ApiToken<users::Model>,
    State(_ctx): State<AppContext>,
) -> Result<Response> {
    format::json(CurrentResponse::new(&auth.user))
}

pub fn routes() -> Routes {
    Routes::new()
        .prefix("user")
        .add("/current-api", get(current_by_api_key))
}

请求 API 身份验证的端点

要请求经过身份验证的端点,您需要在 Authorization 标头中传递 API_KEY

Curl 请求示例:

curl --location '127.0.0.1:5150/api/user/current-api' \
     --header 'Content-Type: application/json' \
     --header 'Authorization: Bearer API_KEY'

如果 API_KEY 有效,您将收到包含用户详细信息的响应。