认证
VEF 的认证发生在 API 操作层。每个操作都有自己的 auth 配置,API 中间件会在 handler 执行前先解析出当前 principal。
默认行为
如果你不做额外配置:
- 操作默认使用 Bearer 认证
- 显式
Public的操作则不要求认证
这个默认值来自 API 引擎,而不是来自你的应用配置文件。
内置认证策略
公开的 api 包暴露了三种策略 helper:
api.Public()api.BearerAuth()api.SignatureAuth()
实际使用中,你通常通过操作配置来控制:
api.OperationSpec{
Action: "login",
Public: true,
}
或者通过资源级别的 auth 默认值来设置。
Bearer 认证
Bearer 认证支持两种 token 来源:
Authorization: Bearer <token>- 查询参数
__accessToken
真正的 token 校验逻辑由安全模块中的 auth manager 负责。
Signature 认证
Signature 认证主要用于外部应用和请求签名场景。
它要求这些 header:
X-App-IDX-TimestampX-NonceX-Signature
校验逻辑由安全模块的 signature authenticator 执行。
公开操作
公开操作会得到一个匿名 principal,而不是直接被拒绝。
适合标记为 Public 的接口包括:
- 登录
- 刷新 token
- 某些匿名健康检查或回调入口
内置认证资源
安全模块会自动注册一个内置 RPC 资源:
security/auth
主要 actions 包括:
loginrefreshlogoutresolve_challengeget_user_info
登录流程
内置认证资源支持两阶段模型:
- 先校验凭证
- 如有需要,再进入 challenge 流程
如果没有 challenge,login 会直接返回 token。
如果 challenge provider 已配置且当前用户需要额外挑战,login 会返回:
- challenge token
- 下一步 challenge 描述
客户端之后继续调用 resolve_challenge,直到所有挑战都完成。
应用通常还需要提供什么
这里要分场景来看:
security.UserLoader通常是用户登录和 refresh 流程的前提security.ExternalAppLoader只在你使用签名认证的外部应用场景时需要- challenge provider 是可选项,只有在你启用了挑战式登录流时才相关
security.UserInfoLoader只在你希望security/auth.get_user_info返回应用自定义用户信息时需要
框架提供的是认证流程和中间件,而不是你的身份源本身。
真实项目里常见的 auth 模块形态
很多 VEF 项目里的 auth 模块其实都很小,常见模式是:
- 在
init()里设置用户详情类型 - 提供
UserLoader - 提供
UserInfoLoader
概念上通常像这样:
func init() {
security.SetUserDetailsType[*UserDetails]()
}
var Module = vef.Module(
"app:auth",
vef.Provide(
NewUserLoader,
NewUserInfoLoader,
),
)
这样认证接入代码就能和业务资源模块保持分离。
实践建议
Public只用于明确需要匿名访问的操作- 普通用户认证优先保持在 Bearer
- Signature 更适合系统对系统集成,而不是替代普通用户会话
下一步
继续阅读 授权,看认证之后权限检查是如何继续发生的。