Skip to content

身份认证中间件

身份认证中间件用于识别用户身份,保护 API 和页面资源,是安全开发的基础。

请求管道与中间件流程图

下面以典型的中间件管道为例,展示请求从进入到响应的完整流程:

类比说明

  • 认证中间件如同物流中心的守卫,负责验证快递员是否有资格进入物流中心(身份是否合法)
  • 快递员身份合法前提下,导航仪(路由中间件)带领快递员,找到对应的快递(终结点)
  • 此时保险柜(授权中间件)再次验证快递员是否有权限取的快递,授权开柜,取的所需的快递(终结点)

快速启动

只需 4 步即可集成认证服务:

cangjie
import spire_web_hosting.*
import spire_web_http.*
import spire_web_authentication.*

main() {
    // 1. 构建Web主机
    let builder = WebHost.createBuilder()

    // 2. 注册认证服务
    builder.services.addAuthentication()
    let host = builder.build()

    // 3. 启用认证中间件
    host.useAuthentication()

    // 4. 启动主机
    host.run()
}

添加依赖

需要在依赖配置文件(cjpm.toml)中添加如下依赖:

bash
[dependencies]
  spire_web_http = { path = "/spire_web_http"}
  spire_web_hosting = { path = "/spire_web_hosting"}
  spire_web_authentication = { path = "/spire_web_authentication"}
  spire_extensions_injection = { path = "/spire_extensions_injection"}

认证方案扩展

支持多种认证方式(如 Cookie、JWT、OIDC 等):

cangjie
import spire_web_hosting.*
import spire_web_http.*
import spire_web_authentication.*
import spire_web_jwtbearer.*

main() {
    // 1. 创建Web主机构建器
    let builder = WebHost.createBuilder()

    // 2. 注册认证服务,并添加JWT Bearer方案
    builder.services.addAuthentication({ options =>
        // 设置默认认证方案为"jwt"
        options.defaultScheme = "jwt"
    }).addJwtBearer("jwt", { options =>
        // 配置JWT参数
        options.authority = "https://demo.identity" // 身份认证服务器地址
        options.audience = "api"                    // 令牌受众
        // 如有需要可配置更多参数,如options.requireHttpsMetadata = false
    })

    // 3. 构建主机
    let host = builder.build()

    // 4. 启用认证中间件
    host.useAuthentication()

    // 5. 配置受保护的API路由
    host.useEndpoints({ endpoints =>
        // 需要认证的接口
        endpoints.mapGet("/secure", [Authorize()], context => {
            context.response.write("已通过JWT认证,访问成功!")
        })
        // 公共接口
        endpoints.mapGet("/public", context => {
            context.response.write("无需认证即可访问。")
        })
    })

    // 6. 启动主机
    host.run()
}

认证流程说明

  • 认证中间件会自动解析请求头、Cookie 等,识别用户身份
  • 认证失败时可返回 401 Unauthorized
  • 可结合授权中间件实现细粒度访问控制

常见问题与建议

  • 认证中间件应在授权、路由等中间件之前注册。
  • 生产环境务必启用 HTTPS,防止凭据泄露。
  • 认证失败应返回明确的错误信息,便于前端处理。
  • 可结合第三方登录、单点登录等扩展认证能力。

最佳实践

  • 推荐 JWT 用于 API,Cookie 用于 Web 页面。
  • 认证信息建议短时有效,降低风险。
  • 认证相关配置(密钥、地址等)应安全存储。