mirror of
https://github.com/APIParkLab/APIPark.git
synced 2026-06-14 20:41:15 +08:00
89 lines
1.8 KiB
Go
89 lines
1.8 KiB
Go
package auth_driver
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
|
|
application_authorization_dto "github.com/APIParkLab/APIPark/module/application-authorization/dto"
|
|
)
|
|
|
|
type IAuth interface {
|
|
GenerateID(position string, tokenName string) string
|
|
Type() string
|
|
AuthConfig() IAuthConfig
|
|
}
|
|
|
|
type IAuthConfig interface {
|
|
ID() string
|
|
Valid() ([]byte, error)
|
|
Detail() []application_authorization_dto.DetailItem
|
|
}
|
|
|
|
type Auth struct {
|
|
driver string
|
|
authConfig IAuthConfig
|
|
}
|
|
|
|
func (a *Auth) GenerateID(position string, tokenName string) string {
|
|
return fmt.Sprintf("%s-%s-%s-%s", position, tokenName, a.driver, a.authConfig.ID())
|
|
}
|
|
|
|
func (a *Auth) Type() string {
|
|
return a.driver
|
|
}
|
|
|
|
func (a *Auth) AuthConfig() IAuthConfig {
|
|
return a.authConfig
|
|
}
|
|
|
|
type IFactory interface {
|
|
Create(config interface{}) (IAuth, error)
|
|
}
|
|
|
|
type Factory[T any] struct {
|
|
driver string
|
|
}
|
|
|
|
func NewFactory[T any](driver string) *Factory[T] {
|
|
return &Factory[T]{driver: driver}
|
|
}
|
|
|
|
func (f *Factory[T]) Create(config interface{}) (IAuth, error) {
|
|
cfg, err := generateStruct[T](config)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
authConfig, ok := interface{}(cfg).(IAuthConfig)
|
|
if !ok {
|
|
return nil, fmt.Errorf("no implement IAuthConfig")
|
|
}
|
|
return &Auth{driver: f.driver, authConfig: authConfig}, nil
|
|
}
|
|
|
|
func generateStruct[T any](cfg interface{}) (*T, error) {
|
|
result := new(T)
|
|
switch c := cfg.(type) {
|
|
case string:
|
|
err := json.Unmarshal([]byte(c), result)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
case []byte:
|
|
err := json.Unmarshal(c, result)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
case *map[string]interface{}, map[string]interface{}:
|
|
data, err := json.Marshal(c)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
err = json.Unmarshal(data, result)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
return result, nil
|
|
}
|