github.com/fanux/shipyard@v0.0.0-20161009071005-6515ce223235/auth/auth.go (about)

     1  package auth
     2  
     3  import (
     4  	"errors"
     5  	"strings"
     6  	"time"
     7  
     8  	"golang.org/x/crypto/bcrypt"
     9  )
    10  
    11  var (
    12  	ErrUnauthorized  = errors.New("unauthorized")
    13  	ErrNoUserInToken = errors.New("no user sent in token")
    14  )
    15  
    16  type (
    17  	Account struct {
    18  		ID        string       `json:"id,omitempty" gorethink:"id,omitempty"`
    19  		FirstName string       `json:"first_name,omitempty" gorethink:"first_name,omitempty"`
    20  		LastName  string       `json:"last_name,omitempty" gorethink:"last_name,omitempty"`
    21  		Username  string       `json:"username,omitempty" gorethink:"username"`
    22  		Password  string       `json:"password,omitempty" gorethink:"password"`
    23  		Tokens    []*AuthToken `json:"-" gorethink:"tokens"`
    24  		Roles     []string     `json:"roles,omitempty" gorethink:"roles"`
    25  	}
    26  
    27  	AuthToken struct {
    28  		Token     string `json:"auth_token,omitempty" gorethink:"auth_token"`
    29  		UserAgent string `json:"user_agent,omitempty" gorethink:"user_agent"`
    30  	}
    31  
    32  	AccessToken struct {
    33  		Token    string
    34  		Username string
    35  	}
    36  
    37  	ServiceKey struct {
    38  		Key         string `json:"key,omitempty" gorethink:"key"`
    39  		Description string `json:"description,omitempty" gorethink:"description"`
    40  	}
    41  
    42  	Authenticator interface {
    43  		Authenticate(username, password, hash string) (bool, error)
    44  		GenerateToken() (string, error)
    45  		IsUpdateSupported() bool
    46  		Name() string
    47  	}
    48  )
    49  
    50  func Hash(data string) (string, error) {
    51  	h, err := bcrypt.GenerateFromPassword([]byte(data), bcrypt.DefaultCost)
    52  	return string(h[:]), err
    53  }
    54  
    55  func GenerateToken() (string, error) {
    56  	return Hash(time.Now().String())
    57  }
    58  
    59  // GetAccessToken returns an AccessToken from the access header
    60  func GetAccessToken(authToken string) (*AccessToken, error) {
    61  	parts := strings.Split(authToken, ":")
    62  
    63  	if len(parts) != 2 {
    64  		return nil, ErrNoUserInToken
    65  
    66  	}
    67  
    68  	return &AccessToken{
    69  		Username: parts[0],
    70  		Token:    parts[1],
    71  	}, nil
    72  
    73  }