package main import ( "context" "crypto/rand" "crypto/rsa" "fmt" "log" "os" "github.com/gofiber/fiber/v2" jwt_fiber "github.com/gofiber/jwt/v3" "github.com/golang-jwt/jwt/v4" fga "github.com/openfga/go-sdk" ) const privKeyPEM = ` -----BEGIN RSA PRIVATE KEY----- MIIEogIBAAKCAQEAtezzFs7wK1WqA7lFUOqbCNXkcnHKGs/eIlHHN1MfXN6QjzBU 1yz+d+QeRM986PYttFB041RF+9QoNJcfow26TUhwgY8UEyeh+93hYGWT/grWJn3r lKhZcjOBQ3M9DDsg2oEoRZI7pOwUcoj0OpJHz0dcoj4zrkfY1JPCWLFJbr1QszsX Yy/soga2M5jHyVNtYz/c4JAGjQMZpnA7tGbdsGFvnZDdH1t5naKX+ybAQYItwWjo 9kBwhf1QGoaEVm0gvu9e+VaqKT+qnqMsGqYW29iKWOSerIg1lushZL8TulAPMwFs wzttRvEPqcQzCKYtbNfenmvZJIajA6HYq/lc7QIDAQABAoIBAE201Sxj3dAUuhb3 FvV2EByZCAgeNH55VV+BYL9v4NCRPFv8//AdBuB87rTjj24OYP1I9HR5dZ8YQsgb 2OaToYULMQsV6zQ3VIg5gN/k4266gDhWxr5rnjEacNc3rNbBlsneKy50RMewExfN CczO2J9f0uB2AyspAyPhrTynFT+YIvE8YflbLhUVVNhsSY/yoNTmd/ybNn5tTDQY uT1v4wVw/6QGW1FTAmbR27MN1D+ALfFKyG8xJ5ElfoVWciiy/rneo+Ty1EZF/Z32 DFCt5/pNr9g0hPIlBnCtMOHRUmTbfnHuWiJ0ibaMr6UC+AVgiIUKxpjbQT3hDAkW MX9VTB0CgYEA5Az5/hGYBWkjgsk0atwK5hTyKmnxq/fIvXVReh6PT+dIeEbBkWud kTat4eMZMJA/gGwkxwyBNXodFWYIhWxjiGdIpS2SXiyfQRTZPi1o3VOuw4OiYGBf pb6kwD+dT39QcoOAU+PsQJesONbc4EETrVnPSE3+QW3YBsb2+my2KSsCgYEAzDjP tyqR06rgwCcHF4EDIMizCRXhIXmMKrQyueI2QbtFFzpeTei1HzE5zqia/PlPpmWQ t2ZadBBIhgj+XJF70GTq4v1Mphx8YaMkZlfjRree0vOLTXHmlV8IL/i2SnYTvzRg PPFIUGxN9ICqNMC+syBdTUsnF4GxRbartEQe1kcCgYA3skukF5vvRlxb5tQcfR1U UC1M2o8hluS6ENsTXj9WHoB+j5la8NOM0bPqBVLzn2dC8CaTTqSH8QkFXuQZ4fz1 JXSCkvy6b199v5/HJcQEuhlmutF/hEoX6tXF9kNvVQLK1P8UfggHRoPTZfaP9pTd s5+CYzoDtNYb4aAUTVS3/QKBgF/uG9x9maylKxf3/UPULWT8AeW1qmAwGWCB7wYU Ncpgro6/s0bDljkFxZLG7q8AaaLPONB9uuWkNH0Jwno3OMLmdNOViqjI3sB6gwG0 LSWt4WRUVM5XP6pQzqbCHNcTaik58C8QZBirF19QBSPsmmfIPyusrrtDB8OokDWI fjfHAoGAJEwPDCzGi/4UXd221GaYidif2GW8Dpo2kqZQAC42IQwxuEw3LgWMj0v4 IQEfT6OOYgeMmM5/qJ0RSkox6uvwlUzNpcaFzXAfmu+JNxo2LFvV/dkS+BbZyZ/Z HfmMlyl+W5OXOHodg+R7J/UWupYnPp0TwlWKWYUCfM88KbIl2jk= -----END RSA PRIVATE KEY----- ` var ( privateKey *rsa.PrivateKey ) func createStore() { var api_scheme = os.Getenv("FGA_API_SCHEME") var api_host = os.Getenv("FGA_API_HOST") fmt.Printf("Scheme: %s, Host: %s\n", api_scheme, api_host) // Set fga configuration conf, c_err := fga.NewConfiguration(fga.Configuration{ ApiScheme: api_scheme, ApiHost: api_host, }) // Check for errors if c_err != nil { log.Fatalf("Error during fga configuration creation") os.Exit(1) } // initialize client fga_client := fga.NewAPIClient(conf) store_resp, http_resp, r_err := fga_client.OpenFgaApi.CreateStore(context.Background()).Body( fga.CreateStoreRequest{ Name: fga.PtrString("StoreDemo"), }, ).Execute() if r_err != nil { log.Fatalf("Error creating store") os.Exit(1) } fmt.Println(store_resp) fmt.Println(http_resp) } const PRIV_KEY_SIZE = 2048 func readController(c *fiber.Ctx) error { user := c.Locals("user").(*jwt.Token) claims := user.Claims.(jwt.MapClaims) name := claims["name"].(string) return c.SendString(name + " read " + c.Params("document")) } func runFiber() { app := fiber.New() rng := rand.Reader var err error privateKey, err = rsa.GenerateKey(rng, PRIV_KEY_SIZE) if err != nil { log.Fatalf("rsa.GenerateKey: %v", err) os.Exit(1) } app.Use(jwt_fiber.New(jwt_fiber.Config{ SigningMethod: "RS256", SigningKey: privateKey.Public(), })) app.Get("/read/:document", readController) app.Listen(":9999") } func main() { createStore() runFiber() }