mirror of
https://github.com/steveiliop56/tinyauth.git
synced 2025-10-28 20:55:42 +00:00
feat: secrets file
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -9,3 +9,6 @@ docker-compose.test.yml
|
|||||||
|
|
||||||
# users file
|
# users file
|
||||||
users.txt
|
users.txt
|
||||||
|
|
||||||
|
# secret test file
|
||||||
|
secret.txt
|
||||||
39
cmd/root.go
39
cmd/root.go
@@ -1,6 +1,7 @@
|
|||||||
package cmd
|
package cmd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strings"
|
||||||
cmd "tinyauth/cmd/user"
|
cmd "tinyauth/cmd/user"
|
||||||
"tinyauth/internal/api"
|
"tinyauth/internal/api"
|
||||||
"tinyauth/internal/auth"
|
"tinyauth/internal/auth"
|
||||||
@@ -32,32 +33,20 @@ var rootCmd = &cobra.Command{
|
|||||||
validateErr := validator.Struct(config)
|
validateErr := validator.Struct(config)
|
||||||
HandleError(validateErr, "Invalid config")
|
HandleError(validateErr, "Invalid config")
|
||||||
|
|
||||||
// Parse users
|
// Users
|
||||||
log.Info().Msg("Parsing users")
|
log.Info().Msg("Parsing users")
|
||||||
|
users, usersErr := utils.GetUsers(config.Users, config.UsersFile)
|
||||||
|
HandleError(usersErr, "Failed to parse users")
|
||||||
|
|
||||||
if config.UsersFile == "" && config.Users == "" {
|
// Secrets
|
||||||
log.Fatal().Msg("No users provided")
|
log.Info().Msg("Parsing secrets")
|
||||||
}
|
|
||||||
|
|
||||||
usersString := config.Users
|
config.GithubClientSecret = utils.GetSecret(config.GithubClientSecret, config.GithubClientSecretFile)
|
||||||
|
config.GoogleClientSecret = utils.GetSecret(config.GoogleClientSecret, config.GoogleClientSecretFile)
|
||||||
if config.UsersFile != "" {
|
config.GenericClientSecret = utils.GetSecret(config.GenericClientSecret, config.GenericClientSecretFile)
|
||||||
log.Info().Msg("Reading users from file")
|
|
||||||
usersFromFile, readErr := utils.GetUsersFromFile(config.UsersFile)
|
|
||||||
HandleError(readErr, "Failed to read users from file")
|
|
||||||
usersFromFileParsed := utils.ParseFileToLine(usersFromFile)
|
|
||||||
if usersString != "" {
|
|
||||||
usersString = usersString + "," + usersFromFileParsed
|
|
||||||
} else {
|
|
||||||
usersString = usersFromFileParsed
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
users, parseErr := utils.ParseUsers(usersString)
|
|
||||||
HandleError(parseErr, "Failed to parse users")
|
|
||||||
|
|
||||||
// Create oauth whitelist
|
// Create oauth whitelist
|
||||||
oauthWhitelist := utils.ParseCommaString(config.OAuthWhitelist)
|
oauthWhitelist := strings.Split(config.OAuthWhitelist, ",")
|
||||||
|
|
||||||
// Create OAuth config
|
// Create OAuth config
|
||||||
oauthConfig := types.OAuthConfig{
|
oauthConfig := types.OAuthConfig{
|
||||||
@@ -67,7 +56,7 @@ var rootCmd = &cobra.Command{
|
|||||||
GoogleClientSecret: config.GoogleClientSecret,
|
GoogleClientSecret: config.GoogleClientSecret,
|
||||||
GenericClientId: config.GenericClientId,
|
GenericClientId: config.GenericClientId,
|
||||||
GenericClientSecret: config.GenericClientSecret,
|
GenericClientSecret: config.GenericClientSecret,
|
||||||
GenericScopes: utils.ParseCommaString(config.GenericScopes),
|
GenericScopes: strings.Split(config.GenericScopes, ","),
|
||||||
GenericAuthURL: config.GenericAuthURL,
|
GenericAuthURL: config.GenericAuthURL,
|
||||||
GenericTokenURL: config.GenericTokenURL,
|
GenericTokenURL: config.GenericTokenURL,
|
||||||
GenericUserURL: config.GenericUserURL,
|
GenericUserURL: config.GenericUserURL,
|
||||||
@@ -131,10 +120,13 @@ func init() {
|
|||||||
rootCmd.Flags().Bool("cookie-secure", false, "Send cookie over secure connection only.")
|
rootCmd.Flags().Bool("cookie-secure", false, "Send cookie over secure connection only.")
|
||||||
rootCmd.Flags().String("github-client-id", "", "Github OAuth client ID.")
|
rootCmd.Flags().String("github-client-id", "", "Github OAuth client ID.")
|
||||||
rootCmd.Flags().String("github-client-secret", "", "Github OAuth client secret.")
|
rootCmd.Flags().String("github-client-secret", "", "Github OAuth client secret.")
|
||||||
|
rootCmd.Flags().String("github-client-secret-file", "", "Github OAuth client secret file.")
|
||||||
rootCmd.Flags().String("google-client-id", "", "Google OAuth client ID.")
|
rootCmd.Flags().String("google-client-id", "", "Google OAuth client ID.")
|
||||||
rootCmd.Flags().String("google-client-secret", "", "Google OAuth client secret.")
|
rootCmd.Flags().String("google-client-secret", "", "Google OAuth client secret.")
|
||||||
|
rootCmd.Flags().String("google-client-secret-file", "", "Google OAuth client secret file.")
|
||||||
rootCmd.Flags().String("generic-client-id", "", "Generic OAuth client ID.")
|
rootCmd.Flags().String("generic-client-id", "", "Generic OAuth client ID.")
|
||||||
rootCmd.Flags().String("generic-client-secret", "", "Generic OAuth client secret.")
|
rootCmd.Flags().String("generic-client-secret", "", "Generic OAuth client secret.")
|
||||||
|
rootCmd.Flags().String("generic-client-secret-file", "", "Generic OAuth client secret file.")
|
||||||
rootCmd.Flags().String("generic-scopes", "", "Generic OAuth scopes.")
|
rootCmd.Flags().String("generic-scopes", "", "Generic OAuth scopes.")
|
||||||
rootCmd.Flags().String("generic-auth-url", "", "Generic OAuth auth URL.")
|
rootCmd.Flags().String("generic-auth-url", "", "Generic OAuth auth URL.")
|
||||||
rootCmd.Flags().String("generic-token-url", "", "Generic OAuth token URL.")
|
rootCmd.Flags().String("generic-token-url", "", "Generic OAuth token URL.")
|
||||||
@@ -151,10 +143,13 @@ func init() {
|
|||||||
viper.BindEnv("cookie-secure", "COOKIE_SECURE")
|
viper.BindEnv("cookie-secure", "COOKIE_SECURE")
|
||||||
viper.BindEnv("github-client-id", "GITHUB_CLIENT_ID")
|
viper.BindEnv("github-client-id", "GITHUB_CLIENT_ID")
|
||||||
viper.BindEnv("github-client-secret", "GITHUB_CLIENT_SECRET")
|
viper.BindEnv("github-client-secret", "GITHUB_CLIENT_SECRET")
|
||||||
|
viper.BindEnv("github-client-secret-file", "GITHUB_CLIENT_SECRET_FILE")
|
||||||
viper.BindEnv("google-client-id", "GOOGLE_CLIENT_ID")
|
viper.BindEnv("google-client-id", "GOOGLE_CLIENT_ID")
|
||||||
viper.BindEnv("google-client-secret", "GOOGLE_CLIENT_SECRET")
|
viper.BindEnv("google-client-secret", "GOOGLE_CLIENT_SECRET")
|
||||||
|
viper.BindEnv("google-client-secret-file", "GOOGLE_CLIENT_SECRET_FILE")
|
||||||
viper.BindEnv("generic-client-id", "GENERIC_CLIENT_ID")
|
viper.BindEnv("generic-client-id", "GENERIC_CLIENT_ID")
|
||||||
viper.BindEnv("generic-client-secret", "GENERIC_CLIENT_SECRET")
|
viper.BindEnv("generic-client-secret", "GENERIC_CLIENT_SECRET")
|
||||||
|
viper.BindEnv("generic-client-secret-file", "GENERIC_CLIENT_SECRET_FILE")
|
||||||
viper.BindEnv("generic-scopes", "GENERIC_SCOPES")
|
viper.BindEnv("generic-scopes", "GENERIC_SCOPES")
|
||||||
viper.BindEnv("generic-auth-url", "GENERIC_AUTH_URL")
|
viper.BindEnv("generic-auth-url", "GENERIC_AUTH_URL")
|
||||||
viper.BindEnv("generic-token-url", "GENERIC_TOKEN_URL")
|
viper.BindEnv("generic-token-url", "GENERIC_TOKEN_URL")
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ func (auth *Auth) GetUser(username string) *types.User {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (auth *Auth) CheckPassword(user types.User, password string) bool {
|
func (auth *Auth) CheckPassword(user types.User, password string) bool {
|
||||||
hashedPasswordErr := bcrypt.CompareHashAndPassword([]byte(user.Username), []byte(password))
|
hashedPasswordErr := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password))
|
||||||
return hashedPasswordErr == nil
|
return hashedPasswordErr == nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,26 +19,29 @@ type User struct {
|
|||||||
type Users []User
|
type Users []User
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
Port int `validate:"number" mapstructure:"port"`
|
Port int `validate:"number" mapstructure:"port"`
|
||||||
Address string `mapstructure:"address, ip4_addr"`
|
Address string `mapstructure:"address, ip4_addr"`
|
||||||
Secret string `validate:"required,len=32" mapstructure:"secret"`
|
Secret string `validate:"required,len=32" mapstructure:"secret"`
|
||||||
AppURL string `validate:"required,url" mapstructure:"app-url"`
|
AppURL string `validate:"required,url" mapstructure:"app-url"`
|
||||||
Users string `mapstructure:"users"`
|
Users string `mapstructure:"users"`
|
||||||
UsersFile string `mapstructure:"users-file"`
|
UsersFile string `mapstructure:"users-file"`
|
||||||
CookieSecure bool `mapstructure:"cookie-secure"`
|
CookieSecure bool `mapstructure:"cookie-secure"`
|
||||||
GithubClientId string `mapstructure:"github-client-id"`
|
GithubClientId string `mapstructure:"github-client-id"`
|
||||||
GithubClientSecret string `mapstructure:"github-client-secret"`
|
GithubClientSecret string `mapstructure:"github-client-secret"`
|
||||||
GoogleClientId string `mapstructure:"google-client-id"`
|
GithubClientSecretFile string `mapstructure:"github-client-secret-file"`
|
||||||
GoogleClientSecret string `mapstructure:"google-client-secret"`
|
GoogleClientId string `mapstructure:"google-client-id"`
|
||||||
GenericClientId string `mapstructure:"generic-client-id"`
|
GoogleClientSecret string `mapstructure:"google-client-secret"`
|
||||||
GenericClientSecret string `mapstructure:"generic-client-secret"`
|
GoogleClientSecretFile string `mapstructure:"google-client-secret-file"`
|
||||||
GenericScopes string `mapstructure:"generic-scopes"`
|
GenericClientId string `mapstructure:"generic-client-id"`
|
||||||
GenericAuthURL string `mapstructure:"generic-auth-url"`
|
GenericClientSecret string `mapstructure:"generic-client-secret"`
|
||||||
GenericTokenURL string `mapstructure:"generic-token-url"`
|
GenericClientSecretFile string `mapstructure:"generic-client-secret-file"`
|
||||||
GenericUserURL string `mapstructure:"generic-user-info-url"`
|
GenericScopes string `mapstructure:"generic-scopes"`
|
||||||
DisableContinue bool `mapstructure:"disable-continue"`
|
GenericAuthURL string `mapstructure:"generic-auth-url"`
|
||||||
OAuthWhitelist string `mapstructure:"oauth-whitelist"`
|
GenericTokenURL string `mapstructure:"generic-token-url"`
|
||||||
CookieExpiry int `mapstructure:"cookie-expiry"`
|
GenericUserURL string `mapstructure:"generic-user-info-url"`
|
||||||
|
DisableContinue bool `mapstructure:"disable-continue"`
|
||||||
|
OAuthWhitelist string `mapstructure:"oauth-whitelist"`
|
||||||
|
CookieExpiry int `mapstructure:"cookie-expiry"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type UserContext struct {
|
type UserContext struct {
|
||||||
|
|||||||
@@ -44,14 +44,14 @@ func GetRootURL(urlSrc string) (string, error) {
|
|||||||
return urlFinal, nil
|
return urlFinal, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetUsersFromFile(usersFile string) (string, error) {
|
func ReadFile(file string) (string, error) {
|
||||||
_, statErr := os.Stat(usersFile)
|
_, statErr := os.Stat(file)
|
||||||
|
|
||||||
if statErr != nil {
|
if statErr != nil {
|
||||||
return "", statErr
|
return "", statErr
|
||||||
}
|
}
|
||||||
|
|
||||||
data, readErr := os.ReadFile(usersFile)
|
data, readErr := os.ReadFile(file)
|
||||||
|
|
||||||
if readErr != nil {
|
if readErr != nil {
|
||||||
return "", readErr
|
return "", readErr
|
||||||
@@ -75,9 +75,43 @@ func ParseFileToLine(content string) string {
|
|||||||
return strings.Join(users, ",")
|
return strings.Join(users, ",")
|
||||||
}
|
}
|
||||||
|
|
||||||
func ParseCommaString(str string) []string {
|
func GetSecret(env string, file string) string {
|
||||||
if str == "" {
|
if env == "" && file == "" {
|
||||||
return []string{}
|
return ""
|
||||||
}
|
}
|
||||||
return strings.Split(str, ",")
|
|
||||||
|
if env != "" {
|
||||||
|
return env
|
||||||
|
}
|
||||||
|
|
||||||
|
contents, err := ReadFile(file)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
return contents
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetUsers(env string, file string) (types.Users, error) {
|
||||||
|
var users string
|
||||||
|
|
||||||
|
if env == "" && file == "" {
|
||||||
|
return types.Users{}, errors.New("no users provided")
|
||||||
|
}
|
||||||
|
|
||||||
|
if env != "" {
|
||||||
|
users += env
|
||||||
|
}
|
||||||
|
|
||||||
|
if file != "" {
|
||||||
|
fileContents, fileErr := ReadFile(file)
|
||||||
|
|
||||||
|
if fileErr == nil {
|
||||||
|
users += ","
|
||||||
|
users += ParseFileToLine(fileContents)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ParseUsers(users)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user