forked from razonyang/clevergo-examples
-
Notifications
You must be signed in to change notification settings - Fork 0
/
users.go
61 lines (52 loc) · 1.62 KB
/
users.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package core
import (
"fmt"
"strconv"
"github.com/alexedwards/scs/v2"
"github.com/clevergo/auth"
"github.com/clevergo/auth/authenticators"
"github.com/clevergo/demo/internal/oldmodels"
"github.com/clevergo/demo/pkg/sqlex"
"github.com/clevergo/demo/pkg/users"
)
func NewUserManager(identityStore auth.IdentityStore, sessionManager *scs.SessionManager) *users.Manager {
m := users.New(identityStore)
m.SetSessionManager(sessionManager)
return m
}
// IdentityStore is an identity store.
type IdentityStore struct {
db *sqlex.DB
manager *JWTManager
}
// NewIdentityStore returns an identity store instance.
func NewIdentityStore(db *sqlex.DB, manager *JWTManager) auth.IdentityStore {
return &IdentityStore{db: db, manager: manager}
}
// GetIdentity implements IdentityStore.GetIdentity.
func (s *IdentityStore) GetIdentity(id string) (auth.Identity, error) {
intID, err := strconv.ParseInt(id, 10, 64)
if err != nil {
return nil, fmt.Errorf("invalid ID %q: %s", id, err)
}
user, err := oldmodels.GetUser(s.db, intID)
return user, err
}
// GetIdentityByToken implements IdentityStore.GetIdentityByToken.
func (s *IdentityStore) GetIdentityByToken(token, tokenType string) (auth.Identity, error) {
claims, err := s.manager.Parse(token)
if err != nil {
return nil, err
}
user, err := oldmodels.GetUser(s.db, claims.Subject)
if err != nil {
return nil, err
}
return user, nil
}
func NewAuthenticator(identityStore auth.IdentityStore) auth.Authenticator {
return authenticators.NewComposite(
authenticators.NewBearerToken("api", identityStore),
authenticators.NewQueryToken("access_token", identityStore),
)
}