session.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package passkey
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "github.com/gin-contrib/sessions"
  6. "github.com/gin-gonic/gin"
  7. webauthn "github.com/go-webauthn/webauthn/webauthn"
  8. )
  9. var errSessionNotFound = errors.New("Passkey 会话不存在或已过期")
  10. func SaveSessionData(c *gin.Context, key string, data *webauthn.SessionData) error {
  11. session := sessions.Default(c)
  12. if data == nil {
  13. session.Delete(key)
  14. return session.Save()
  15. }
  16. payload, err := json.Marshal(data)
  17. if err != nil {
  18. return err
  19. }
  20. session.Set(key, string(payload))
  21. return session.Save()
  22. }
  23. func PopSessionData(c *gin.Context, key string) (*webauthn.SessionData, error) {
  24. session := sessions.Default(c)
  25. raw := session.Get(key)
  26. if raw == nil {
  27. return nil, errSessionNotFound
  28. }
  29. session.Delete(key)
  30. _ = session.Save()
  31. var data webauthn.SessionData
  32. switch value := raw.(type) {
  33. case string:
  34. if err := json.Unmarshal([]byte(value), &data); err != nil {
  35. return nil, err
  36. }
  37. case []byte:
  38. if err := json.Unmarshal(value, &data); err != nil {
  39. return nil, err
  40. }
  41. default:
  42. return nil, errors.New("Passkey 会话格式无效")
  43. }
  44. return &data, nil
  45. }