| package passkey | |
| import ( | |
| "encoding/json" | |
| "errors" | |
| "github.com/gin-contrib/sessions" | |
| "github.com/gin-gonic/gin" | |
| webauthn "github.com/go-webauthn/webauthn/webauthn" | |
| ) | |
| var errSessionNotFound = errors.New("Passkey 会话不存在或已过期") | |
| func SaveSessionData(c *gin.Context, key string, data *webauthn.SessionData) error { | |
| session := sessions.Default(c) | |
| if data == nil { | |
| session.Delete(key) | |
| return session.Save() | |
| } | |
| payload, err := json.Marshal(data) | |
| if err != nil { | |
| return err | |
| } | |
| session.Set(key, string(payload)) | |
| return session.Save() | |
| } | |
| func PopSessionData(c *gin.Context, key string) (*webauthn.SessionData, error) { | |
| session := sessions.Default(c) | |
| raw := session.Get(key) | |
| if raw == nil { | |
| return nil, errSessionNotFound | |
| } | |
| session.Delete(key) | |
| _ = session.Save() | |
| var data webauthn.SessionData | |
| switch value := raw.(type) { | |
| case string: | |
| if err := json.Unmarshal([]byte(value), &data); err != nil { | |
| return nil, err | |
| } | |
| case []byte: | |
| if err := json.Unmarshal(value, &data); err != nil { | |
| return nil, err | |
| } | |
| default: | |
| return nil, errors.New("Passkey 会话格式无效") | |
| } | |
| return &data, nil | |
| } | |