Documentation
¶
Index ¶
- Constants
- Variables
- type AdditionalContext
- type AttemptTracker
- type AttemptTrackerRedis
- func (s *AttemptTrackerRedis) GetFailedAttempts(ctx context.Context, kind Kind, target string) (int, error)
- func (s *AttemptTrackerRedis) IncrementFailedAttempts(ctx context.Context, kind Kind, target string) (int, error)
- func (s *AttemptTrackerRedis) ResetFailedAttempts(ctx context.Context, kind Kind, target string) error
- type Code
- type CodeStore
- type CodeStoreRedis
- func (s *CodeStoreRedis) Create(ctx context.Context, purpose Purpose, code *Code) error
- func (s *CodeStoreRedis) Delete(ctx context.Context, purpose Purpose, target string) error
- func (s *CodeStoreRedis) Get(ctx context.Context, purpose Purpose, target string) (*Code, error)
- func (s *CodeStoreRedis) Update(ctx context.Context, purpose Purpose, code *Code) error
- type DeprecatedKindFactory
- type EndpointsProvider
- type Form
- type FraudProtectionService
- type GenerateOptions
- type Kind
- func KindForgotPasswordLink(config *config.AppConfig, channel model.AuthenticatorOOBChannel) Kind
- func KindForgotPasswordOTP(config *config.AppConfig, channel model.AuthenticatorOOBChannel) Kind
- func KindOOBOTPCode(config *config.AppConfig, channel model.AuthenticatorOOBChannel) Kind
- func KindOOBOTPLink(config *config.AppConfig, channel model.AuthenticatorOOBChannel) Kind
- func KindOOBOTPWithForm(config *config.AppConfig, channel model.AuthenticatorOOBChannel, form Form) Kind
- func KindVerification(config *config.AppConfig, channel model.AuthenticatorOOBChannel) Kind
- type LookupStore
- type LookupStoreRedis
- func (s *LookupStoreRedis) Create(ctx context.Context, purpose Purpose, code string, target string, ...) error
- func (s *LookupStoreRedis) Delete(ctx context.Context, purpose Purpose, code string) error
- func (s *LookupStoreRedis) Get(ctx context.Context, purpose Purpose, code string) (target string, err error)
- type MessageSender
- type OTPDeliveryStatusInternal
- type Purpose
- type RateLimiter
- type SendOptions
- type Sender
- type SenderCodeStore
- type Service
- func (s *Service) ConsumeCode(ctx context.Context, purpose Purpose, target string) error
- func (s *Service) GenerateOTP(ctx context.Context, kind Kind, target string, form Form, ...) (string, error)
- func (s *Service) InspectCode(ctx context.Context, purpose Purpose, target string) (*Code, error)
- func (s *Service) InspectState(ctx context.Context, kind Kind, target string) (*State, error)
- func (s *Service) LookupCode(ctx context.Context, purpose Purpose, code string) (target string, err error)
- func (s *Service) SetSubmittedCode(ctx context.Context, kind Kind, target string, code string) (*State, error)
- func (s *Service) VerifyOTP(ctx context.Context, kind Kind, target string, otp string, opts *VerifyOptions) error
- type State
- type TranslationService
- type VerifyOptions
- type WhatsappService
Constants ¶
View Source
const (
WhatsappCodeDuration = duration.UserInteraction
)
Variables ¶
View Source
var DependencySet = wire.NewSet( wire.Struct(new(Service), "*"), wire.Struct(new(MessageSender), "*"), wire.Struct(new(CodeStoreRedis), "*"), wire.Struct(new(LookupStoreRedis), "*"), wire.Struct(new(AttemptTrackerRedis), "*"), wire.Bind(new(CodeStore), new(*CodeStoreRedis)), wire.Bind(new(SenderCodeStore), new(*CodeStoreRedis)), wire.Bind(new(LookupStore), new(*LookupStoreRedis)), wire.Bind(new(AttemptTracker), new(*AttemptTrackerRedis)), )
View Source
var ErrCodeNotFound = InvalidOTPCode.NewWithCause("otp code is expired or invalid", apierrors.StringCause("CodeNotFound"))
View Source
var ErrConsumedCode = InvalidOTPCode.NewWithCause("used otp code", apierrors.StringCause("UsedCode"))
View Source
var ErrInvalidCode = InvalidOTPCode.NewWithCause("invalid otp code", apierrors.StringCause("InvalidCode"))
View Source
var ErrOTPDeliveryUnexpectedError = apierrors.InternalError.
WithReason("OTPDeliveryUnexpectedError").
New("unexpected error occurs on sending the message")
View Source
var ErrTooManyAttempts = ratelimit.RateLimited.NewWithInfo("too many verify OTP attempts", apierrors.Details{
"bucket_name": "TrackFailedOTPAttemptBucket",
})
FIXME: backward compat; should not use RateLimited
View Source
var FromAdminAPIQueryKey = "x_from_admin_api"
View Source
var InvalidOTPCode = apierrors.Forbidden.WithReason("InvalidOTPCode")
View Source
var SenderLogger = slogutil.NewLogger("otp-sender")
View Source
var ServiceLogger = slogutil.NewLogger("otp")
View Source
var UtilsLogger = slogutil.NewLogger("otp-utils")
Functions ¶
This section is empty.
Types ¶
type AdditionalContext ¶
type AdditionalContext struct {
HasPassword bool
}
type AttemptTracker ¶
type AttemptTrackerRedis ¶
func (*AttemptTrackerRedis) GetFailedAttempts ¶
func (*AttemptTrackerRedis) IncrementFailedAttempts ¶
func (*AttemptTrackerRedis) ResetFailedAttempts ¶
type Code ¶
type Code struct {
Target string `json:"target"`
Purpose Purpose `json:"purpose"`
Form Form `json:"form"`
Code string `json:"code"`
ExpireAt time.Time `json:"expire_at"`
Consumed bool `json:"consumed"`
UserInputtedCode string `json:"user_inputted_code,omitempty"`
UserID string `json:"user_id,omitempty"`
// For interaction
WebSessionID string `json:"web_session_id,omitempty"`
// For legacy workflow
WorkflowID string `json:"workflow_id,omitempty"`
// For authentication flow
AuthenticationFlowWebsocketChannelName string `json:"authentication_flow_websocket_channel_name,omitempty"`
AuthenticationFlowType string `json:"authentication_flow_type,omitempty"`
AuthenticationFlowName string `json:"authentication_flow_name,omitempty"`
AuthenticationFlowJSONPointer jsonpointer.T `json:"authentication_flow_json_pointer,omitempty"`
// The message which carries the otp
OOBChannel model.AuthenticatorOOBChannel `json:"channel,omitzero"`
WhatsappMessageID string `json:"whatsapp_message_id,omitzero"`
SendMessageError *apierrors.APIError `json:"send_message_error"`
}
type CodeStoreRedis ¶
type DeprecatedKindFactory ¶
type DeprecatedKindFactory func(config *config.AppConfig, channel model.AuthenticatorOOBChannel) Kind
type EndpointsProvider ¶
type Form ¶
type Form string
func (Form) AllowLookupByCode ¶
func (Form) CodeLength ¶
func (Form) GenerateCode ¶
func (f Form) GenerateCode(cfg *config.TestModeConfig, featureCfg *config.TestModeFeatureConfig, target string, userID string) string
type FraudProtectionService ¶
type GenerateOptions ¶
type Kind ¶
type Kind interface {
Purpose() Purpose
ValidPeriod() time.Duration
RateLimitTrigger(
featureConfig *config.FeatureConfig,
envConfig *config.RateLimitsEnvironmentConfig,
ip string, userID string,
) []*ratelimit.BucketSpec
RateLimitValidate(
featureConfig *config.FeatureConfig,
envConfig *config.RateLimitsEnvironmentConfig,
ip string, userID string,
) []*ratelimit.BucketSpec
RateLimitTriggerCooldown(target string) ratelimit.BucketSpec
RevocationMaxFailedAttempts() int
}
func KindForgotPasswordLink ¶
func KindForgotPasswordLink( config *config.AppConfig, channel model.AuthenticatorOOBChannel) Kind
func KindForgotPasswordOTP ¶
func KindForgotPasswordOTP( config *config.AppConfig, channel model.AuthenticatorOOBChannel) Kind
func KindOOBOTPCode ¶
func KindOOBOTPCode(config *config.AppConfig, channel model.AuthenticatorOOBChannel) Kind
func KindOOBOTPLink ¶
func KindOOBOTPLink(config *config.AppConfig, channel model.AuthenticatorOOBChannel) Kind
func KindOOBOTPWithForm ¶
func KindVerification ¶
func KindVerification(config *config.AppConfig, channel model.AuthenticatorOOBChannel) Kind
type LookupStore ¶
type MessageSender ¶
type MessageSender struct {
AppID config.AppID
Translation TranslationService
Endpoints EndpointsProvider
Sender Sender
CodeStore SenderCodeStore
WhatsappConfig *config.WhatsappConfig
}
func (*MessageSender) Send ¶
func (s *MessageSender) Send(ctx context.Context, opts SendOptions) error
func (*MessageSender) SendAsync ¶
func (s *MessageSender) SendAsync(ctx context.Context, opts SendOptions) error
type OTPDeliveryStatusInternal ¶
type OTPDeliveryStatusInternal string
const ( OTPDeliveryStatusInternalPending OTPDeliveryStatusInternal = "pending" OTPDeliveryStatusInternalSending OTPDeliveryStatusInternal = "sending" OTPDeliveryStatusInternalFailed OTPDeliveryStatusInternal = "failed" OTPDeliveryStatusInternalSent OTPDeliveryStatusInternal = "sent" )
func (OTPDeliveryStatusInternal) ToAPIStatus ¶
func (s OTPDeliveryStatusInternal) ToAPIStatus() model.OTPDeliveryStatus
type Purpose ¶
type Purpose string
const PurposeForgotPassword Purpose = "forgot-password"
const PurposeOOBOTP Purpose = "oob-otp"
const PurposeVerification Purpose = "verification"
type RateLimiter ¶
type RateLimiter interface {
GetTimeToAct(ctx context.Context, spec ratelimit.BucketSpec) (*time.Time, error)
Allow(ctx context.Context, spec ratelimit.BucketSpec) (*ratelimit.FailedReservation, error)
Reserve(ctx context.Context, spec ratelimit.BucketSpec) (*ratelimit.Reservation, *ratelimit.FailedReservation, error)
Cancel(ctx context.Context, r *ratelimit.Reservation)
}
type SendOptions ¶
type SendOptions struct {
Channel model.AuthenticatorOOBChannel
Target string
Form Form
Type translation.MessageType
Kind Kind
OTP string
AdditionalContext *AdditionalContext
IsAdminAPIResetPassword bool
}
type Sender ¶
type Sender interface {
SendEmailInNewGoroutine(ctx context.Context, msgType translation.MessageType, opts *mail.SendOptions) error
SendSMSImmediately(ctx context.Context, msgType translation.MessageType, opts *sms.SendOptions) error
SendSMSInNewGoroutine(ctx context.Context, msgType translation.MessageType, opts *sms.SendOptions) error
SendWhatsappInNewGoroutine(ctx context.Context, msgType translation.MessageType, opts *whatsapp.SendAuthenticationOTPOptions, resultCallback messaging.SendWhatsappResultCallback, errCalllback messaging.SendWhatsappErrorCallback) error
}
type SenderCodeStore ¶
type Service ¶
type Service struct {
Clock clock.Clock
AppID config.AppID
TestModeConfig *config.TestModeConfig
TestModeFeatureConfig *config.TestModeFeatureConfig
RemoteIP httputil.RemoteIP
CodeStore CodeStore
LookupStore LookupStore
AttemptTracker AttemptTracker
RateLimiter RateLimiter
WhatsappService WhatsappService
FraudProtection FraudProtectionService
FeatureConfig *config.FeatureConfig
EnvConfig *config.RateLimitsEnvironmentConfig
}
func (*Service) ConsumeCode ¶
func (*Service) GenerateOTP ¶
func (*Service) InspectCode ¶
func (*Service) InspectState ¶
func (*Service) LookupCode ¶
func (*Service) SetSubmittedCode ¶
type State ¶
type State struct {
Target string
CanResendAt time.Time
CanCheckSubmittedCode bool
UserID string
TooManyAttempts bool
WebSessionID string
WorkflowID string
AuthenticationFlowWebsocketChannelName string
AuthenticationFlowType string
AuthenticationFlowName string
AuthenticationFlowJSONPointer jsonpointer.T
DeliveryStatus model.OTPDeliveryStatus
DeliveryError *apierrors.APIError
}
type TranslationService ¶
type TranslationService interface {
EmailMessageData(ctx context.Context, msg *translation.MessageSpec, variables *translation.PartialTemplateVariables) (*translation.EmailMessageData, error)
SMSMessageData(ctx context.Context, msg *translation.MessageSpec, variables *translation.PartialTemplateVariables) (*translation.SMSMessageData, error)
WhatsappMessageData(ctx context.Context, language string, msg *translation.MessageSpec, variables *translation.PartialTemplateVariables) (*translation.WhatsappMessageData, error)
}
type VerifyOptions ¶
type WhatsappService ¶
Click to show internal directories.
Click to hide internal directories.