-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
11 changed files
with
220 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
package model | ||
|
||
import ( | ||
"fmt" | ||
|
||
"golang.org/x/crypto/bcrypt" | ||
) | ||
|
||
// User represents request auth info | ||
type User struct { | ||
Username string | ||
Password string | ||
Role string | ||
} | ||
|
||
// NewUser creates a new User instance with username and password | ||
func NewUser(username, password, role string) (*User, error) { | ||
cryptPass, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) | ||
if err != nil { | ||
return nil, fmt.Errorf("failed to generate crypto password: %v", err) | ||
} | ||
return &User{ | ||
Role: role, | ||
Username: username, | ||
Password: string(cryptPass), | ||
}, nil | ||
} | ||
|
||
// Authed check whether the password is correct | ||
func (u *User) Authed(password string) bool { | ||
err := bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(password)) | ||
return err == nil | ||
} | ||
|
||
// Clone returns a clone of this user | ||
func (u *User) Clone() *User { | ||
return &User{ | ||
Username: u.Username, | ||
Password: u.Password, | ||
Role: u.Role, | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
package jwtool | ||
|
||
import ( | ||
"time" | ||
|
||
"github.com/dgrijalva/jwt-go" | ||
|
||
"cookbook/devto-grpc/model" | ||
) | ||
|
||
// Manager for JWT authentication | ||
type Manager struct { | ||
secretKey string | ||
expired time.Duration | ||
} | ||
|
||
// NewManager creates a new JWT Manager | ||
func NewManager(secretKey string, expired time.Duration) *Manager { | ||
return &Manager{ | ||
secretKey: secretKey, | ||
expired: expired, | ||
} | ||
} | ||
|
||
// Generate create a user token | ||
func (m *Manager) Generate(user *model.User) (string, error) { | ||
claims := UserClaims{ | ||
Username: user.Username, | ||
Role: user.Role, | ||
StandardClaims: jwt.StandardClaims{ | ||
ExpiresAt: time.Now().Add(m.expired).Unix(), | ||
}, | ||
} | ||
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) | ||
return token.SignedString([]byte(m.secretKey)) | ||
} | ||
|
||
// UserClaims stands for user claim | ||
type UserClaims struct { | ||
Username string `json:"username"` | ||
Role string `json:"role"` | ||
jwt.StandardClaims | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
package store | ||
|
||
import ( | ||
"errors" | ||
"sync" | ||
|
||
"cookbook/devto-grpc/model" | ||
) | ||
|
||
// UserStore Errors | ||
var ( | ||
ErrUserAlreadyExists = errors.New("user already exists") | ||
) | ||
|
||
// UserStore store user information | ||
type UserStore interface { | ||
Save(user *model.User) error | ||
Find(username string) (*model.User, error) | ||
} | ||
|
||
// MemoryUserStore store user in memory | ||
type MemoryUserStore struct { | ||
mutex sync.RWMutex | ||
users map[string]*model.User | ||
} | ||
|
||
// Save stores user in memory | ||
func (s *MemoryUserStore) Save(user *model.User) error { | ||
s.mutex.Lock() | ||
defer s.mutex.Unlock() | ||
|
||
if s.users[user.Username] == nil { | ||
return ErrAlreadyExists | ||
} | ||
s.users[user.Username] = user.Clone() | ||
return nil | ||
} | ||
|
||
// Find query user by username | ||
func (s *MemoryUserStore) Find(username string) (*model.User, error) { | ||
s.mutex.RLock() | ||
defer s.mutex.RUnlock() | ||
|
||
user := s.users[username] | ||
if user == nil { | ||
return nil, nil | ||
} | ||
return user.Clone(), nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters