rainbowhatto

package module
v0.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 18, 2023 License: MIT Imports: 4 Imported by: 0

README

🌈 Rainbow Hatto

Rainbow Hatto is the authentication and authorization package for Golang.

The authentication is based on Jwt (Json Web Token) and the authentication methodology is based on role-based access control (RBAC)

Content

Installation

go get github.com/Rayato159/rainbowhatto

Function

func BuildToken(alg src.SignAlgorithm, cfg Config) src.IToken {...}
func ReverseHMACToken(token string, secret string) (*Claims, error) {...}
func ReverseRSAToken(token string, path string) (*Claims, error) {...}
func RefreshToken(alg src.SignAlgorithm, token string, cfg Config) (src.IToken, error) {...}

Type

SignAlgorithm

Just call a below function to get a SignAlgorithm type

func HMAC() src.SignAlgorithm {...} // return HMAC type
func RSA() src.SignAlgorithm {...} // return RSA type

Claims

type Claims struct {
	*src.NewClaims `json:"claims"`
}

type NewClaims struct {
	Claims any `json:"claims"`
	jwt.RegisteredClaims
}

Detail of registered claims

ID:        xid,
Issuer:    "rainbowhatto",
Subject:   "rainbowtoken",
Audience:  ["human"],
ExpiresAt: time exp,
NotBefore: time now,
IssuedAt:  time now,

Quickstart

HMAC token (Symmetric key)

Sign Token

func main() {
	token, err = rainbowhatto.BuildToken(rainbowhatto.HMAC(), rainbowhatto.Config{
		ExpiresAt: 86400,
		HMAC: &rainbowhatto.HMACConfig{
			Secret: "super-secret",
		},
		Claims: claims{
			Id:   "abdcefg1234",
			Name: "rainbow",
		},
	})
	if err != nil {
		panic(err)
	}
	fmt.Println(token.SignToken())
}

Parse Token

func main() {
    token := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjbGFpbXMiOnsiSWQiOiJhYmRjZWZnMTIzNCIsIk5hbWUiOiJyYWluYm93In0sImlzcyI6InJhaW5ib3doYXR0byIsInN1YiI6InJhaW5ib3d0b2tlbiIsImF1ZCI6WyJodW1hbiJdLCJleHAiOjE2NzY4MjcxMzIsIm5iZiI6MTY3Njc0MDczMiwiaWF0IjoxNjc2NzQwNzMyLCJqdGkiOiJjZm9nZ3Y2bmRyYzBibjRyOGQ4MCJ9.lzBu_zRgtc0oTqkZyjatJu7u8PGeBXALcICdTf7zUcs"
    claims, err := rainbowhatto.ReverseHMACToken(token, "super-secret")
    if err != nil {
        panic(err)
    }
    fmt.Println(claims)
}

Refresh Token

func main() {
    oldToken := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjbGFpbXMiOnsiSWQiOiJhYmRjZWZnMTIzNCIsIk5hbWUiOiJyYWluYm93In0sImlzcyI6InJhaW5ib3doYXR0byIsInN1YiI6InJhaW5ib3d0b2tlbiIsImF1ZCI6WyJodW1hbiJdLCJleHAiOjE2NzY4MjcxMzIsIm5iZiI6MTY3Njc0MDczMiwiaWF0IjoxNjc2NzQwNzMyLCJqdGkiOiJjZm9nZ3Y2bmRyYzBibjRyOGQ4MCJ9.lzBu_zRgtc0oTqkZyjatJu7u8PGeBXALcICdTf7zUcs"

    newToken, err = rainbowhatto.RefreshToken(rainbowhatto.HMAC(), oldToken, rainbowhatto.Config{
		ExpiresAt: 0,
		HMAC: &rainbowhatto.HMACConfig{
			Secret: "super-secret",
		},
		Claims: claims{
			Id:   "abdcefg1234",
			Name: "rainbow",
		},
	})
	if err != nil {
		panic(err)
	}
	fmt.Println(newToken.SignToken())
}

RSA token (asymmetric key)

First Generate a .pem key by the following command as below

# Gen a private key (the number is just a bytes)
openssl genrsa -out <file_name>.pem 2048

# Get a public key
openssl rsa -in <file_name>.pem -pubout -out public.pem

Sign Token

func main() {
	token, err = rainbowhatto.BuildToken(rainbowhatto.RSA(), rainbowhatto.Config{
		ExpiresAt: 86400,
		RSA: &rainbowhatto.RSAConfig{
			PrivateKey: "./private_key.pem",
		},
		Claims: claims{
			Id:   "abdcefg1234",
			Name: "rainbow",
		},
	})
	if err != nil {
		panic(err)
	}
	fmt.Println(token.SignToken())
}

Parse Token

func main() {
    token := "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJjbGFpbXMiOnsiSWQiOiJhYmRjZWZnMTIzNCIsIk5hbWUiOiJyYWluYm93In0sImlzcyI6InJhaW5ib3doYXR0byIsInN1YiI6InJhaW5ib3d0b2tlbiIsImF1ZCI6WyJodW1hbiJdLCJleHAiOjE2NzY4MjcxNTIsIm5iZiI6MTY3Njc0MDc1MiwiaWF0IjoxNjc2NzQwNzUyLCJqdGkiOiJjZm9naDQ2bmRyYzRwODc0MHBjZyJ9.NSB3DoBjw4XNkiB8_Cnw29qioVp1Y9nRBj5To-k-_yldx74hquGEvni7ZyHio_eAoPRAbi8EdZNNtLyt0wSl3bLvzgsl4b5fvHnVfcp55i9lyUH0odDHnNXq7fWOcNqH4QaMVF2LcJ66AffjDgiePbR7ob8YyovgMDYjU4x73wkyrzNqAJBugbjgBX9g1wd-aGo9N1i0sYas6YBMRbQAhl4XrtVpZj-YQkHePYYrU6Xt6DiE5vhtAuiDRqD4B9gXOStHV6VtLVnjAFJSFidYAXjV0GKzdaOl84yddNL2ZSwFf6JcD4AJ7AGuIlXmA7EC5yC5pwKjVNcFopVZjUKjyA"
    claims, err := rainbowhatto.ReverseHMACToken(token, "./public.pem") // Public key path
    if err != nil {
        panic(err)
    }
    fmt.Println(claims)
}

Refresh Token

func main() {
    oldToken := "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJjbGFpbXMiOnsiSWQiOiJhYmRjZWZnMTIzNCIsIk5hbWUiOiJyYWluYm93In0sImlzcyI6InJhaW5ib3doYXR0byIsInN1YiI6InJhaW5ib3d0b2tlbiIsImF1ZCI6WyJodW1hbiJdLCJleHAiOjE2NzY4MjcxNTIsIm5iZiI6MTY3Njc0MDc1MiwiaWF0IjoxNjc2NzQwNzUyLCJqdGkiOiJjZm9naDQ2bmRyYzRwODc0MHBjZyJ9.NSB3DoBjw4XNkiB8_Cnw29qioVp1Y9nRBj5To-k-_yldx74hquGEvni7ZyHio_eAoPRAbi8EdZNNtLyt0wSl3bLvzgsl4b5fvHnVfcp55i9lyUH0odDHnNXq7fWOcNqH4QaMVF2LcJ66AffjDgiePbR7ob8YyovgMDYjU4x73wkyrzNqAJBugbjgBX9g1wd-aGo9N1i0sYas6YBMRbQAhl4XrtVpZj-YQkHePYYrU6Xt6DiE5vhtAuiDRqD4B9gXOStHV6VtLVnjAFJSFidYAXjV0GKzdaOl84yddNL2ZSwFf6JcD4AJ7AGuIlXmA7EC5yC5pwKjVNcFopVZjUKjyA"

    newToken, err = rainbowhatto.RefreshToken(rainbowhatto.RSA(), oldToken, rainbowhatto.Config{
		RSA: &rainbowhatto.RSAConfig{
			PrivateKey: "./private_key.pem",
			PublicKey:  "./public_key.pem",
		},
		Claims: claims{
			Id:   "abdcefg1234",
			Name: "rainbow",
		},
	})
	if err != nil {
		panic(err)
	}
	fmt.Println(newToken.SignToken())
}

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func BuildToken

func BuildToken(alg src.SignAlgorithm, cfg Config) (src.IToken, error)

Factory

func HMAC

func HMAC() src.SignAlgorithm

Sign algorithm

func RSA

func RSA() src.SignAlgorithm

func RefreshToken added in v0.2.0

func RefreshToken(alg src.SignAlgorithm, token string, cfg Config) (src.IToken, error)

Types

type Claims

type Claims struct {
	*src.NewClaims `json:"claims"`
}

func ReverseHMACToken

func ReverseHMACToken(token string, secret string) (*Claims, error)

func ReverseRSAToken

func ReverseRSAToken(token string, path string) (*Claims, error)

type Config

type Config struct {
	// The secret that means a file of .pem key or key in dicectly
	ExpiresAt int64 // Required
	HMAC      *HMACConfig
	RSA       *RSAConfig
	Claims    any // Optional
}

type HMACConfig added in v0.2.0

type HMACConfig struct {
	Secret string // Required
}

type RSAConfig added in v0.2.0

type RSAConfig struct {
	PrivateKey string // Required
	PublicKey  string // Required
}

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL