Documentation ¶
Index ¶
- Constants
- Variables
- func AbortWithError(c *gin.Context, code int, message string, errors ...error)
- func AbortWithInternalServerError(c *gin.Context, err error)
- func AccessKeyMiddleware(accessKeyStorage AccessKeyPersister, next gin.HandlerFunc) gin.HandlerFunc
- func AuthenticationHandler(accountBackend storage.IdentityBackend, acceptedAudiences []string, ...) func(c *gin.Context) (any, error)
- func AuthorisationHandler(audiencePrivateKey []byte) func(data any, c *gin.Context) bool
- func BindJSON(c *gin.Context, obj any) error
- func ContextLoggerHandler(c *gin.Context)
- func CtxLogger(c *gin.Context) *zerolog.Logger
- func DelegatedAccessKeyMiddleware(validatorURL string, next gin.HandlerFunc) (gin.HandlerFunc, error)
- func ExtractSecret(claims MapClaims, audiencePrivateKey []byte) (*model.AESKey, error)
- func GetKeyID(key []byte) string
- func GetManagedKey(c *gin.Context) *model.AESKey
- func GetSimpleStatusHandler(c *gin.Context)
- func GetToken(c *gin.Context) string
- func GetUserID(c *gin.Context) string
- func IdentityHandler(c *gin.Context) any
- func JSON(c *gin.Context, code int, obj any)
- func NewAdminAuthenticationHandler(cfg *koanf.Koanf, name string, resolver cmdbase.ParameterResolver) (gin.HandlerFunc, error)
- func NewStaticAPIKeyAuthenticationHandler(ctx context.Context, cfg *koanf.Koanf, key string, ...) (gin.HandlerFunc, error)
- func ParseResponseMessage(res *http.Response) string
- func ReadAudiencePrivateKeyFromString(val string) ([]byte, error)
- func SetRequestLogger(config ...LoggerConfig) gin.HandlerFunc
- func SetupLogging(cfg *koanf.Koanf, prodMode bool) (io.Closer, error)
- func Unauthorized(c *gin.Context, code int, message string)
- type AccessKeyPersister
- type AccountBackend
- type GinJWTMiddleware
- func JWTMiddlewareWithTokenIssuance(realm, issuer string, authenticatorFn func(c *gin.Context) (any, error), ...) (*GinJWTMiddleware, error)
- func JWTMiddlewareWithTokenVerification(realm string, audiencePrivateKey string, rsaPublicKeyFile string, ...) (*GinJWTMiddleware, error)
- func New(m *GinJWTMiddleware) (*GinJWTMiddleware, error)
- func (mw *GinJWTMiddleware) CheckIfTokenExpire(c *gin.Context) (jwt.MapClaims, error)
- func (mw *GinJWTMiddleware) GetClaimsFromJWT(c *gin.Context) (MapClaims, error)
- func (mw *GinJWTMiddleware) LoginHandler(c *gin.Context)
- func (mw *GinJWTMiddleware) LogoutHandler(c *gin.Context)
- func (mw *GinJWTMiddleware) MiddlewareFunc() gin.HandlerFunc
- func (mw *GinJWTMiddleware) MiddlewareInit() error
- func (mw *GinJWTMiddleware) ParseToken(c *gin.Context) (*jwt.Token, error)
- func (mw *GinJWTMiddleware) ParseTokenString(token string) (*jwt.Token, error)
- func (mw *GinJWTMiddleware) RefreshHandler(c *gin.Context)
- func (mw *GinJWTMiddleware) RefreshToken(c *gin.Context) (string, time.Time, error)
- func (mw *GinJWTMiddleware) TokenGenerator(data any) (string, time.Time, error)
- func (mw *GinJWTMiddleware) ValidateToken(token string) (MapClaims, error)
- type LoggerConfig
- type LoginForm
- type MapClaims
- type Response
- type SignatureValidationRequest
- type SignatureValidationResponse
Constants ¶
const ( ClaimAccountID = "id" ClaimEmail = "email" ClaimIssuer = "iss" ClaimAudience = "aud" ClaimAudienceKeyID = "akid" ClaimEncryptedAudienceSecret = "eas" ClaimLegacySecret = "secret" )
const ( UserIDKey = "userID" ClientSecretKey = "clientSecret" ContextLoggerKey = "logger" )
const ( StatusOK = "ok" StatusError = "error" StatusFailed = "failed" )
Variables ¶
var ( // ErrMissingSecretKey indicates Secret key is required ErrMissingSecretKey = errors.New("secret key is required") // ErrForbidden when HTTP status 403 is given ErrForbidden = errors.New("you don't have permission to access this resource") // ErrMissingAuthenticatorFunc indicates Authenticator is required ErrMissingAuthenticatorFunc = errors.New("ginJWTMiddleware.Authenticator func is undefined") // ErrMissingLoginValues indicates a user tried to authenticate without username or password ErrMissingLoginValues = errors.New("missing Username or Password") // ErrFailedAuthentication indicates authentication failed, could be faulty username or password ErrFailedAuthentication = errors.New("incorrect Username or Password") // ErrFailedTokenCreation indicates JWT Token failed to create, reason unknown ErrFailedTokenCreation = errors.New("failed to create JWT Token") // ErrExpiredToken indicates JWT token has expired. Can't refresh. ErrExpiredToken = errors.New("token is expired") // ErrEmptyAuthHeader can be thrown if authing with a HTTP header, the Auth header needs to be set ErrEmptyAuthHeader = errors.New("auth header is empty") // ErrMissingExpField missing exp field in token ErrMissingExpField = errors.New("missing exp field") // ErrWrongFormatOfExp field must be float64 format ErrWrongFormatOfExp = errors.New("exp must be float64 format") // ErrInvalidAuthHeader indicates auth header is invalid, could for example have the wrong Realm name ErrInvalidAuthHeader = errors.New("auth header is invalid") // ErrEmptyQueryToken can be thrown if authing with URL Query, the query token variable is empty ErrEmptyQueryToken = errors.New("query token is empty") // ErrEmptyCookieToken can be thrown if authing with a cookie, the token cookie is empty ErrEmptyCookieToken = errors.New("cookie token is empty") // ErrEmptyParamToken can be thrown if authing with parameter in path, the parameter in path is empty ErrEmptyParamToken = errors.New("parameter token is empty") // ErrInvalidSigningAlgorithm indicates signing algorithm is invalid, needs to be HS256, HS384, HS512, RS256, RS384 or RS512 ErrInvalidSigningAlgorithm = errors.New("invalid signing algorithm") // ErrNoPrivKeyFile indicates that the given private key is unreadable ErrNoPrivKeyFile = errors.New("private key file unreadable") // ErrNoPubKeyFile indicates that the given public key is unreadable ErrNoPubKeyFile = errors.New("public key file unreadable") // ErrInvalidPrivKey indicates that the given private key is invalid ErrInvalidPrivKey = errors.New("private key invalid") // ErrInvalidPubKey indicates the the given public key is invalid ErrInvalidPubKey = errors.New("public key invalid") // IdentityKey default identity key IdentityKey = "identity" )
var ( ErrFailedToDecodeClientSecret = errors.New("failed to decode client secret") ErrFailedToDecryptClientSecret = errors.New("failed to decrypt client secret") )
var (
ErrBadConfiguration = errors.New("bad configuration")
)
Functions ¶
func AbortWithError ¶
func AccessKeyMiddleware ¶
func AccessKeyMiddleware(accessKeyStorage AccessKeyPersister, next gin.HandlerFunc) gin.HandlerFunc
func AuthenticationHandler ¶
func AuthorisationHandler ¶
func ContextLoggerHandler ¶
func DelegatedAccessKeyMiddleware ¶
func DelegatedAccessKeyMiddleware(validatorURL string, next gin.HandlerFunc) (gin.HandlerFunc, error)
DelegatedAccessKeyMiddleware call an external signature validation service to confirm if the signature is valid. This is useful when a service doesn't have access to identity backend.
func ExtractSecret ¶
func GetSimpleStatusHandler ¶
GetSimpleStatusHandler godoc @Summary Get service health status @Description Get service health status. @Tags Monitoring @ID get-status @Produce json @Success 200 {object} object @Router /status [get]
func IdentityHandler ¶
func JSON ¶
JSON is a replacement for gin.Context.JSON. It uses the JSON wrapper defined in jsonw instead of the standard encoding.json, and also uses streaming.
func NewAdminAuthenticationHandler ¶
func NewAdminAuthenticationHandler(cfg *koanf.Koanf, name string, resolver cmdbase.ParameterResolver) (gin.HandlerFunc, error)
func NewStaticAPIKeyAuthenticationHandler ¶
func NewStaticAPIKeyAuthenticationHandler(ctx context.Context, cfg *koanf.Koanf, key string, mainAuthFunc gin.HandlerFunc, resolver cmdbase.ParameterResolver, identityBackend storage.IdentityBackend) (gin.HandlerFunc, error)
func ParseResponseMessage ¶
func SetRequestLogger ¶
func SetRequestLogger(config ...LoggerConfig) gin.HandlerFunc
SetRequestLogger initializes the logging middleware. This implementation was borrowed from github.com/gin-contrib/logger.
Types ¶
type AccessKeyPersister ¶
type AccountBackend ¶
type GinJWTMiddleware ¶
type GinJWTMiddleware struct { // Realm name to display to the user. Required. Realm string //Identifies principal that issued the JWT Issuer string // signing algorithm - possible values are HS256, HS384, HS512, RS256, RS384 or RS512 // Optional, default is HS256. SigningAlgorithm string // Secret key used for signing. Required. Key []byte // Duration that a jwt token is valid. Optional, defaults to one hour. Timeout time.Duration // This field allows clients to refresh their token until MaxRefresh has passed. // Note that clients can refresh their token in the last moment of MaxRefresh. // This means that the maximum validity timespan for a token is TokenTime + MaxRefresh. // Optional, defaults to 0 meaning not refreshable. MaxRefresh time.Duration // Callback function that should perform the authentication of the user based on login info. // Must return user data as user identifier, it will be stored in Claim Array. Required. // Check error (e) to determine the appropriate error message. Authenticator func(c *gin.Context) (any, error) // Callback function that should perform the authorization of the authenticated user. Called // only after an authentication success. Must return true on success, false on failure. // Optional, default to success. Authorizator func(data any, c *gin.Context) bool // Callback function that will be called during login. // Using this function it is possible to add additional payload data to the webtoken. // The data is then made available during requests via c.Get("JWT_PAYLOAD"). // Note that the payload is not encrypted. // The attributes mentioned on jwt.io can't be used as keys for the map. // Optional, by default no additional data will be set. PayloadFunc func(data any) MapClaims Unauthorized func(*gin.Context, int, string) // User can define own LoginResponse func. LoginResponse func(*gin.Context, int, string, time.Time) // User can define own LogoutResponse func. LogoutResponse func(*gin.Context, int) // User can define own RefreshResponse func. RefreshResponse func(*gin.Context, int, string, time.Time) // Set the identity handler function IdentityHandler func(*gin.Context) any // Set the identity key IdentityKey string // TokenLookup is a string in the form of "<source>:<name>" that is used // to extract token from the request. // Optional. Default value "header:Authorization". // Possible values: // - "header:<name>" // - "query:<name>" // - "cookie:<name>" TokenLookup string // TokenHeadName is a string in the header. Default value is "Bearer" TokenHeadName string // TimeFunc provides the current time. You can override it to use another time value. This is useful for testing or if your server uses a different time zone than your tokens. TimeFunc func() time.Time // HTTP Status messages for when something in the JWT middleware fails. // Check error (e) to determine the appropriate error message. HTTPStatusMessageFunc func(e error, c *gin.Context) string // Private key file for asymmetric algorithms PrivKeyFile string // Public key file for asymmetric algorithms PubKeyFile string // Optionally return the token as a cookie SendCookie bool // Duration that a cookie is valid. Optional, by default equals to Timeout value. CookieMaxAge time.Duration // Allow insecure cookies for development over http SecureCookie bool // Allow cookies to be accessed client side for development CookieHTTPOnly bool // Allow cookie domain change for development CookieDomain string // SendAuthorization allow return authorization header for every request SendAuthorization bool // Disable abort() of context. DisabledAbort bool // CookieName allow cookie name change for development CookieName string // CookieSameSite allow use http.SameSite cookie param CookieSameSite http.SameSite // contains filtered or unexported fields }
GinJWTMiddleware provides a Json-Web-Token authentication implementation. On failure, a 401 HTTP response is returned. On success, the wrapped middleware is called, and the userID is made available as c.Get("userID").(string). Users can get a token by posting a json request to LoginHandler. The token then needs to be passed in the Authentication header. Example: Authorization:Bearer XXX_TOKEN_XXX
func New ¶
func New(m *GinJWTMiddleware) (*GinJWTMiddleware, error)
New for check error with GinJWTMiddleware
func (*GinJWTMiddleware) CheckIfTokenExpire ¶
func (mw *GinJWTMiddleware) CheckIfTokenExpire(c *gin.Context) (jwt.MapClaims, error)
CheckIfTokenExpire check if token expire
func (*GinJWTMiddleware) GetClaimsFromJWT ¶
func (mw *GinJWTMiddleware) GetClaimsFromJWT(c *gin.Context) (MapClaims, error)
GetClaimsFromJWT get claims from JWT token
func (*GinJWTMiddleware) LoginHandler ¶
func (mw *GinJWTMiddleware) LoginHandler(c *gin.Context)
LoginHandler can be used by clients to get a jwt token. Payload needs to be json in the form of {"username": "USERNAME", "password": "PASSWORD"}. Reply will be of the form {"token": "TOKEN"}.
func (*GinJWTMiddleware) LogoutHandler ¶
func (mw *GinJWTMiddleware) LogoutHandler(c *gin.Context)
LogoutHandler can be used by clients to remove the jwt cookie (if set)
func (*GinJWTMiddleware) MiddlewareFunc ¶
func (mw *GinJWTMiddleware) MiddlewareFunc() gin.HandlerFunc
MiddlewareFunc makes GinJWTMiddleware implement the Middleware interface.
func (*GinJWTMiddleware) MiddlewareInit ¶
func (mw *GinJWTMiddleware) MiddlewareInit() error
MiddlewareInit initialize jwt configs.
func (*GinJWTMiddleware) ParseToken ¶
func (mw *GinJWTMiddleware) ParseToken(c *gin.Context) (*jwt.Token, error)
ParseToken parse jwt token from gin context
func (*GinJWTMiddleware) ParseTokenString ¶
func (mw *GinJWTMiddleware) ParseTokenString(token string) (*jwt.Token, error)
ParseTokenString parse jwt token string
func (*GinJWTMiddleware) RefreshHandler ¶
func (mw *GinJWTMiddleware) RefreshHandler(c *gin.Context)
RefreshHandler can be used to refresh a token. The token still needs to be valid on refresh. Shall be put under an endpoint that is using the GinJWTMiddleware. Reply will be of the form {"token": "TOKEN"}.
func (*GinJWTMiddleware) RefreshToken ¶
RefreshToken refresh token and check if token is expired
func (*GinJWTMiddleware) TokenGenerator ¶
TokenGenerator method that clients can use to get a jwt token.
func (*GinJWTMiddleware) ValidateToken ¶
func (mw *GinJWTMiddleware) ValidateToken(token string) (MapClaims, error)
ValidateToken can be used for non-standard authentication workflows, such as web socket based ones.
type LoggerConfig ¶
type LoginForm ¶
type LoginForm struct { Username string `form:"username" json:"username" binding:"required"` Password string `form:"password" json:"password" binding:"required"` Audience string `form:"audience" json:"audience"` AudiencePublicKey string `form:"audienceKey" json:"audienceKey"` }
LoginForm form structure.
type MapClaims ¶
MapClaims type that uses the map[string]any for JSON decoding This is the default claims type if you don't supply one
func ExtractClaims ¶
ExtractClaims help to extract the JWT claims
func ExtractClaimsFromToken ¶
func ExtractClaimsFromToken(token *jwt.Token) MapClaims
ExtractClaimsFromToken help to extract the JWT claims from token
type SignatureValidationResponse ¶
type SignatureValidationResponse struct {
Account string `json:"acct"`
}