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
|
}
|