Documentation
¶
Overview ¶
Package steranko provides embeddable user authentication and authorization for Go web applications, including password hashing, validation rules, and JWT-based session cookies.
Index ¶
- func JWTValidMethods() jwt.ParserOption
- func Middleware(factory Factory) echo.MiddlewareFunc
- type Config
- type Context
- type Factory
- type KeyService
- type NilSigninService
- type Option
- type PasswordHasher
- type PasswordRule
- type RequestPasswordResetResponse
- type RequestPasswordResetTransaction
- type SigninResponse
- type SigninService
- type SigninTransaction
- type Steranko
- func (s *Steranko) ApproveRequest(ctx echo.Context) error
- func (s *Steranko) ComparePassword(plaintext string, hashedValue string) (bool, bool)
- func (s *Steranko) Context(ctx echo.Context) *Context
- func (s *Steranko) CreateJWT(claims jwt.Claims) (string, error)
- func (s *Steranko) GetAuthorization(request *http.Request) (jwt.Claims, error)
- func (s *Steranko) Middleware(next echo.HandlerFunc) echo.HandlerFunc
- func (s *Steranko) PostPasswordToken(ctx echo.Context) error
- func (s *Steranko) PostPasswordUpdate(ctx echo.Context) error
- func (s *Steranko) SetCookie(ctx echo.Context, claims jwt.Claims) error
- func (s *Steranko) SetPassword(user User, plaintext string) error
- func (s *Steranko) SignOut(ctx echo.Context) bool
- func (s *Steranko) SigninFormPost(ctx echo.Context) (User, error)
- func (s *Steranko) SigninUser(ctx echo.Context, user User) error
- func (s *Steranko) ValidatePassword(plaintext string) error
- func (s *Steranko) WithOptions(options ...Option)
- type UpdatePasswordResponse
- type UpdatePasswordTransaction
- type User
- type UserService
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func JWTValidMethods ¶ added in v0.22.0
func JWTValidMethods() jwt.ParserOption
JWTValidMethods returns a jwt.ParserOption that restricts the JWT parser to only accept secure encryption methods defined in the golang-jwt package. https://pkg.go.dev/github.com/golang-jwt/jwt/v5@v5.2.1#WithValidMethods
func Middleware ¶ added in v0.4.2
func Middleware(factory Factory) echo.MiddlewareFunc
Middleware is a standalone middleware that works for multi-tenant environments, where you may need to use a factory to load the specific steranko settings depending on the domain being called.
Types ¶
type Config ¶
type Config struct {
PasswordSchema schema.Schema `json:"passwordSchema"` // JSON-encoded schema for password validation rules.
}
Config holds the file-loadable settings for a Steranko instance.
type Factory ¶ added in v0.4.2
type Factory interface {
// Steranko retrieves the correct instance to use
// for this domain or returns an error
Steranko(ctx echo.Context) (*Steranko, error)
}
Factory is used in multi-tenant environments to locate the steranko instance that will be used (based on the context)
type KeyService ¶ added in v0.3.0
type KeyService interface {
// GetCurrentKey returns the current JWT key in use by the server
GetCurrentKey() (string, any, error)
// FindKey returns the key associated with the given JWT token.
FindKey(*jwt.Token) (any, error)
}
KeyService is an interface that the calling application must implement in order to use Steranko. The KeyService manages the encryption keys that sign and verify JWT tokens.
type NilSigninService ¶ added in v0.24.0
type NilSigninService struct{}
NilSigninService is an empty implementation of SigninService that does nothing. It can be used as a default or placeholder implementation when no actual signin service is needed.
func (NilSigninService) IsSigninLocked ¶ added in v0.24.0
func (s NilSigninService) IsSigninLocked(request *http.Request, username string) bool
IsSigninLocked always reports that the account is not locked.
func (NilSigninService) SigninFailure ¶ added in v0.24.0
func (s NilSigninService) SigninFailure(request *http.Request, username string)
SigninFailure does nothing.
func (NilSigninService) SigninSuccess ¶ added in v0.24.0
func (s NilSigninService) SigninSuccess(request *http.Request, username string)
SigninSuccess does nothing.
type Option ¶ added in v0.16.0
type Option func(*Steranko)
Option is a functional option that configures a Steranko instance at construction time.
func WithConfigFile ¶ added in v0.16.0
WithConfigFile loads the values from a configuration file into this Steranko instance.
func WithPasswordHasher ¶ added in v0.16.0
func WithPasswordHasher(hashers ...PasswordHasher) Option
WithPasswordHasher sets the hashing algorithm(s) to use when setting/validating passwords. The first hasher in the list is used to create new passwords. All subsequent hashers are "deprecated" and will be upgraded to the primary algorithm the next time the user signs in.
func WithPasswordRules ¶ added in v0.16.0
func WithPasswordRules(passwordRules ...PasswordRule) Option
WithPasswordRules appends the provided password rules to the list used when setting new passwords.
func WithPasswordSchema ¶ added in v0.16.0
WithPasswordSchema sets the provided schema.Schema as the validation function when setting new passwords. Default is (minimum length: 8 characters)
func WithSigninService ¶ added in v0.24.0
func WithSigninService(service SigninService) Option
WithSigninService sets the SigninService to use when tracking signin successes and failures. This related to the "MaxSigninFailures" and "SigninLockoutMinutes" options, which lock out users after too many failed signin attempts.
type PasswordHasher ¶ added in v0.16.0
type PasswordHasher interface {
// ID returns a string that uniquely identifies this plugin.
ID() string
// HashPassword returns a hashed value that can be safely stored in a database.
HashPassword(plaintext string) (ciphertext string, err error)
// CompareHashedPassword checks that a plaintext password matches a stored ciphertext value.
// OK returns TRUE if the values match. Rehash returns TRUE if the hashing criteria has
// changed and the password should be re-hashed and stored in its place.
CompareHashedPassword(ciphertext string, plaintext string) (OK bool, Rehash bool)
}
PasswordHasher handles all encryption functions for passwords.
type PasswordRule ¶ added in v0.16.0
type PasswordRule interface {
// ID returns a string that uniquely identifies this plugin.
ID() string
// PasswordRuleDescription returns a human-readable string that explains how the password can be used.
PasswordRuleDescription() string
// ValidatePassword returns TRUE if the password can be used in this system. If not, it returns FALSE, and a message explaining why
ValidatePassword(password string) (OK bool, errorMessage string)
}
PasswordRule is used to verify if a password meets the password complexity criteria for this system.
type RequestPasswordResetResponse ¶ added in v0.2.0
type RequestPasswordResetResponse struct {
}
RequestPasswordResetResponse is the response returned after a password reset request.
type RequestPasswordResetTransaction ¶
type RequestPasswordResetTransaction struct {
Username string `json:"username" form:"username"` // public username of the person requesting the reset.
}
RequestPasswordResetTransaction is the request body for initiating a password reset.
type SigninResponse ¶ added in v0.2.0
SigninResponse includes all the information returned by Steranko after a signin request.
type SigninService ¶ added in v0.24.0
type SigninService interface {
// SigninSuccess reports a successful signin to the database.
// This method SHOULD reset the signin failure count for the user.
SigninSuccess(request *http.Request, username string)
// SigninFailure reports a failed signin to the database.
// This method SHOULD increment the signin failure count for the user.
SigninFailure(request *http.Request, username string)
// IsSigninLocked returns TRUE if the user is currently locked out due to too many signin failures.
IsSigninLocked(request *http.Request, username string) bool
}
SigninService wraps all of the functions that must be provided to Steranko by your application.
type SigninTransaction ¶
type SigninTransaction struct {
Username string `json:"username" form:"username"` // public username for this person
Password string `json:"password" form:"password"` // private (hashed?) password for this person
TwoFactorCode string `json:"twoFactorCode" form:"twoFactorCode"` // [Optional] 2FA code to send to the 2FA plugin
}
SigninTransaction includes all of the information that MUST be posted to Sterenko in order to sign in to the system.
type Steranko ¶
type Steranko struct {
// contains filtered or unexported fields
}
Steranko contains all required configuration information for this library.
func New ¶
func New(userService UserService, keyService KeyService, options ...Option) *Steranko
New returns a fully initialized Steranko instance, with HandlerFuncs that support all of your user authentication and authorization needs.
func (*Steranko) ApproveRequest ¶ added in v0.4.2
ApproveRequest will (in the future) apply filtering rules to requests and block any that should not be allowed.
func (*Steranko) ComparePassword ¶ added in v0.16.0
ComparePassword tries to validate the plaintext password and hashedValue using each of the password hashers in sequence. If the password matches THE PRIMARY hasher, then this returns TRUE, FALSE. If the password matches any of THE BACKUP hashers, then this returns TRUE, TRUE. If the password does not match any of the hashers then this returns FALSE, FALSE.
func (*Steranko) Context ¶ added in v0.22.1
Context returns a new steranko.Context that wraps the provided echo.Context and embeds this Steranko instance.
func (*Steranko) CreateJWT ¶ added in v0.16.0
CreateJWT generates a new JWT token using the specified claims. Steranko writes this JWT token using the HS512 signing method, and the signing key that is generated by the embedded KeyService.
func (*Steranko) GetAuthorization ¶ added in v0.16.0
GetAuthorization retrieves the JWT token claims from the request.
func (*Steranko) Middleware ¶ added in v0.3.0
func (s *Steranko) Middleware(next echo.HandlerFunc) echo.HandlerFunc
Middleware wraps the original echo context with the Steranko context.
func (*Steranko) PostPasswordToken ¶
PostPasswordToken implements the http.HandlerFunc signature, and should be wired in to your REST API to allow users to tell the server that they forgot their password. This should initiate some way for the system to send them a one time token to create a new password.
func (*Steranko) PostPasswordUpdate ¶
PostPasswordUpdate implements the http.HandlerFunc signature, and should be wired in to your REST API to allow users to update their passwords.
func (*Steranko) SetCookie ¶ added in v0.22.0
SetCookie writes a Cookie / JWT token to the User's browser using the provided claims.
func (*Steranko) SetPassword ¶ added in v0.17.0
SetPassword hashes the provided plaintext password and sets it on the User.
func (*Steranko) SignOut ¶ added in v0.3.2
SignOut implements the echo.HandlerFunc, and can be used directly in your REST API, or can be wrapped by your own custom function. It returns TRUE if the user had a backup cookie that has been restored, and FALSE if the user is now completely signed out.
func (*Steranko) SigninFormPost ¶ added in v0.22.0
SigninFormPost reads the data from a form post and signs in the user using their username/password. If the signin is successful it automatically sets the "Authorization" cookie in the user's browser. If unsuccessful, an error is returned to the caller.
func (*Steranko) SigninUser ¶ added in v0.22.0
SigninUser writes a cookie to the User's browser that signs them into the server.
func (*Steranko) ValidatePassword ¶
ValidatePassword checks a password against all system requirements
func (*Steranko) WithOptions ¶ added in v0.16.0
WithOptions applies the provided Option functions to this Steranko instance.
This mutates the instance without synchronization and is therefore NOT safe to call concurrently with request handling. Apply all options during construction (via New, or immediately after) before the Steranko is shared across goroutines.
type UpdatePasswordResponse ¶ added in v0.2.0
type UpdatePasswordResponse struct {
}
UpdatePasswordResponse is the response returned after a password update.
type UpdatePasswordTransaction ¶
type UpdatePasswordTransaction struct {
Username string `json:"username" form:"username"`
OldPassword string `json:"oldPassword" form:"oldPassword"`
NewPassword string `json:"newPassword" form:"newPassword"`
}
UpdatePasswordTransaction is the request body for changing a user's password.
type User ¶
type User interface {
GetUsername() string // Returns the username of the User
GetPassword() string // Returns the password of the User
SetUsername(username string) // Sets the username of the User
SetPassword(ciphertext string) // Sets the password of the User
}
User interface wraps all of the functions that Steranko needs to authorize a user of the system. This is done so that Steranko can be retrofitted on to your existing data objects. Just implement this interface, and a CRUD service, and you're all set.
type UserService ¶
type UserService interface {
// New creates a newly initialized User that is ready to use
New() User
// Load retrieves a single User from the database
Load(username string, user User) error
// Save inserts/updates a single User in the database
Save(user User, comment string) error
// Delete removes a single User from the database
Delete(user User, comment string) error
// RequestPasswordReset handles the application-specific details of
// delivering a password reset message to the user.
RequestPasswordReset(user User) error
// NewClaims generates an empty jwt.Claims object.
NewClaims() jwt.Claims
// Claims generates a jwt.Claims object for the given user.
Claims(user User) (jwt.Claims, error)
// Close cleans up any connections opened by the service.
Close()
}
UserService wraps all of the functions that must be provided to Steranko by your application.
Source Files
¶
- config.go
- context.go
- factory.go
- keyService.go
- middleware.go
- option.go
- passwordHasher.go
- passwordRule.go
- requests.go
- signService.go
- steranko_.go
- steranko_middleware.go
- steranko_postPasswordToken.go
- steranko_postPasswordUpdate.go
- steranko_signin.go
- steranko_signout.go
- steranko_utils.go
- tools.go
- transactions.go
- user.go
- userService.go
Directories
¶
| Path | Synopsis |
|---|---|
|
plugin
|
|
|
hash
Package hash provides password hashing algorithm plugins for Steranko.
|
Package hash provides password hashing algorithm plugins for Steranko. |
|
haveibeenpwned
Package haveibeenpwned provides a Steranko password rule that rejects passwords found in known data breaches, via the HaveIBeenPwned.com API.
|
Package haveibeenpwned provides a Steranko password rule that rejects passwords found in known data breaches, via the HaveIBeenPwned.com API. |
|
rule
Package rule provides password-complexity validation plugins for Steranko.
|
Package rule provides password-complexity validation plugins for Steranko. |