60 lines
3.4 KiB
Go
60 lines
3.4 KiB
Go
package models
|
||
|
||
import "time"
|
||
|
||
// SecurityQuestion 保存密保问题和 Argon2id 答案哈希,不保存答案明文。
|
||
type SecurityQuestion struct {
|
||
ID int `xorm:"id bigint unsigned not null pk autoincr" json:"-"`
|
||
UserID int `xorm:"user_id bigint not null unique" json:"-"`
|
||
Question string `xorm:"question varchar(255) notnull" json:"question"`
|
||
AnswerHash string `xorm:"answer_hash varchar(255) notnull" json:"-"`
|
||
Version int `xorm:"version int notnull default(1)" json:"-"`
|
||
CreatedAt time.Time `xorm:"created_at datetime created notnull" json:"created_at"`
|
||
UpdatedAt time.Time `xorm:"updated_at datetime updated notnull" json:"updated_at"`
|
||
}
|
||
|
||
func (SecurityQuestion) TableName() string { return "security_question" }
|
||
|
||
// RecoveryCode 保存一次性离线恢复码的 Argon2id 哈希,UsedAt 非空表示已经消费或撤销。
|
||
type RecoveryCode struct {
|
||
ID int `xorm:"id bigint unsigned not null pk autoincr" json:"-"`
|
||
UserID int `xorm:"user_id bigint not null index" json:"-"`
|
||
CodeHash string `xorm:"code_hash varchar(255) notnull" json:"-"`
|
||
CodeVersion int `xorm:"code_version int notnull default(1)" json:"-"`
|
||
UsedAt *time.Time `xorm:"used_at datetime null index" json:"-"`
|
||
CreatedAt time.Time `xorm:"created_at datetime created notnull index" json:"created_at"`
|
||
}
|
||
|
||
func (RecoveryCode) TableName() string { return "recovery_code" }
|
||
|
||
// WebAuthnCredential 保存 WebAuthn 公钥凭据的脱敏索引和加密数据。
|
||
// CredentialData 是由独立凭据密钥保护的序列化凭据,不允许保存明文公钥材料。
|
||
type WebAuthnCredential struct {
|
||
ID int `xorm:"id bigint unsigned not null pk autoincr" json:"-"`
|
||
UserID int `xorm:"user_id bigint not null index" json:"-"`
|
||
CredentialID string `xorm:"credential_id varchar(512) notnull unique" json:"-"`
|
||
CredentialData string `xorm:"credential_data text notnull" json:"-"`
|
||
DisplayName string `xorm:"display_name varchar(128) notnull" json:"display_name"`
|
||
Discoverable bool `xorm:"discoverable notnull default(0)" json:"discoverable"`
|
||
CreatedAt time.Time `xorm:"created_at datetime created notnull" json:"created_at"`
|
||
LastUsedAt *time.Time `xorm:"last_used_at datetime null" json:"last_used_at"`
|
||
RevokedAt *time.Time `xorm:"revoked_at datetime null index" json:"-"`
|
||
}
|
||
|
||
func (WebAuthnCredential) TableName() string { return "webauthn_credential" }
|
||
|
||
type TOTPAuthenticator struct {
|
||
ID int `xorm:"id bigint unsigned not null pk autoincr" json:"-"`
|
||
UserID int `xorm:"user_id bigint not null unique" json:"-"`
|
||
SecretCiphertext string `xorm:"secret_ciphertext text notnull" json:"-"`
|
||
CredentialVersion int `xorm:"credential_version int notnull default(1)" json:"-"`
|
||
Enabled bool `xorm:"enabled notnull default(1)" json:"enabled"`
|
||
ConfirmedAt *time.Time `xorm:"confirmed_at datetime null" json:"confirmed_at,omitempty"`
|
||
LastUsedStep int64 `xorm:"last_used_step bigint notnull default(0)" json:"-"`
|
||
CreatedAt time.Time `xorm:"created_at datetime created notnull" json:"created_at"`
|
||
UpdatedAt time.Time `xorm:"updated_at datetime updated notnull" json:"updated_at"`
|
||
RevokedAt *time.Time `xorm:"revoked_at datetime null index" json:"revoked_at,omitempty"`
|
||
}
|
||
|
||
func (TOTPAuthenticator) TableName() string { return "totp_authenticator" }
|