| 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 |
| } |
|
|