zhangzengfei
2023-09-04 e8e536d1cb52d2126c8c7ce2ba1c7a76f7208678
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package auth
 
import (
    "github.com/go-oauth2/oauth2/v4/errors"
    "github.com/go-oauth2/oauth2/v4/manage"
    "github.com/go-oauth2/oauth2/v4/models"
    "github.com/go-oauth2/oauth2/v4/server"
    "github.com/go-oauth2/oauth2/v4/store"
    "math/rand"
    oauth2gorm "src.techknowlogick.com/oauth2-gorm"
    "basic.com/valib/logger.git"
    "net/http"
    "time"
    vamicroModel "vamicro/api-gateway/models"
    "vamicro/extend/util"
)
 
var (
    Oauth2Serv  *server.Server
    ClientStore *store.ClientStore
    AclList     = make(map[string]bool, 0)
    //    store = oauth2gorm.NewStore(oauth2gorm.NewConfig("../config/oauth2.db", oauth2gorm.SQLite, ""), 1)
)
 
func Oauth2Init() {
    manager := manage.NewDefaultManager()
    //manager.SetAuthorizeCodeTokenCfg(manage.DefaultAuthorizeCodeTokenCfg)
    tokenStore := oauth2gorm.NewStore(oauth2gorm.NewConfig("../oauth2.db", oauth2gorm.SQLite, "tokens"), 6000)
    // token store
    manager.MustTokenStorage(tokenStore, nil)
    // generate jwt access token
    // manager.MapAccessGenerate(generates.NewJWTAccessGenerate("", []byte("00000000"), jwt.SigningMethodHS512))
    //manager.MapAccessGenerate(generates.NewAccessGenerate())
 
    ClientStore = store.NewClientStore()
    var oauth2Model vamicroModel.Oauth2Client
    clients, err := oauth2Model.FindAll()
    if err == nil {
        for _, client := range clients {
            ClientStore.Set(client.ID, &models.Client{
                ID:     client.ID,
                Secret: client.Secret,
                Domain: client.Domain,
            })
        }
    }
 
    manager.MapClientStorage(ClientStore)
 
    Oauth2Serv = server.NewServer(server.NewConfig(), manager)
 
    //Oauth2Serv = server.NewDefaultServer(manager)
    Oauth2Serv.SetAllowGetAccessRequest(true)
    /**
    Oauth2Serv.SetPasswordAuthorizationHandler(func(username, password string) (userID string, err error) {
        if username == "test" && password == "test" {
            userID = "test"
        }
        return
    })**/
    Oauth2Serv.SetClientInfoHandler(server.ClientFormHandler)
    Oauth2Serv.SetUserAuthorizationHandler(userAuthorizeHandler)
 
    Oauth2Serv.SetInternalErrorHandler(func(err error) (re *errors.Response) {
        logger.Error("Internal Error:", err.Error())
        return
    })
 
    Oauth2Serv.SetResponseErrorHandler(func(re *errors.Response) {
        logger.Error("Response Error:", re.Error.Error())
    })
 
    logger.Debug("Oauth2Serv init down")
}
 
func userAuthorizeHandler(w http.ResponseWriter, r *http.Request) (userID string, err error) {
    userID = r.Header.Get("Login_user_id")
    return
}
 
func NewClient(domain string, intro string) error {
    r := rand.New(rand.NewSource(time.Now().Unix()))
    bytes := make([]byte, 32)
    for i := 0; i < 32; i++ {
        b := r.Intn(26) + 65
        bytes[i] = byte(b)
    }
    secret := string(bytes)
    clent := vamicroModel.Oauth2Client{ID: util.PseudoUuid(), Domain: domain, Secret: secret, Intro: intro}
    ClientStore.Set(clent.ID, &models.Client{
        ID:     clent.ID,
        Secret: clent.Secret,
        Domain: clent.Domain,
    })
    return clent.Insert()
}
 
func DelClient(id string) error {
    var oauth2c vamicroModel.Oauth2Client
    return oauth2c.DeleteById(id)
}
 
func AclInit(operations []vamicroModel.Operations) {
    for _, item := range operations {
        AclList[item.Path] = item.ApiEnable
    }
}
 
func CheckAcl(path string) bool {
    pass, ok := AclList[path]
    return ok && pass
}