mirror of
https://github.com/QuantumNous/new-api.git
synced 2026-03-30 05:20:18 +00:00
51 lines
1.1 KiB
Go
51 lines
1.1 KiB
Go
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
|
|
}
|