| 12345678910111213141516171819202122232425262728293031323334353637383940 |
- package auth
- // 会话的「是否通过过 TOTP」标记。
- //
- // docs/backend/auth.md 6.2 要求 totp_verified 表示「会话创建时通过过 TOTP」,
- // 但 sessions 表(auth.md 第三节)没有该字段。为此在会话记录里串上标记:
- //
- // <会话随机串> → 未通过 TOTP 创建
- // <会话随机串>:totp → 通过 TOTP 创建
- //
- // cookie 里下发明文,数据库存剥离后缀后的 SHA-256。与 pending_logins 的
- // trust_device 标记(auth.md 3.1 规则 1)是同一手法:不新增列、明文不落库。
- const sessionTotpSuffix = ":totp"
- // newSessionTokenFor 生成会话 token,并按需带 TOTP 标记。
- func newSessionTokenFor(totpVerified bool) (string, error) {
- tok, err := newSessionToken()
- if err != nil {
- return "", err
- }
- if totpVerified {
- return tok + sessionTotpSuffix, nil
- }
- return tok, nil
- }
- // splitSessionToken 剥离会话 token 末尾的 TOTP 标记。
- // 返回「用于哈希的原始值」与「是否通过过 TOTP」。
- func splitSessionToken(plain string) (token string, totpVerified bool) {
- if len(plain) > len(sessionTotpSuffix) && plain[len(plain)-len(sessionTotpSuffix):] == sessionTotpSuffix {
- return plain[:len(plain)-len(sessionTotpSuffix)], true
- }
- return plain, false
- }
- // sessionLookupHash 计算会话查库用的哈希:先剥离标记,再哈希。
- func sessionLookupHash(plain string) string {
- base, _ := splitSessionToken(plain)
- return HashToken(base)
- }
|