github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/db/access_token.go (about) 1 package db 2 3 import ( 4 "database/sql/driver" 5 "encoding/json" 6 "fmt" 7 8 "gopkg.in/square/go-jose.v2/jwt" 9 ) 10 11 type AccessToken struct { 12 Token string 13 Claims Claims 14 } 15 16 func scanAccessToken(rcv *AccessToken, scan scannable) error { 17 return scan.Scan(&rcv.Token, &rcv.Claims) 18 } 19 20 type Claims struct { 21 jwt.Claims 22 FederatedClaims `json:"federated_claims"` 23 RawClaims map[string]interface{} `json:"-"` 24 Username string `json:"name"` 25 PreferredUsername string `json:"preferred_username"` 26 } 27 28 type FederatedClaims struct { 29 UserID string `json:"user_id"` 30 Connector string `json:"connector_id"` 31 } 32 33 func (c Claims) MarshalJSON() ([]byte, error) { 34 return json.Marshal(c.RawClaims) 35 } 36 37 func (c *Claims) UnmarshalJSON(data []byte) error { 38 type target Claims 39 var t target 40 if err := json.Unmarshal(data, &t); err != nil { 41 return err 42 } 43 if err := json.Unmarshal(data, &t.RawClaims); err != nil { 44 return err 45 } 46 47 *c = Claims(t) 48 return nil 49 } 50 51 func (c Claims) Value() (driver.Value, error) { 52 return json.Marshal(c) 53 } 54 55 func (c *Claims) Scan(value interface{}) error { 56 b, ok := value.([]byte) 57 if !ok { 58 return fmt.Errorf("invalid claims: expected []byte, got %T", value) 59 } 60 61 return json.Unmarshal(b, c) 62 }