121 lines
3.3 KiB
Go
121 lines
3.3 KiB
Go
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()
|
|
}
|