mirror of
https://github.com/steveiliop56/tinyauth.git
synced 2026-02-28 11:52:06 +00:00
Compare commits
5 Commits
dependabot
...
feat/oidc-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e4f4c25ece | ||
|
|
3531adfbb5 | ||
|
|
6fe1743238 | ||
|
|
24d50366e9 | ||
|
|
79dc8edb9d |
43
cmd/tinyauth/create_oidc_client.go
Normal file
43
cmd/tinyauth/create_oidc_client.go
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"regexp"
|
||||||
|
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"github.com/steveiliop56/tinyauth/internal/utils"
|
||||||
|
"github.com/traefik/paerser/cli"
|
||||||
|
)
|
||||||
|
|
||||||
|
func createOidcClientCmd() *cli.Command {
|
||||||
|
return &cli.Command{
|
||||||
|
Name: "create",
|
||||||
|
Description: "Create a new OIDC Client",
|
||||||
|
Configuration: nil,
|
||||||
|
Resources: nil,
|
||||||
|
AllowArg: true,
|
||||||
|
Run: func(args []string) error {
|
||||||
|
if len(args) == 0 {
|
||||||
|
return errors.New("client name is required. use tinyauth oidc create <name>")
|
||||||
|
}
|
||||||
|
|
||||||
|
clientName := args[0]
|
||||||
|
|
||||||
|
match, err := regexp.MatchString("^[a-zA-Z0-9-]*$", clientName)
|
||||||
|
|
||||||
|
if !match || err != nil {
|
||||||
|
return errors.New("client name can only contain alphanumeric characters and hyphens")
|
||||||
|
}
|
||||||
|
|
||||||
|
uuid := uuid.New()
|
||||||
|
clientId := uuid.String()
|
||||||
|
clientSecret := "ta-" + utils.GenerateString(61)
|
||||||
|
|
||||||
|
fmt.Printf("Client Name: %s\n", clientName)
|
||||||
|
fmt.Printf("Client ID: %s\n", clientId)
|
||||||
|
fmt.Printf("Client Secret: %s\n", clientSecret)
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -23,7 +23,7 @@ func main() {
|
|||||||
|
|
||||||
cmdTinyauth := &cli.Command{
|
cmdTinyauth := &cli.Command{
|
||||||
Name: "tinyauth",
|
Name: "tinyauth",
|
||||||
Description: "The simplest way to protect your apps with a login screen.",
|
Description: "The simplest way to protect your apps with a login screen",
|
||||||
Configuration: tConfig,
|
Configuration: tConfig,
|
||||||
Resources: loaders,
|
Resources: loaders,
|
||||||
Run: func(_ []string) error {
|
Run: func(_ []string) error {
|
||||||
@@ -33,12 +33,17 @@ func main() {
|
|||||||
|
|
||||||
cmdUser := &cli.Command{
|
cmdUser := &cli.Command{
|
||||||
Name: "user",
|
Name: "user",
|
||||||
Description: "Utilities for creating and verifying Tinyauth users.",
|
Description: "Manage Tinyauth users",
|
||||||
}
|
}
|
||||||
|
|
||||||
cmdTotp := &cli.Command{
|
cmdTotp := &cli.Command{
|
||||||
Name: "totp",
|
Name: "totp",
|
||||||
Description: "Utilities for creating Tinyauth TOTP users.",
|
Description: "Manage Tinyauth TOTP users",
|
||||||
|
}
|
||||||
|
|
||||||
|
cmdOidc := &cli.Command{
|
||||||
|
Name: "oidc",
|
||||||
|
Description: "Manage Tinyauth OIDC clients",
|
||||||
}
|
}
|
||||||
|
|
||||||
err := cmdTinyauth.AddCommand(versionCmd())
|
err := cmdTinyauth.AddCommand(versionCmd())
|
||||||
@@ -71,6 +76,12 @@ func main() {
|
|||||||
log.Fatal().Err(err).Msg("Failed to add create command")
|
log.Fatal().Err(err).Msg("Failed to add create command")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = cmdOidc.AddCommand(createOidcClientCmd())
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal().Err(err).Msg("Failed to add create command")
|
||||||
|
}
|
||||||
|
|
||||||
err = cmdTinyauth.AddCommand(cmdUser)
|
err = cmdTinyauth.AddCommand(cmdUser)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -83,6 +94,12 @@ func main() {
|
|||||||
log.Fatal().Err(err).Msg("Failed to add totp command")
|
log.Fatal().Err(err).Msg("Failed to add totp command")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = cmdTinyauth.AddCommand(cmdOidc)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal().Err(err).Msg("Failed to add oidc command")
|
||||||
|
}
|
||||||
|
|
||||||
err = cli.Execute(cmdTinyauth)
|
err = cli.Execute(cmdTinyauth)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ func verifyUserCmd() *cli.Command {
|
|||||||
|
|
||||||
return &cli.Command{
|
return &cli.Command{
|
||||||
Name: "verify",
|
Name: "verify",
|
||||||
Description: "Verify a user is set up correctly.",
|
Description: "Verify a user is set up correctly",
|
||||||
Configuration: tCfg,
|
Configuration: tCfg,
|
||||||
Resources: loaders,
|
Resources: loaders,
|
||||||
Run: func(_ []string) error {
|
Run: func(_ []string) error {
|
||||||
@@ -11,7 +11,7 @@ import (
|
|||||||
func versionCmd() *cli.Command {
|
func versionCmd() *cli.Command {
|
||||||
return &cli.Command{
|
return &cli.Command{
|
||||||
Name: "version",
|
Name: "version",
|
||||||
Description: "Print the version number of Tinyauth.",
|
Description: "Print the version number of Tinyauth",
|
||||||
Configuration: nil,
|
Configuration: nil,
|
||||||
Resources: nil,
|
Resources: nil,
|
||||||
Run: func(_ []string) error {
|
Run: func(_ []string) error {
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package controller
|
package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/rand"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
@@ -145,7 +144,7 @@ func (controller *OIDCController) Authorize(c *gin.Context) {
|
|||||||
|
|
||||||
// WARNING: Since Tinyauth is stateless, we cannot have a sub that never changes. We will just create a uuid out of the username and client name which remains stable, but if username or client name changes then sub changes too.
|
// WARNING: Since Tinyauth is stateless, we cannot have a sub that never changes. We will just create a uuid out of the username and client name which remains stable, but if username or client name changes then sub changes too.
|
||||||
sub := utils.GenerateUUID(fmt.Sprintf("%s:%s", userContext.Username, client.ID))
|
sub := utils.GenerateUUID(fmt.Sprintf("%s:%s", userContext.Username, client.ID))
|
||||||
code := rand.Text()
|
code := utils.GenerateString(32)
|
||||||
|
|
||||||
// Before storing the code, delete old session
|
// Before storing the code, delete old session
|
||||||
err = controller.oidc.DeleteOldSession(c, sub)
|
err = controller.oidc.DeleteOldSession(c, sub)
|
||||||
|
|||||||
@@ -403,8 +403,8 @@ func (service *OIDCService) GenerateAccessToken(c *gin.Context, client config.OI
|
|||||||
return TokenResponse{}, err
|
return TokenResponse{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
accessToken := rand.Text()
|
accessToken := utils.GenerateString(32)
|
||||||
refreshToken := rand.Text()
|
refreshToken := utils.GenerateString(32)
|
||||||
|
|
||||||
tokenExpiresAt := time.Now().Add(time.Duration(service.config.SessionExpiry) * time.Second).Unix()
|
tokenExpiresAt := time.Now().Add(time.Duration(service.config.SessionExpiry) * time.Second).Unix()
|
||||||
|
|
||||||
@@ -464,8 +464,8 @@ func (service *OIDCService) RefreshAccessToken(c *gin.Context, refreshToken stri
|
|||||||
return TokenResponse{}, err
|
return TokenResponse{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
accessToken := rand.Text()
|
accessToken := utils.GenerateString(32)
|
||||||
newRefreshToken := rand.Text()
|
newRefreshToken := utils.GenerateString(32)
|
||||||
|
|
||||||
tokenExpiresAt := time.Now().Add(time.Duration(service.config.SessionExpiry) * time.Second).Unix()
|
tokenExpiresAt := time.Now().Add(time.Duration(service.config.SessionExpiry) * time.Second).Unix()
|
||||||
refrshTokenExpiresAt := time.Now().Add(time.Duration(service.config.SessionExpiry*2) * time.Second).Unix()
|
refrshTokenExpiresAt := time.Now().Add(time.Duration(service.config.SessionExpiry*2) * time.Second).Unix()
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package utils
|
package utils
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/rand"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"errors"
|
"errors"
|
||||||
"net"
|
"net"
|
||||||
@@ -105,3 +106,9 @@ func GenerateUUID(str string) string {
|
|||||||
uuid := uuid.NewSHA1(uuid.NameSpaceURL, []byte(str))
|
uuid := uuid.NewSHA1(uuid.NameSpaceURL, []byte(str))
|
||||||
return uuid.String()
|
return uuid.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GenerateString(length int) string {
|
||||||
|
src := make([]byte, length)
|
||||||
|
rand.Read(src)
|
||||||
|
return base64.RawURLEncoding.EncodeToString(src)[:length]
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user