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  }