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 }